- 1、DaemonSet的使用
- 2、DaemonSet的配置
- 3、新建DaemonSet
- 4、DaemonSet的更新和回滚
- 5、HPA
DaemonSet:守护进程集,缩写为ds,在所有节点或者是匹配的节点上都部署一个Pod。
使用DaemonSet的场景
- 运行集群存储的daemon,比如ceph或者glusterd
- 节点的CNI网络插件,calico
- 节点日志的收集:fluentd或者是filebeat
- 节点的监控:node exporter
- 服务暴露:部署一个ingress nginx
[root@k8s-master ~]# cp nginx-deplo.yaml nginx-ds.yaml
[root@k8s-master ~]# vim nginx-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: nginx
name: nginx
spec:
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.21.6
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
3、新建DaemonSet
- 创建一个ds,因为没有配置notselect,所有它会在每个节点启动一个
[root@k8s-master ~]# kubectl create -f nginx-ds.yaml daemonset.apps/nginx created #查看安装分布 [root@k8s-master ~]# kubectl get node -owide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-master Ready11d v1.22.0-beta.1 172.16.55.220 CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15 k8s-node01 Ready 11d v1.22.0-beta.1 172.16.55.221 CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15 k8s-node02 Ready 11d v1.22.0-beta.1 172.16.55.222 CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15 k8s-node03 Ready 11d v1.22.0-beta.1 172.16.55.223 CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.15 [root@k8s-master ~]# kubectl get po -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES busybox 1/1 Running 25 (15m ago) 25h 192.161.125.10 k8s-node01 nginx-ctgvv 1/1 Running 0 170m 192.169.214.227 k8s-node03 nginx-km7q5 1/1 Running 0 170m 192.171.14.205 k8s-node02 nginx-nwqf2 1/1 Running 0 170m 192.161.125.14 k8s-node01 nginx-nx2ts 1/1 Running 0 170m 192.172.82.208 k8s-master
- 给需要部署的容器打标签
[root@k8s-master ~]# kubectl label node k8s-node02 k8s-node01 k8s-node03 ds=true node/k8s-node02 labeled node/k8s-node01 labeled node/k8s-node03 labeled [root@k8s-master ~]# kubectl get node --show-labels NAME STATUS ROLES AGE VERSION LABELS k8s-master Ready11d v1.22.0-beta.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,k8s.kuboard.cn/role=etcd,kubernetes.io/arc + 89 more... k8s-node01 Ready 11d v1.22.0-beta.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ds=true,kubernetes.io/arch=amd64,kubernete + 72 more... k8s-node02 Ready 11d v1.22.0-beta.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ds=true,kubernetes.io/arch=amd64,kubernete + 72 more... k8s-node03 Ready 11d v1.22.0-beta.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ds=true,kubernetes.io/arch=amd64,kubernete + 72 more...
- 修改nginx-ds.yaml
nodeSelector: ds: "true"
[root@k8s-master ~]# vim nginx-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: nginx
name: nginx
spec:
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
nodeSelector:
ds: "true"
containers:
- image: nginx:1.21.6
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
- 更新配置
[root@k8s-master ~]# kubectl replace -f nginx-ds.yaml daemonset.apps/nginx replaced [root@k8s-master ~]# kubectl get po -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES busybox 1/1 Running 25 (56m ago) 25h 192.161.125.10 k8s-node01nginx-j8d6c 1/1 Running 0 10s 192.161.125.15 k8s-node01 nginx-km7q5 0/1 Terminating 0 3h31m 192.171.14.205 k8s-node02 nginx-nn6sz 1/1 Running 0 6s 192.169.214.228 k8s-node03
- 查看pod,可以看到不符合标签的pod被删除了
- 如果要添加节点,就在节点添加 label ds=true
- 配置信息
[root@k8s-master ~]# kubectl get ds nginx -oyaml
#RollingUpdate 更新回滚和 Deployment 一致
updateStrategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
#更新版本
[root@k8s-master ~]# kubectl set image ds nginx nginx=nginx:1.20.1 --record
Flag --record has been deprecated, --record will be removed in the future
daemonset.apps/nginx image updated
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 26 (22m ago) 26h 192.161.125.10 k8s-node01
nginx-5ch2g 0/1 Terminating 0 109s 192.171.14.208 k8s-node02
nginx-nn6sz 0/1 Terminating 0 26m k8s-node03
nginx-vgkl2 0/1 Terminating 0 104s 192.161.125.17 k8s-node01
- 更新策略推荐使用 OnDelete
updateStrategy:
type: OnDelete
#更改版本
[root@k8s-master ~]# kubectl set image ds nginx nginx=nginx:1.21.6 --record
#删除节点
[root@k8s-master ~]# kubectl delete po nginx-5ch2g
#查看更新记录
[root@k8s-master ~]# kubectl rollout history ds nginx
- 因为 DaemonSet 可能部署在 k8s 集群的很多节点上,一开始先在一些节点上进行测试,删除后触发更新不影响其他节点
参考:https://blog.csdn.net/m0_47288926/article/details/122819880
- HPA全称是Horizontal Pod Autoscaler,中文意思是POD水平自动伸缩.
- 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment、ReplicaSet 和
StatefulSet 中的 Pod 数量。 - 除了 CPU 利用率,内存占用外,也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。
- Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。
- Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。
- 控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。
- 确认安装metrics-server
[root@k8s-master ~]# kubectl get pods -n kube-system |grep metrics-server metrics-server-64c6c494dc-m44ck 1/1 Running 9 (30h ago) 11d [root@k8s-master ~]# kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% k8s-master 694m 8% 1216Mi 15% k8s-node01 319m 3% 700Mi 8% k8s-node02 357m 4% 984Mi 12% k8s-node03 185m 2% 685Mi 8%
- kubectl对HPA的支持
- 与其他 API 资源类似,kubectl 以标准方式支持 HPA。
- 通过 kubectl create 命令创建一个 HPA 对象
- 通过 kubectl get hpa 命令来获取所有 HPA 对象
- 通过 kubectl describe hpa 命令来查看 HPA 对象的详细信息
- 通过 kubectl delete hpa 命令删除对象。
- 此外,还有个简便的命令 kubectl autoscale 来创建 HPA 对象。
例如,命令 kubectl autoscale deploy nginx --cpu-percont=20% --min=2 --max=5 将deploy nginx 创建一个 HPA 对象, 目标 CPU 使用率为 20%,副本数量配置为 2 到 5 之间。
[root@k8s-master ~]# kubectl autoscale deploy nginx --cpu-percent=20 --min=2 --max=5 horizontalpodautoscaler.autoscaling/nginx autoscaled [root@k8s-master ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx Deployment/nginx 0%/20% 2 5 2 8h [root@k8s-master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1443/TCP 11d nginx ClusterIP 10.103.207.95 80/TCP 26m #创建一个循环请求 [root@k8s-node01 ~]# while true;do wget -q -o- http://10.103.207.95 > /dev/null;done #当cpu使用 超过20% [root@k8s-master ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx Deployment/nginx 30%/20% 2 5 5 9h #自动创建最多5个pod [root@k8s-master ~]# kubectl get po NAME READY STATUS RESTARTS AGE busybox 1/1 Running 37 (51m ago) 37h nginx-6b5dc8646d-c8x4d 1/1 Running 0 15s nginx-6b5dc8646d-dnprw 1/1 Running 0 16m nginx-6b5dc8646d-w59mb 1/1 Running 0 42m nginx-6b5dc8646d-w76cd 1/1 Running 0 30s nginx-6b5dc8646d-x2ks4 1/1 Running 0 30s
- 当停止请求后,pod数量 下降为最少2个



