控制器 Controller资源
1、控制器作用
1 2 3 4 1.pod类型的资源,删除pod后,不会重建 2.替用户监视并保证相应的节点上始终有用户所期望的副本数量的pod在运行 3.如果所运行的pod副本数超过了用户期望的,那么控制器就会屾掉,直到和用户期望的一致 4.如果所运行的pod副本数低于用户期望的,那么控制器就会创建,直到和用户期望的一致
2、控制器的类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 1) Replicacontroller:Rc "已经淘汰掉了" 2) Replicaset Rs:按用户期望的副本创建pod,并始终保持相应数量副本 3) Deployment: Deployment通过控制RS来保证POD始终保持相应的数量副本支持滚动更新,回滚,回滚默认保留10个版本提供声明式配置,支持动态修改管理无状态应用最理想的控制器node节点可能会运行0个或多个POD 4)Deamonset: 一个节点只运行一个,必须是始终运行的状态 5)statefulset: 有状态应用
3、ReplicaSet Rs 控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 apiVersion: "apps/v1" kind: "ReplicaSet" metadata: name: nginx-rs namespace: default spec: replicas: 5 selector: matchLabels: app: nginx template: metadata: name: nginx-rs-pod labels: app: nginx spec: containers: - name: nginx-web-containers image: nginx:alpine imagePullPolicy: IfNotPresent 其实Rs控制器就是把之前的Pod资源包含起来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 1、编写Rs控制器的资源清单 [root@master01 kubernetes]# vim nginx-rs.yml apiVersion: "apps/v1" kind: "ReplicaSet" metadata: name: nginx-rs namespace: default spec: replicas: 5 selector: matchLabels: app: nginx template: metadata: name: nginx-rs-pod labels: app: nginx spec: containers: - name: nginx-web-containers image: nginx:alpine imagePullPolicy: IfNotPresent 2、运行,并查看,运行的Pod是轮询在node1、2、3的 [root@master01 kubernetes]# kubectl apply -f nginx-rs.yml [root@master01 kubernetes]# kubectl get pod -owide| grep nginx-rs nginx-rs-4z82q 1/1 Running 0 6m13s 10.2.2.9 node02 nginx-rs-d5mhz 1/1 Running 0 6m13s 10.2.2.10 node02 nginx-rs-qv5l6 1/1 Running 0 6m13s 10.2.3.62 node03 nginx-rs-t8hz6 1/1 Running 0 6m13s 10.2.1.16 node01 nginx-rs-tksxm 1/1 Running 0 6m13s 10.2.1.17 node01 Pod的名字在资源清单中加nginx-pod,但是不按pod名字来,是根具控制器name: nginx-rs这个加上随机字符串
1、rs资源的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 1、查看 [root@master01 kubernetes]# kubectl get replicasets NAME DESIRED CURRENT READY AGE nginx-5f5d9d69c4 1 1 1 5d2h nginx-65cc99f84f 0 0 0 5d8h nginx-rs 5 5 5 11m [root@master01 kubernetes]# kubectl get rs -owide [root@master01 kubernetes]# kubectl get replicasets -owide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR nginx-rs 5 5 5 13m nginx-web-containers nginx:alpine app=nginx 2、#查看详细信息 [root@master01 kubernetes]# kubectl describe rs nginx-rs 3、#持续输出 当前窗口A [root@master01 kubernetes]# kubectl get rs -w 再打开一个master新窗口B, [root@master01 ~]# kubectl get pod -w 再打开一个master新窗口C,删除一个pod,旧窗口有输出信息 [root@master01 ~]# kubectl delete pod nginx-rs-4z82q 窗口A、B会有输出信息,窗口B会标记删除Terminating(此时只是标记,并没有真删除),然后为了保证你的期望,会赶紧创建一个新的Pending,然后初始化容器ContainerCreating,之后在删除Terminating,新容器运行之后,才彻底被删除掉 4、#删除POD(只能删除rs控制器,否则会自动拉起) 当我们不需要这个pod,delete pod是删不掉的,删了就会重新起来,所以删rs控制器才彻底删除 kubectl delete 控制器 控制器名 [root@master01 kubernetes]# kubectl delete rs nginx-rs
2、Rs资源手动扩缩容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 1、编辑资源清单,根据自己的需求修改副本数量 [root@master01 kubernetes]# vim nginx-rs.yml replicas: 8 2、运行,查看 [root@master01 kubernetes]# kubectl apply -f nginx-rs.yml [root@master01 kubernetes]# kubectl get pod [root@master01 kubernetes]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-rs 8 8 8 10s 1、编辑控制器的资源清单,根据自己的需求修改副本数量 如果是放到其他名称空间,后面要加 -n 指定名称空间 [root@master01 kubernetes]# kubectl edit rs nginx-rs replicas: 4 修改之后直接查看,不需要apply,直接生效 [root@master01 kubernetes]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-rs 4 4 4 5m56s [root@master01 kubernetes]# kubectl scale rs nginx-rs --replicas=7 scale:手动扩缩容 [root@master01 kubernetes]# kubectl get pod [root@master01 kubernetes]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-rs 7 7 7 13m
4、Deployment 控制器
1、Deployment控制器的功能和关系
1 Deployment通过控制RS来保证Pod始终保持相对于的数量副本
1 2 3 4 5 6 7 RS控制器他会达到你的期望副本,缺陷不能做版本升级 Deployment之所以要控制RS控制器是因为要保留RS控制器的功能,保证用户期望的副本数量一直存在 支持滚动更新,回滚,回滚默认保留10个版本(也就默认保留10个RS控制器) 提供声明式配置,支持动态修改 管理无状态应用最理想的控制器 node节点可能运行0个或多个pod
2、Deployment控制器的资源清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 1、编写资源清单 [root@master01 kubernetes]# cp nginx-rs.yml nginx-dp.yml [root@master01 kubernetes]# vim nginx-dp.yml apiVersion: "apps/v1" kind: "Deployment" metadata: name: nginx-dp namespace: default spec: replicas: 8 selector: matchLabels: app: nginx-dp template: metadata: name: nginx-dp-pod labels: app: nginx-dp spec: containers: - name: nginx-web-containers image: nginx:alpine imagePullPolicy: IfNotPresent 2、运行并查看 [root@master01 kubernetes]# kubectl apply -f nginx-dp.yml [root@master01 kubernetes]# kubectl get pod [root@master01 kubernetes]# kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE nginx-dp 8/8 8 8 39s 3、查看控制器的详细信息 [root@master01 kubernetes]# kubectl describe deployments.apps nginx-dp
3、Deployment的扩缩容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1、编辑资源清单,根据自己的需求修改副本数量 [root@master01 kubernetes]# vim nginx-dp.yml replicas: 6 2、运行,查看 [root@master01 kubernetes]# kubectl apply -f nginx-dp.yml [root@master01 kubernetes]# kubectl get pod [root@master01 kubernetes]# kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE nginx-dp 6/6 6 6 69m 1、编辑控制器的资源清单,根据自己的需求修改副本数量 如果是放到其他名称空间,后面要加 -n 指定名称空间 [root@master01 kubernetes]# kubectl edit deployments.apps nginx-dp replicas: 10 修改之后直接查看,不需要apply,直接生效 [root@master01 kubernetes]# kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE nginx-dp 10/10 10 10 71m [root@master01 kubernetes]# kubectl scale deployment nginx-dp --replicas=4 scale:手动扩缩容 [root@master01 kubernetes]# kubectl get pod [root@master01 kubernetes]# kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE nginx-dp 4/4 4 4 73m
4、Deployment更新版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1、编辑资源清单,根据自己的需求修改版本 [root@master01 kubernetes]# vim nginx-dp.yml image: nginx:alpine 改成 image: nginx:1.20.1 2、运行,查看 [root@master01 kubernetes]# kubectl apply -f nginx-dp.yml [root@master01 kubernetes]# kubectl get pod [root@master01 kubernetes]# kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE nginx-dp 6/6 6 6 69m 1、编辑控制器的资源清单,根据自己的需求修改版本 如果是放到其他名称空间,后面要加 -n 指定名称空间 [root@master01 kubernetes]# kubectl edit deployments.apps nginx-dp - image: nginx:alpine 改成 - image: nginx:1.20.1 修改之后直接查看,不需要apply,直接生效 [root@master01 kubernetes]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-dp-6447db69d8 0 0 0 79m nginx-dp-7b88fc7dff 6 6 6 2m8s 这个版本是没有直接显示,可以查看 [root@master01 kubernetes]# kubectl describe rs nginx-dp-7b88fc7dff| grep -n '.*' 17行 Image: nginx:1.20.1 kubectl set image -f 资源清单 容器名=镜像:版本 [root@master01 kubernetes]# kubectl set image -f nginx-dp.yml nginx-web-containers=nginx:1.16.0 查看保留的几个版本 [root@master01 kubernetes]# kubectl get rs
滚动更新示意图:
1 2 3 [root@master01 kubernetes]# kubectl rollout status deployment nginx-dp deployment "nginx-dp" successfully rolled out
5、Deployment回滚到上一个版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1、编辑资源清单,根据自己的需求修改版本 [root@master01 kubernetes]# vim nginx-dp.yml image: nginx:alpine 改成 image: nginx:1.20.1 2、运行,查看 [root@master01 kubernetes]# kubectl apply -f nginx-dp.yml [root@master01 kubernetes]# kubectl get pod [root@master01 kubernetes]# kubectl get deployments.apps 1、编辑控制器的资源清单,根据自己的需求修改版本 如果是放到其他名称空间,后面要加 -n 指定名称空间 [root@master01 kubernetes]# kubectl edit deployments.apps nginx-dp - image: nginx:alpine 改成 - image: nginx:1.20.1 修改之后直接查看,不需要apply,直接生效 [root@master01 kubernetes]# kubectl get rs 这个版本是没有直接显示,可以查看 [root@master01 kubernetes]# kubectl describe rs nginx-dp-7b88fc7dff| grep -n '.*' 17行 Image: nginx:1.20.1 kubectl set image -f 资源清单 容器名=镜像:版本 [root@master01 kubernetes]# kubectl set image -f nginx-dp.yml nginx-web-containers=nginx:1.16.0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@master01 kubernetes]# kubectl rollout history deployment nginx-dp deployment.apps/nginx-dp REVISION CHANGE-CAUSE 1 <none> 2 <none> 3 <none> 保留10个,现在只要3个 [root@master01 kubernetes]# kubectl rollout history deployment nginx-dp --revision=1 第7行可以看到版本信息 Image: nginx:alpine [root@master01 kubernetes]# kubectl rollout undo deployment nginx-dp --to-revision=1 [root@master01 kubernetes]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-dp-57fb845d6d 0 0 0 3m45s nginx-dp-6447db69d8 6 6 6 109m nginx-dp-6c696f4449 0 0 0 22m nginx-dp-7b88fc7dff 0 0 0 31m [root@master01 kubernetes]# kubectl describe rs nginx-dp-6447db69d8 查看已经回到alpine版本 Image: nginx:alpine
小技巧 使用–record在历史版本中记录命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 [root@master01 kubernetes]# kubectl rollout history deployment nginx-dp deployment.apps/nginx-dp REVISION CHANGE-CAUSE 1 <none> 2 <none> 3 <none> 当前版本信息为<none>,当使用命令去更改的使用,可以在最后面加上选项--record,可以记录这条执行的命令,如果资源清单加上版本号,也是可以显示,用法如下 1、修改资源清单,改一下里面的版本 [root@master01 kubernetes]# vim nginx-dp.yml image: nginx:1.17.4 2、运行资源清单 [root@master01 kubernetes]# kubectl apply -f nginx-dp.yml --record [root@master01 kubernetes]# kubectl rollout history deployment nginx-dp deployment.apps/nginx-dp REVISION CHANGE-CAUSE 2 <none> 3 <none> 4 <none> 5 <none> 6 kubectl apply --filename=nginx-dp.yml --record=true [root@master01 kubernetes]# kubectl set image -f nginx-dp.yml nginx-web-containers=nginx:1.18.4 --record deployment.apps/nginx-dp image updated [root@master01 kubernetes]# kubectl rollout history deployment nginx-dp deployment.apps/nginx-dp REVISION CHANGE-CAUSE 2 <none> 3 <none> 4 <none> 5 <none> 6 kubectl apply --filename=nginx-dp.yml --record=true 7 kubectl set image nginx-web-containers=nginx:1.18.4 --filename=nginx-dp.yml --record=true
5、DaemonSet 控制器
1、DaemonSet类型介绍 应用场景:每一个节点有且只起一个pod,像zabbix-agent,flannel
1 2 3 4 简单来说就是每个节点部署一个POD副本 常见的应用场景: 监控容器 日志收集容器
2、DaemonSet的资源清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 1、编写资源清单 [root@master01 kubernetes]# cp nginx-dp.yml nginx-ds.yml [root@master01 kubernetes]# vim nginx-ds.yml apiVersion: "apps/v1" kind: "DaemonSet" metadata: name: nginx-ds namespace: default spec: selector: matchLabels: app: nginx-ds template: metadata: name: nginx-ds-pod labels: app: nginx-ds spec: containers: - name: nginx-web-containers image: nginx:alpine imagePullPolicy: IfNotPresent 2、运行资源清单,并查看 [root@master01 kubernetes]# kubectl get pod -owide| grep nginx-ds nginx-ds-7gpkh 1/1 Running 0 3m21s 10.2.1.38 node01 nginx-ds-9r2hz 1/1 Running 0 3m21s 10.2.2.34 node02 nginx-ds-vmjsj 1/1 Running 0 3m21s 10.2.3.81 node03 [root@master01 kubernetes]# kubectl get ds NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE nginx-ds 3 3 3 3 3
1 2 3 4 5 这几个控制器,以后看你起什么样的服务,去决定你用什么类型的控制器,除了客户端类型的,大部分都是Deplament StatefulSet控制器 mysql主从复制 ,kepalived 这个用的少,如果需要可以从网上搜索K8smysql主从复制
小练习:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1、## 使用控制器起wordpress 一:wordpress镜像 在一个POD里启动两个容器 - wordpress - mysql5.7 1.就绪性探针 2.存活性探针 3.启动钩子 4.停止钩子 5.初始化容器 二:尝试 wordpress 启动一个POD MySQL单独启动在一个POD里 2、## 了解HPA 自动扩缩容 3、## 写一个MySQL主从复制的资源清单
一、使用控制器起wordpress
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 apiVersion: "apps/v1" kind: "Deployment" metadata: name: wp-dp namespace: default spec: replicas: 1 selector: matchLabels: app: wp template: metadata: name: wp-pod namespace: default labels: app: wp spec: volumes: - name: mysql-data hostPath: path: /data/mysql - name: wp-data hostPath: path: /data/wp containers: - name: wp-container image: wordpress imagePullPolicy: IfNotPresent livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 10 periodSeconds: 3 timeoutSeconds: 3 failureThreshold: 3 readinessProbe: tcpSocket: port: 3306 initialDelaySeconds: 3 timeoutSeconds: 1 periodSeconds: 2 successThreshold: 3 failureThreshold: 3 env : - name: WORDPRESS_DB_HOST value: '127.0.0.1' - name: WORDPRESS_DB_USER value: 'wp_user' - name: WORDPRESS_DB_PASSWORD value: '123' - name: WORDPRESS_DB_NAME value: 'wp_db' volumeMounts: - name: wp-data mountPath: /var/www/html/ - name: mysql-container image: mysql:5.7 imagePullPolicy: IfNotPresent args: - --character-set-server=utf8 - --collation-server=utf8_general_ci livenessProbe: exec : command : ["/bin/sh" ,"-c" ,"mysqladmin -uroot -p123 ping" ] initialDelaySeconds: 10 periodSeconds: 3 timeoutSeconds: 3 failureThreshold: 3 env : - name: MYSQL_ROOT_PASSWORD value: '123' - name: MYSQL_DATABASE value: 'wp_db' - name: MYSQL_USER value: 'wp_user' - name: MYSQL_PASSWORD value: '123' volumeMounts: - name: mysql-data mountPath: /var/lib/mysql 目前的资源清单还是有缺陷 1、对外提供服务的问题 2、数据容器和wordpress容器在同一个pod里,正常应该分开起在不同pod 3、自动扩缩容