一、Kubernetes核心组件

1. 核心组件概述

Kubernetes主要由以下几个核心组件组成:

59a2fbc05992603e14ee55caea2c96a0.png
  • etcd 保存了整个集群的状态;
  • apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
  • controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
  • kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
  • Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
  • kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡

部署流程

1bf0b05df399a56c02a0ab7b01a83329.png

2. 查看核心组件

Kubelet是唯一一直作为常规系统组件来运行的组件,它把其他组件作为pod来运行。

2.1 查看Kubelet

master和node节点都可查看

[root@master ~]# systemctl status kubelet
d4fd7fb27520f2e944d060dab549a2c1.png

2.2 查看其他组件

[root@master ~]# kubectl get po -o custom-columns=POD:metadata.name,NODE:spec.nodeName --sort-by spec.nodeName -n kube-system

!

46ccb8ba2105940adebeaa84d6dc360e.png

本文重点介绍核心组件controller manager

各资源简写查看:

[root@master ~]# kubectl api-resources 
55ba05424abac8590d9dc3e0fc3e2ca6.png

二、Controller Manager

1. 简介

1ac14ed927233a48146fdde5e2403868.png

    Controller Manager由kube-controller-manager和cloud-controller-manager组成,是Kubernetes的大脑,它通过apiserver监控维护整个集群的状态,比如故障检测、自动扩展、滚动更新等并确保集群处于预期的工作状态。

    cloud-controller-manager 在 Kubernetes 启用 Cloud Provider 的时候才需要,用来配合云服务提供商的控制,如:Node Controller、Route Controller、Service Controller。

2. 原理

    Controller Manager是Kubernetes集群内部的管理控制中心, 负责Kubernetes集群内的Node、 Pod、服务端点、 服务、 资源配额、 命名空间 、服务账号等资源的管理 、 自动化部署、健康监测, 并对异常资源执行自动化修复, 确保集群各资源始终处于预期的工作状态 。 比如, 当某个Node意外若机时,Controller Manager会根据资源调度策略选择集群内其他节点自动部署原右机节点上的Pod副本 。

    Controller Manager是 一 个控制器集合, 包含Replication Controller、Deployment Controller、RelicaSet、StatefulSet Controller、Daemon Controller、CronJob Controller、Node Controller、Resourcequota Controller 、Namespace Controller 、ServiceAccount Controller 、Token Controller、Service Controller及Endpoint Controller等多个控制器,Controller Manager是这些控制器的核心管理者。 一般来说, 智能系统和自动系统通常会通过一个操纵系统来不断修正系统的状态。 在Kubernetes集群中, 每个控制器的核心工作原理就是:每个控制器通过API服务器来查看系统的运行状态, 并尝试着将系统状态从“ 现有状态 ”修正到“期望状态”。

三、ReplicationController

1. 简介

ReplicationController会持续监控正在运行的pod列表,确保pod的数量始终与其标签选择器匹配,ReplicationController由三部分组成:

  • label selector(标签选择器),用于确定ReplicationController作用域中有哪些pod
  • replica count(副本个数),指定应运行的pod 数量
  • pod template(pod模板),用于创建新的pod 副本

2. 创建ReplicationController

[root@master ~]# more nginx-rc.yaml apiVersion: v1kind: ReplicationController    #类型为ReplicationControllermetadata:  name: nginx        #ReplicationController名字spec:  replicas: 3        #pod实例数目  selector:          #pod选择器    app: nginx  template:          #pod模板    metadata:      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx
aabf4e15f574d3e03c5e688fd6281282.png

3. 查看ReplicationController

[root@master ~]# kubectl get rc[root@master ~]# kubectl describe rc nginx 
1d4d270b532e0a716d75d06dca9b574e.png

4. 扩缩容

扩缩容可以采用修改pod模板和直接命令方式

扩容

[root@master ~]# kubectl edit rc nginx 
b88e2b77edc1a4623c3a859652ecaf35.png
bb67f13065b5c5fac379a9141455fcc8.png

缩容

[root@master ~]# kubectl scale rc nginx --replicas=4
0bb003f276d089a5b47b7e9f4fcedc7e.png

5. 删除pod

[root@master ~]# kubectl delete po nginx-2twcf
7b248d256a762fb54c0bd41972954e06.png

删除pod nginx-2twcf,发现该pod被删除的同时k8s自动新增一个pod nginx-vtmt4,这也印证了之前简介中讲的"ReplicationController会持续监控正在运行的pod列表,确保pod的数量始终与其标签选择器匹配"

6. 删除ReplicationController

[root@master ~]# kubectl delete rc nginx 
291271470b45a55d12850a3aefbb125b.png

删除ReplicationController会将其管理的pod一并删除,如果想保留pod,可以添加参数"--cascade = false"

7bdc22f91125e99794cc5ef4ceef5b27.png

7. 标签

7.1 新增标签

[root@master ~]# kubectl label po nginx-28d4k env=prod

7.2 查看标签

[root@master ~]# kubectl get po --show-labels 

7.3 更改标签

[root@master ~]# kubectl label po nginx-28d4k app=test --overwrite

更改app=nginx的标签,这将使该pod不再与ReplicationController的标签选择器匹配,只剩两个匹配的pod,ReplicationController会启动一个新的pod nginx-64w44将总数量恢复为3个。

473066870c4ae13d344fd8e4430f794f.png

四、ReplicaSet

1. 简介

ReplicaSet的行为与ReplicationController完全相同,但pod选择器的表达能力更强,是新一代的ReplicationController,并且将其完全替换掉(ReplicationController最终将被弃用).

2. 创建ReplicaSet

[root@master ~]# more httpd-rs.yaml apiVersion: apps/v1    #api版本kind: ReplicaSetmetadata:  name: httpd spec:  replicas: 3  selector:    matchExpressions:      - key: app        #标签名为app        operator: In    #In : Label的值必须与其中一个指定的values匹配        values:         - httpd        #标签值为httpd  template:             #replicaset模板    metadata:      labels:        app: httpd     spec:      containers:      - name: httpd         image: httpd 

ReplicaSet相对于ReplicationController的主要改进是它更具表达力的标签选择器,ReplicaSet的pod选择器的表达能力更强。

a6f7675d43e592be103cc507962b2813.png

3. 查看ReplicaSet

[root@master ~]# kubectl get rs[root@master ~]# kubectl describe rs httpd 
037357e2c8b53e1ef077abacfaf0008c.png

4. 删除ReplicaSet

[root@master ~]# kubectl delete rs httpd

同理,如需保留pod可以添加参数--cascade=false

93211957acd8476a10ae4a1e90c09b8c.png

五、Deployment

1. 简介

Deployment为Pod和Replica Set(下一代 Replication Controller)提供声明式更新。你只需要在Deployment中描述你想要的目标状态是什么,Deployment controller就会帮你将Pod和Replica Set的实际状态改变到你的目标状态。你可以定义一个全新的Deployment,也可以创建一个新的替换旧的Deployment。

Deployment的典型应用场景 包括:

  • 定义Deployment来创建Pod和ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续Deployment

2. Deployment实践

Deployment相关操作详见:k8s实践(三):pod常用操作

六、DaemonSet

1. 简介

与Replicationcontroller和ReplicaSet在Kubemetes集群上运行部署特定数量的pod不同,DaemonSet每个Node上最多只能运行一个副本,如果节点下线,DaemonSet不会在其他地方重新创建pod,当将一个新节点添加到集群中时,DaemonSet会立刻部署一个新的pod实例。如果有人无意删除了一个pod,它也会从配置的pod模板中创建新的pod。

DaemonSet保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:

  • 日志收集,比如fluentd,logstash等
  • 系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Gangliagmond等
  • 系统程序,比如kube-proxy, kube-dns, glusterd, ceph等

本文以日志搜集工具filebeat为例实践

2. 创建DaemonSet

[root@master ~]# more filebeat-ds.yaml apiVersion: apps/v1kind: DaemonSetmetadata:  name: filebeat-ds  labels:    app: filebeatspec:  selector:    matchLabels:      app: filebeat  template:    metadata:      labels:        app: filebeat      name: filebeat    spec:      containers:      - name: filebeat        image: ikubernetes/filebeat:5.6.5-alpine        env:        - name: REDIS_HOST          value: db.ilinux.io:6379        - name: LOG_LEVEL          value: info[root@master ~]# kubectl apply -f filebeat-ds.yaml daemonset.apps/filebeat-ds created

3. 查看DaemonSet

[root@master ~]# kubectl get ds[root@master ~]# kubectl describe ds filebeat-ds [root@master ~]# kubectl get po -o wide 
1438f455c790b0b2c10537986940a102.png

查看日志

41b66467ad2ae7da6d26c3a25e07755f.png

4. 更新DaemonSet

[root@master ~]# kubectl set image daemonsets filebeat-ds filebeat=ikubernetes/filebeat:5.6.6-alpine

DaemonSet通过删除和新建方式更新image

cb62b65381fe3019c6077e5926b45be6.png

5. 回滚DaemonSet

5.1 查询历史版本

[root@master ~]# kubectl rollout history ds filebeat-ds 

5.2 查询某个历史版本详细信息

[root@master ~]# kubectl rollout history ds filebeat-ds --revision=1[root@master ~]# kubectl rollout history ds filebeat-ds --revision=2

5.3 回滚

[root@master ~]# kubectl rollout undo ds filebeat-ds --to-revision=1

5.4 查看DaemonSet状态

[root@master ~]# kubectl rollout status ds/filebeat-dsdaemon set "filebeat-ds" successfully rolled out[root@master ~]# kubectl describe ds filebeat-ds |grep Image    Image:      ikubernetes/filebeat:5.6.5-alpine
882349ae83650b27015a1c8e13945687.png

6. 删除DaemonSet

[root@master ~]# kubectl delete ds filebeat-ds daemonset.extensions "filebeat-ds" deleted

七、 Job

1. 简介

从程序的运行形态上来区分,我们可以将Pod分为两类:长时运行服务(http server、daemon、mysql)和一次性任务(如并行数据计算、测试、批处理程序等)。ReplicationController、 ReplicaSet和DaemonSet创建的Pod都是长时运行服务,而Job创建的Pod都是一次性的服务。

2. 创建job

[root@master ~]# more job.yaml apiVersion: batch/v1    #api版本为batch/v1kind: Jobmetadata:  name: pispec:  template:    spec:      containers:      - name: pi        image: perl        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]      restartPolicy: Never    #设置容器失败后不重启,即直接新建pod  backoffLimit: 4    #限制新建pod数目,默认为6[root@master ~]# kubectl apply -f job.yaml job.batch/pi created

3. 查看job

[root@master ~]# kubectl get job[root@master ~]# kubectl get po -o wide 

查看job运行结果

[root@master ~]# kubectl logs pi-g2499 
1f484e569ca07284703621d92af4a5ea.png

该job为求圆周率精确至2000位

4. 并行job

[root@master ~]# more multi-job.yaml apiVersion: batch/v1kind: Jobmetadata:  name: multi-jobspec:  completions: 10    #设置Job成功完成Pod的总数  parallelism: 2    #pod并行执行数  template:    metadata:      labels:        app: multi-job    spec:      restartPolicy: OnFailure    #设置容器失败后重启      containers:      - name: busybox        image: busybox[root@master ~]# kubectl apply -f multi-job.yaml job.batch/multi-job created
1dfd7c84147cc84eddc1b329e408607b.png
98ada2672b8f829be878d0878895411f.png

每次同时运行两个job,最终运行的pod数为10

5. Cronjob

新建cronjob

[root@master ~]# more cronjob.yaml apiVersion: batch/v1beta1 kind: CronJobmetadata:  name: hellospec:  schedule: "*/1 * * * *"  jobTemplate:    spec:      template:        spec:          containers:          - name: hello            image: busybox            args:            - /bin/sh            - -c            - date; echo Hello from the Kubernetes cluster          restartPolicy: OnFailure[root@master ~]# kubectl apply -f cronjob.yaml cronjob.batch/hello created

查看cronjob

[root@master ~]# kubectl get cronjobs[root@master ~]# kubectl get job --watch
2cb9cff1cf523cb8e7e1f9a9a5dff14e.png
e39472c0af20c4754d11ec2e5499682e.png

每隔一分钟就会生成一个job

6. 删除job

[root@master ~]# kubectl delete job pi multi-job[root@master ~]# kubectl delete cronjobs hello
6dd222a919424a8ff5b32df43459ce1a.png

本文所有脚本和配置文件已上传github:https://github.com/loong576/k8s-Controller.git

Logo

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

更多推荐