docker回顾

从前三回中,我一步步剖析了linux容器的具体实现方式。一个容器,实际上是一个由linux namespace、linux cgroups 和 rootfs三种技术构建出来的进程的隔离环境。

从上我们可以看出,一个正在运行的linux容器可以从两方面看待:

  • - rootfs,容器镜像,是容器的静态视图;
  • - namespace+cgroups,构成隔离环境,称为容器运行时。

开发者的需求

真正承载容器信息进行传递的,是容器镜像,而不是容器运行时。由此看出,docker容器必定走上容器编排之路。云服务商或者基础设施提供商将用户提供的镜像以容器的方式运行起来,然后向镜像制作者和使用者追溯,各个服务节点如ci/cd、监控、安全、网络、存储等,都是容器生态圈上的一个承载点。

当今容器编排工具

- compose+swarm:docker公司提供
- kubernetes:google与redhat公司主导

kubernetes由来

compose+swarm容器编排工具诞生应用,google为首的公司想要压制docker公司,将google的基础设施栈中borg改动开源,变成kubernetes

kubernetes要解决什么问题?

在不同的发展阶段,kubernetes需要着重解决的问题也是不同的,但是一切技术都是从用户需求出发,即将应用的容器镜像部署在一个给定的集群上并运行。

kubernetes要解决的主要问题是:大规模集群任务之间各种各样的复杂关系。

kubernetes项目架构

master节点:控制节点

kube-apiserver:负责API服务
kube-scheduler:负责调度
kube-controller-manager:负责容器编排
整个集群的持久化数据:kube-apiserver处理后保存咋etcd中。

node节点:计算节点

kubelet组件:负责同容器运行时打交道。
    使用CRI(container runtime interface):远程调用接口,这个接口定义了容器运行时的各项核心操作,比如:启动一个容器需要的所有参数。

只要容器运行时能够运行容器的容器镜像,它就可以通过CRI接入kubernetes项目中。

OCI:容器运行时规范通底层的linux操作系统进行交互,把CRI请求翻译成对linux操作系统的调用(操作linux namespace和cgroup等)
CNI:网络插件
CSI:存储插件

kubelet就是kubernetes对容器管理能力的一个组件

kubernetes设计思想

从更大的角度,以统一的方式来定义任务之间的各种关系,并且为将来支持更多类的关系留有余地。

在kubernetes项目中,容器被划分为一个pod,pod里的容器共享同一个network namespace、同一组数据卷,从而达到高效交换信息的目的。给pod绑定一个service服务,而service服务的ip地址是终生不变的,这个service的主要作用:作为pod代理入口,代替pod对外暴露一个固定的网络地址

如果现在两个不同pod之间不仅有访问关系,还要求在发起访问时加上授权信息。如web应用访问数据库时需要用户名和密码,怎么实现呢?

kubernetes项目提供了一种叫做secret的对象,它其实是一个保存在etcd里的键值对数据。这样,你把credential信息以secret方式存在etcd里,当指定的pod启动时,secret里的数据就会自动以volume的方式关在到容器里,这个web应用就可以访问数据库了。

这种使用方法,就是声明式API,这种API对应的编排对象和服务对象,就是kubernetes项目中的API对象。

kubernetes如何启动一个容器化任务?

例如: 我现在已经只做好了一个nginx容器镜像,让平台启动镜像,并创建两个完全相同的nginx副本,以负载均衡的方式共同对外提供服务。

vim nginx-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2   #俩副本
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9
            ports:
            - containerPort: 80
kubectl create -f nginx-deployment.yaml

这样,两个完全相同的nginx容器副本就被启动了

总结

kubernetes项目,是按照用户意愿和整个系统的规则,完全自动化处理好容器之间的各种关系。这种功能,被称作编排。它的本质,就是为用户提供一个具有普遍意义的容器编排工具,提供一套基于容器构建分布式系统的基础依赖。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐