作者:潘吉祥


kubernetes架构设计

kubernetes主要由以下几个核心组件构成(了解即可):

  • Cluster:Cluster是一个抽象的集合概念,包括计算、存储和网络资源。具体来说Kubernetes Cluster由Master和Worker组成,各个worker节点上运行着若干Kubernetes服务

  • Master:master相当于整个kubernetes集群的大脑,依靠一些运行的服务进行kubernetes的任务调度工作:

  • ApiServer:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;

  • ControllerManager:负责维护集群状态,比如故障检测、自动扩展、滚动更新等;

  • Scheduler:负责资源的调度,按照调度策略(预定和择优)将Pod调度到相应的机器上;

  • etcd:用于保存整个集群的状态信息;

  • Worker:除了Master,Kubernetes集群中的其它机器被称为worker节点。Node职责是运行容器应用,worker由Master管理,并负责监控并汇报容器的状态,同时根据Master的要求管理容器的生命周期。

  • Kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;

  • Proxy:负责为Service提供cluster内部的服务发现和负载均衡;

具体的流程:

客户端通过kubectl对api-server发起资源操作请求,api-server通过schedule具体找到某个worker node进行资源调度操作,然后由api-server将具体的调度信息记录到etcd。controller-manager间隔检测整个集群的状态,及时调整,并将信息通过api-server上报etcd。

kubernetes核心概念(重点理解)

结合配置文件来理解:

apiVersion: v1
kind: ReplicationController 
metadata:
  name: tomcat 
spec:             
  replicas: 2 
  selector:      
    app: tomcat 
  template:      
    metadata:
      labels:
        app: tomcat
    spec:         
      containers:
        - name: tomcat
      image: tomcat:8
      ports:
          - containerPort:  8080

Pod:Pod是Kubernetes的最小单元,每一个Pod可以包含一个或多个容器,Pod的容器会作为一个整体被Master调度到一个worker上运行。每个Pod都有唯一的IP地址,称为PodIP,一个Pod里的多个容器共享PodIP地址。(但是我们通常不会直接创建pod,而是通过RC或者deployment的方式。)

pause容器:如图示,每个pod中都包含一个根容器pause,它保存了该pod中所有容器的状态,并管理所有的容器。

用户容器:一个pod中可以有多个用户容器。

Replication Controller:用于规定pod的创建,当提交一个RC到Kubernetes集群中以后,Master节点上的Controller Manager组件就得到通知,定期检查系统中存活的Pod,并确保目标Pod实例的数量刚好等于RC的预期值,并根据实际情况扩缩数量。

根据rc的功能,它的配置往往包含以下:

Pod期待的副本数(replicas)

用于选择特定Pod的Label Selector

当Pod的副本数量小于预期数量时,用于创建新Pod的模板(template)

Replica Set:跟 ReplicationController 没有本质的不同,只是命名区别,此外ReplicaSet 支持集合式的selector(ReplicationController 仅支持等式)。

Deployment:Deployment是Kubenetes v1.2引入的新概念,目的是为了更好的解决Pod的编排问题,Deployment内部使用了ReplicaSet来实现,用于取代旧版的RC。

*当进行版本升级操作的时候,deployment会通过RS复制原来的pod,并将镜像版本替换为新版本,操作成功之后,删除旧版本的pod组,并完全指向新版本的pod组。

Lable:Label是一个key=value的键值对,其中key与value由用户自己指定。Label可以附加到各种资源对象上,如Node、Pod、Service、RC,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上。

*Label的最常见的用法是使用metadata.labels字段,来为对象添加Label,通过spec.selector来引用对象。

Service:Service定义了外界访问一组特定Pod的方式,Service有自己的IP和端口,Service为Pod提供了负载均衡。它也是Kubernetes最核心的资源对象之一,每个Service其实就是我们经常提起的微服务架构中的一个"微服务"。

apiVersion: v1
kind: Service
metadata:
name: mywebAppService
spec:
ports:
- port: 8081
targetPort: 8080
selector:
app: mywebapp

一个service可以通过标签来绑定多个pod,然后通过clusterip统一让外界访问,从而避免直接使用pod自身不稳定的ip和端口。

Horizontal Pod Autoscaler:Horizontal Pod Autoscal(Pod横向扩容简称HPA)与RC、Deployment一样,也属于一种Kubernetes资源对象。用于实现kubernetes自动模式的pod扩容和缩容(手动扩容可以通过命令向集群提交deployment修改)。

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: xxxx
spec:
scaleTargetRef:
apiVersion: app/v1beta1
kind: Deployment
name: deployment metaname
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50

Volume: 作用与docker中的大同小异,是Pod中能够被多个容器访问的共享目录,它定义在Pod上,它被一个Pod中的多个容器挂载到具体的文件目录下。Volume与Pod的生命周期相同,但与容器的生命周期不相关,当容器终止或重启时,Volume中的数据也不会丢失。

apiVersion: v1
kind: Pod
metadata:
name: 
spec:
containers:
- image: 
name: 
# 指定在容器中挂接路径
volumeMounts:
- mountPath: /xxx
name: xxx
# 指定所提供的存储卷
volumes:
- name: test-volume
# 宿主机上的目录(可以根据具体需求使用不同的volume类型,而不仅仅是hostpath)
hostPath:
# directory location on host
path: /data

总结

关于kubernetes的架构了解即可,重点结合配置文件理解核心概念,尤其是Pod、ReplicationController、Deployment和Service。

kubernetes架构及核心概念就到这里,限于篇幅,读者可在此基础上查看更加全面的文档,虽然这些概念比较无聊,但还是需要去熟悉,为后面的学习打下基础。

下期我们将进入kubernetes实战操作环节,包括pod、controller、service的操作,正真体验kubernetes的神奇之力!关注不迷路哈!



【推荐阅读】

HashMap 夺命二十一问!

强烈推荐 16 款 IDEA 插件,让你的开发速度飞起来!
阿里云发布 Spring Boot 新脚手架,真香
你还在使用 try-catch-finally 关闭资源?
饿了么4年 + 阿里2年:研发路上的一些总结与思考
代码对比工具,我就用这5个
飞机上一般是什么操作系统?
面试官:为什么 HashMap 的加载因子是0.75?

Logo

开源、云原生的融合云平台

更多推荐