[toc]
Controller控制器的概述 Controller控制器作用 
pod类型的资源,删除pod后,不会重建 
替用户监视并保证相应的节点上始终有用户所期望的副本数量的pod在运行 
如果所运行的pod副本数超过了用户期望的,那么控制器就会删掉,直到和用户期望的一致 
如果所运行的pod副本数低于用户期望的,那么控制器就会创建,直到和用户期望的一致 
 
Controller控制器类型 
不常用
RC:Replication Controller
 
StatefulSet
有状态的应用,为Pod提供唯一标识,它可以保证部署和scale的顺序 
 
 
 
 
重点且常用
RS:ReplicaSet
控制Pod起多个副本,服务挂了自动启动,始终保持相应数量副本 
 
 
Deployment:
Deployment通过控制RS来保证POD始终保持相应的数量副本  // deployment不能直接控制POD,而是控制RS控制器  
支持滚动更新,回滚,回滚默认保留10个版本   // 支持版本更新  
提供声明式配置,支持动态修改  // 支持动态修改  
管理无状态应用最理想的控制器 
node节点可能会运行0个或多个POD 
 
 
daemonset
保证每个node节点,有且只有一个POD启动 
每台只起一个客户端软件 
 
 
 
 
 
RS控制器 在资源清单配置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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 vim nginx-rs.yaml apiVersion: apps/v1 kind: ReplicaSet metadata:      name: rs spec:      replicas: 5   selector:          matchLabels:       name: hcl   template:          metadata:              name: nginx-pod              labels:         name: hcl     spec:       containers:       - name: nginx-container         image: nginx:alpine         imagePullPolicy: IfNotPresent          apiVersion: apps/v1 kind: ReplicaSet metadata:   name: nginx-rs spec:   replicas: 5   selector:     matchLabels:       name: hcl   template:     metadata:       name: nginx-pod       labels:         name: hcl     spec:       containers:       - name: nginx-container         image: nginx:alpine         imagePullPolicy: IfNotPresent 
总结
RS控制器的接口版本不是”v1”,而是”apps/v1” 
RS控制器spec中,selector(标签选择器,必须要写) 
POD必须使用labels打标签 
RS控制器的template要包住原来的POD资源内容 
 
 
查看启动的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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 kubectl get pod NAME             READY   STATUS    RESTARTS   AGE rs-7bv2d         1/1     Running   0          9h rs-7p94d         1/1     Running   0          9h rs-fvm4d         1/1     Running   0          9h rs-tdpqk         1/1     Running   0          9h rs-tx64q         1/1     Running   0          9h kubectl get pod -o wide NAME             READY   STATUS    RESTARTS   AGE     IP          NODE    NOMINATED NODE   READINESS GATES rs-7bv2d         1/1     Running   0          9h      10.2.2.4    k8s03   <none>           <none> rs-7p94d         1/1     Running   0          9h      10.2.1.10   k8s02   <none>           <none> rs-fvm4d         1/1     Running   0          9h      10.2.1.8    k8s02   <none>           <none> rs-tdpqk         1/1     Running   0          9h      10.2.1.9    k8s02   <none>           <none> rs-tx64q         1/1     Running   0          9h      10.2.2.5    k8s03   <none>           <none> kubectl get pod --show-labels NAME             READY   STATUS    RESTARTS   AGE     LABELS rs-7bv2d         1/1     Running   0          9h      name=hcl rs-7p94d         1/1     Running   0          9h      name=hcl rs-fvm4d         1/1     Running   0          9h      name=hcl rs-tdpqk         1/1     Running   0          9h      name=hcl rs-tx64q         1/1     Running   0          9h      name=hcl kubectl get rs NAME   DESIRED   CURRENT   READY   AGE rs     5         5         5       9h kubectl describe rs nginx-rs Name:         rs Namespace:    default Selector:     name=hcl Labels:       <none> Annotations:  <none> Replicas:     5 current / 5 desired Pods Status:  5 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template:   Labels:  name=hcl   Containers:    nginx-container:     Image:        nginx:alpine     Port:         <none>     Host Port:    <none>     Environment:  <none>     Mounts:       <none>   Volumes:        <none> Events:           <none> 
动态扩缩容 1 2 3 4 5 kubectl edit rs rs kubectl scale rs rs --replicas=6 
Deployment控制器 Deployment控制器 与 RS控制器的关系 虽然我们创建的是Deployment类型资源,但实际上控制副本还是由RS来控制的,Deployment只是替我们去创建RS控制器,然后再由RS去控制POD副本.
Deployment控制器还有一个比较重要的功能就是滚动更新和版本回滚,而这个功能就是以来RS控制器。
Deployment控制器资源清单 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 apiVersion: apps/v1 kind: Deployment metadata:   name: nginx-dp spec:   replicas: 5   selector:     matchLabels:       name: hcl   template:     metadata:       name: nginx-pod       labels:         name: hcl     spec:       containers:       - name: nginx-container         image: nginx:alpine         imagePullPolicy: IfNotPresent 
查看启动的资源信息 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 kubectl get pod NAME                       READY   STATUS    RESTARTS   AGE nginx-dp-8545cf5fb-46nj7   1/1     Running   0          8s nginx-dp-8545cf5fb-ghdm4   1/1     Running   0          8s nginx-dp-8545cf5fb-mxd5z   1/1     Running   0          8s nginx-dp-8545cf5fb-sl62g   1/1     Running   0          8s nginx-dp-8545cf5fb-zwjdh   1/1     Running   0          8s kubectl get rs NAME                 DESIRED   CURRENT   READY   AGE nginx-dp-8545cf5fb   5         5         5       15s kubectl describe rs nginx-dp-8545cf5fb Name:           nginx-dp-8545cf5fb Namespace:      default Selector:       name=hcl,pod-template-hash=8545cf5fb Labels:         name=hcl                 pod-template-hash=8545cf5fb Annotations:    deployment.kubernetes.io/desired-replicas: 5                 deployment.kubernetes.io/max-replicas: 7                 deployment.kubernetes.io/revision: 1 Controlled By:  Deployment/nginx-dp kubectl describe pod nginx-dp-8545cf5fb-ghdm4 Name:         nginx-dp-8545cf5fb-ghdm4 Namespace:    default Priority:     0 Node:         k8s03/10.0.0.13 Start Time:   Tue, 13 Jun 2023 21:01:55 +0800 Labels:       name=hcl               pod-template-hash=8545cf5fb Annotations:  <none> Status:       Running IP:           10.2.2.6 IPs:   IP:           10.2.2.6 Controlled By:  ReplicaSet/nginx-dp-8545cf5fb kubectl get deploy 或者 kubectl get deployments.apps  NAME       READY   UP-TO-DATE   AVAILABLE   AGE nginx-dp   5/5     5            5           4m32s 
动态修改deployment资源 
修改资源清单更新资源
指定资源清单进行编辑
1 kubectl edit -f nginx-dp.yaml 
 
命令行更新资源
根据资源清单更新镜像
1 2 kubectl set  image -f nginx-dp.yaml nginx-container=nginx:1.21.3 deployment.apps/nginx-dp image updated 
不指定资源清单更新镜像
1 2 kubectl set  image deployment nginx-dp nginx-container=nginx:1.21.4 deployment.apps/nginx-dp image updated 
 
 
deployment控制器版本回滚 
回滚到上一个版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 kubectl describe deployments.apps nginx-dp   Containers:    nginx-container:     Image:        nginx:1.21.4 kubectl get rs -o wide NAME                  DESIRED   CURRENT   READY   AGE     CONTAINERS        IMAGES         SELECTOR nginx-dp-54ffb76795   5         5         5       4m25s   nginx-container   nginx:1.21.4   name=hcl,pod-template-hash=54ffb76795 nginx-dp-748cdc54f4   0         0         0       8m42s   nginx-container   nginx:1.21.3   name=hcl,pod-template-hash=748cdc54f4 nginx-dp-8545cf5fb    0         0         0       23m     nginx-container   nginx:alpine   name=hcl,pod-template-hash=8545cf5fb kubectl rollout undo deployment nginx-dp deployment.apps/nginx-dp rolled back kubectl get rs -o wide NAME                  DESIRED   CURRENT   READY   AGE    CONTAINERS        IMAGES         SELECTOR nginx-dp-54ffb76795   0         0         0       7m4s   nginx-container   nginx:1.21.4   name=hcl,pod-template-hash=54ffb76795 nginx-dp-748cdc54f4   5         5         5       11m    nginx-container   nginx:1.21.3   name=hcl,pod-template-hash=748cdc54f4 nginx-dp-8545cf5fb    0         0         0       25m    nginx-container   nginx:alpine   name=hcl,pod-template-hash=8545cf5fb 
deployment回滚到指定版本
查看版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 kubectl rollout history  deployment nginx-dp deployment.apps/nginx-dp REVISION  CHANGE-CAUSE 1         <none> 3         <none> 4         <none> kubectl rollout history  deployment nginx-dp --revision=5 deployment.apps/nginx-dp with revision  Pod Template:   Labels:	name=hcl 	pod-template-hash=54ffb76795   Containers:    nginx-container:     Image:	nginx:1.21.4     Port:	<none>     Host Port:	<none>     Environment:	<none>     Mounts:	<none>   Volumes:	<none> 
回滚
1 2 3 kubectl rollout undo deployment nginx-dp --to-revision=3 deployment.apps/nginx-dp rolled back 
记录版本更改信息
1 2 3 4 5 6 7 8 9 10 11 12 13 kubectl apply -f nginx-dp.yaml --record kubectl set  image deployment nginx-dp nginx-container=nginx:1.21.5 --record deployment.apps/nginx-dp  REVISION  CHANGE-CAUSE 1         <none> 4         <none> 5         <none> 6         kubectl apply --filename=nginx-dp.yaml --record=true  7         kubectl set  image deployment nginx-dp nginx-container=nginx:1.21.5 --record=true  
 
 
deployment扩缩容 1 2 3 kubectl scale deployment nginx-dp --replicas=3 deployment.apps/nginx-dp scaled 
DaemonSet控制器 结构图示 
概述 
简单来说就是每个节点部署一个POD副本 
常见的应用场景:
 
 
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 vim nginx-ds.yaml apiVersion: apps/v1 kind: DaemonSet metadata:   name: db-dp spec:   selector:     matchLabels:     app: mysql   template:     metadata:       name: db-pod       labels:         app: mysql   spec:     containers:     - name: nginx-container       image: mysql:5.7       imagePullPolicy: IfNotPresent kubectl apply -f nginx-ds.yaml daemonset.apps/db-dp created kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES db-dp-29chj 0/1 CrashLoopBackOff 2 42s 10.2.1.42 k8s03 <none> <none> db-dp-h97sh 0/1 CrashLoopBackOff 2 42s 10.2.2.83 k8s02 <none> <none> 
HPA自动扩缩容 HPA工作原理 HAP通过收集来的监控指标分析所有Pod的负载情况,并且根据我们设定好的标准来自动扩容收缩RC、 Deployment、RS 或 StatefulSet 中的 Pod 数量
需要一个 Metric Server 收集所有POD负载情况 
必须使用除了DaemonSet以外的控制器 
 
Metrics Server介绍 在HAP早期版本使用的是一个叫Heapster组件来提供CPU和内存指标的,在后期的版本k8s转向了使用Metrcis Server 组件来提供Pod的CPU和内存指标,Metrcis Server 通过Metrics API 将数据暴露出来,然后我们就可以使用k8s的API来获取相应的数据。
部署Metric Server 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 wget https://github.com/kubernetes-sigs/metricsserver/releases/download/v0.4.0/components.yaml   - 下载镜像,导入到所有Node节点   docker load < metrics-server.tar   "kind: Deployment" 改为"kind: DaemonSet"    args:   - - --kubelet-insecure-tls   spec:     hostNetwork: true      containers:     - name: xxx     ... kubectl apply -f components.yaml kubectl get pod -n kube-system NAME                            READY   STATUS    RESTARTS   AGE metrics-server-qlfnj            1/1     Running   0          7h16m metrics-server-vkbzj            1/1     Running   0          7h16m kubectl top node NAME    CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%    k8s01   54m          5%     1470Mi          38%        k8s02   30m          3%     713Mi           18%        k8s03   29m          2%     497Mi           57% 
生成一个php-apache镜像 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 vim index.php <?php   $x  = 0.0001;   for  ($i  = 0; $i  <= 1000000; $i ++) {     $x  += sqrt($x );   }   echo  "OK!" ; ?> vim dockerfile FROM php:5-apache ADD index.php /var/www/html/index.php RUN chmod  a+rx index.php docker build -t php:v1 . docker save php:v1 > /tmp/php_v1.tgz scp /tmp/php_v1.tgz 172.16.1.12:/tmp scp /tmp/php_v1.tgz 172.16.1.13:/tmp docker load < /tmp/php_v1.tgz docker load < /tmp/php_v1.tgz vim php-apache.yaml apiVersion: apps/v1 kind: Deployment metadata:   name: php-apache spec:   replicas: 1   selector:     matchLabels:       run: php-apache   template:     metadata:       labels:         run: php-apache     spec:       containers:       - image: php:v1         imagePullPolicy: IfNotPresent         name: php-apache         ports:         - containerPort: 80           protocol: TCP         resources:           requests:             cpu: 50m kubectl apply -f php-apache.yaml kubectl get pod -o wide 
创建HPA资源 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 vim hpa.yaml apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata:   name: php-apache   namespace: default spec:   maxReplicas: 10   minReplicas: 1   scaleTargetRef:     apiVersion: apps/v1     kind: Deployment     name: php-apache   targetCPUUtilizationPercentage: 50 kubectl apply -f hpa.yaml horizontalpodautoscaler.autoscaling/php-apache created kubectl get hpa NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE php-apache   Deployment/php-apache   2%/50%    1         10        1          17s while  true ; do  wget -q -O- http://IP; done