• Kubernetes:(十二)k8s的控制器们


    目录

    一:Pod控制器

    二:Pod与控制器之间的关系

    三:Deployment(无状态)

    四:ReplicaSet(RS) 

    4.1ReplicaSet的资源清单文件

    4.2有状态和无状态的区别

    4.3常规service和无头服务区别

    4.4示例

    4.4.1先创建DNS资源​​​​​​​

    4.4.2再用statefulset控制器类型 创建nginx pod资源,并创建无头服务资源

    4.4.3总结

    五:DaemonSet

    六:Job  

    七: CronJob 

    八:Horizontal Pod Autoscaler(HPA) 

    8.1安装metrics-server

    8.2准备deployment和servie 

    8.3部署HPA 

    8.4测试

    ​​​​​​​

    一:Pod控制器

    Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类:

    • 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建
    • 控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建

    什么是Pod控制器?

    Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。

    在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些:

    1. ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代
    2. ReplicaSet:保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级
    3. Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本
    4. Horizontal Pod Autoscaler:可以根据集群负载自动水平调整Pod的数量,实现削峰填谷
    5. DaemonSet:在集群中的指定Node上运行且仅运行一个副本,一般用于守护进程类的任务
    6. Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务
    7. Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行
    8. StatefulSet:管理有状态应用

    二:Pod与控制器之间的关系

    controllers:在集群上管理和运行容器的对象通过label-selector相关联

    Pod通过控制器实现应用的运维,如伸缩,升级等


    三:Deployment(无状态)

    Deployment主要功能有下面几个:

    • 支持ReplicaSet的所有功能
    • 支持发布的停止、继续
    • 支持滚动升级和回滚版本

    特点:

    1. 部署无状态应用,只关心数量,不论角色等,称无状态
    2. 管理Pod和ReplicaSet
    3. 具有上线部署、副本设定、滚动升级、回滚等功能
    4. 提供声明式更新,例如只更新一个新的Image
    5. 应用场景:web服务

    1. [root@master ~]# vim nginx-deployment.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: nginx-deployment
    6. labels:
    7. app: nginx
    8. spec:
    9. replicas: 3
    10. selector:
    11. matchLabels:
    12. app: nginx
    13. template:
    14. metadata:
    15. labels:
    16. app: nginx
    17. spec:
    18. containers:
    19. - name: nginx
    20. image: nginx:1.15.4
    21. ports:
    22. - containerPort: 80

    1. kubectl create -f nginx-deployment.yaml
    2. kubectl get pods,deploy,rs

    查看控制器

    kubectl edit deployment/nginx-deployment

    查看历史版本

    kubectl rollout history deployment/nginx-deployment


    四:ReplicaSet(RS) 

    ReplicaSet的主要作用是保证一定数量的pod正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和镜像版本的升降级。

    4.1ReplicaSet的资源清单文件

    1. apiVersion: apps/v1 # 版本号
    2. kind: ReplicaSet # 类型
    3. metadata: # 元数据
    4. name: # rs名称
    5. namespace: # 所属命名空间
    6. labels: #标签
    7. controller: rs
    8. spec: # 详情描述
    9. replicas: 3 # 副本数量
    10. selector: # 选择器,通过它指定该控制器管理哪些pod
    11. matchLabels: # Labels匹配规则
    12. app: nginx-pod
    13. matchExpressions: # Expressions匹配规则
    14. - {key: app, operator: In, values: [nginx-pod]}
    15. template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
    16. metadata:
    17. labels:
    18. app: nginx-pod
    19. spec:
    20. containers:
    21. - name: nginx
    22. image: nginx:1.17.1
    23. ports:
    24. - containerPort: 80

    在这里面,需要新了解的配置项就是spec下面几个选项:

    replicas:指定副本数量,其实就是当前rs创建出来的pod的数量,默认为1
    selector:选择器,它的作用是建立pod控制器和pod之间的关联关系,采用的Label Selector机制。在pod模板上定义label,在控制器上定义选择器,就可以表明当前控制器能管理哪些pod了
    template:模板,就是当前控制器创建pod所使用的模板板,里面其实就是前一章学过的pod的定义

    特点:

    • 解决Pod独立生命周期,保持Pod启动顺序和唯一性
    • 稳定,唯一的网络标识符,持久存储(例如: etcd 配置文件,节点地址发生变化,将无法使用)
    • 有序,优雅的部署和扩展、删除和终止(例如: mysql 主从关系,先启动主,再启动从)
    • 有序,滚动更新

    应用场景: 数据库

    4.2有状态和无状态的区别

    无状态:

    1. deployment认为所有的pod都是一样的
    2. 不用考虑顺序的要求
    3. 不用考虑在哪个node节点上运行
    4. 可以随意扩容和缩容

    有状态:

    1. 实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd, zookeeper
    2. 实例之间不对等的关系,以及依靠外部存储的应用。

    4.3常规service和无头服务区别

    service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
    Headless service无头服务: 不需要cluster-IP,直接绑定具体的Pod的IP(当Pod的IP地址是动态变化时,所以常用于绑定DNS访问)

    1. ①Cluster_ip
    2. ②NodePort:使用pod所在节点的IP和端口范围
    3. ③headless:直接使用pod 的ip暴露出去
    4. ④LoadBalancer:负载均衡(F5)
    5. ⑤hostport:直接使用宿主机的IP和端口范围

    ps:k8s暴露服务的方式主要就3种:ingress loadbalancer(SLB/ALB k8s集群外的负载均衡器Ng、haproxy、KONG、traefil等等)service

    4.4示例

    4.4.1先创建DNS资源​​​​​​​

    1. # vim pod.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: dns-test
    6. spec:
    7. containers:
    8. - name: busybox
    9. image: busybox:1.28.4
    10. args:
    11. - /bin/sh
    12. - -c
    13. - sleep 36000
    14. restartPolicy: Never

    1. 创建dns资源
    2. # kubectl create -f pod.yaml
    3. # kubectl get pods

    4.4.2再用statefulset控制器类型 创建nginx pod资源,并创建无头服务资源

    1. # vim sts.yaml
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: nginx
    6. labels:
    7. app: nginx
    8. spec:
    9. ports:
    10. - port: 80
    11. name: web
    12. clusterIP: None
    13. selector:
    14. app: nginx
    15. ---
    16. apiVersion: apps/v1
    17. kind: StatefulSet
    18. metadata:
    19. name: nginx-statefulset
    20. namespace: default
    21. spec:
    22. serviceName: nginx
    23. replicas: 3
    24. selector:
    25. matchLabels:
    26. app: nginx
    27. template:
    28. metadata:
    29. labels:
    30. app: nginx
    31. spec:
    32. containers:
    33. - name: nginx
    34. image: nginx:latest
    35. ports:
    36. - containerPort: 80

    1. # kubectl create -f sts.yaml
    2. 有状态化创建的pod,是自动进行打标签进行区分
    3. # kubectl get pods
    4. # kubectl get pods,svc
    5. 验证DNS解析
    6. # kubectl exec -it dns-test.sh
    7. 解析pod的唯一域名和自身的IP

    ​​​​​​​

    4.4.3总结

    StatefulSet与Deployment区别:

    StatefulSet创建的pod是有身份的!

    身份三要素:

    域名 nginx-statefulset-0.nginx
    主机名 nginx-statefulset-0
    存储 (PVC)​​​​​​​​​​​​​​​​​​​​​ 


    五:DaemonSet

    特点:

    在每一个Node上运行一个Pod
    新加入的Node也同样会自动运行一个Pod​​​​​​​

    应用场景:Agent、监控

    DaemonSet | Kubernetes​​​​​​​

    官方案例(监控)

    用DaemonSet 控制器类型创建nginx pod资源,没有指定副本replicats,它会根据node节点的个数创建,如果再新加一个node节点,也会给新node节点创建pod

    1. # vim ds.yaml
    2. apiVersion: apps/v1
    3. kind: DaemonSet
    4. metadata:
    5. name: nginx-deployment
    6. labels:
    7. app: nginx
    8. spec:
    9. selector:
    10. matchLabels:
    11. app: nginx
    12. template:
    13. metadata:
    14. labels:
    15. app: nginx
    16. spec:
    17. containers:
    18. - name: nginx
    19. image: nginx:1.15.4
    20. ports:
    21. - containerPort: 80

    1. # kubectl apply -f ds.yaml
    2. DaemonSet会在每个node节点都创建一个Pod
    3. # kubectl get pods
    4. # kubectl get pods -o wide
    5. 如果再新加一个node节点,也会给新node节点创建pod


    六:Job  

    Job分为普通任务(Job)和定时任务(CronJob)

    一次性执行

    应用场景:离线数据处理,视频解码等业务

    ​​​​​​Jobs | Kubernetes

    官方案例:应用大数据场景

    示例: 

    用job控制器类型创建资源,执行算圆周率的命令,保持后2000位,创建过程等同于在计算
    ,重试次数默认是6次,修改为4次,当遇到异常时Never状态会重启,所以要设定次数。

    1. # vim job.yaml
    2. apiVersion: batch/v1
    3. kind: Job
    4. metadata:
    5. name: pi
    6. spec:
    7. template:
    8. spec:
    9. containers:
    10. - name: pi
    11. image: perl:5.34.0
    12. command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
    13. restartPolicy: Never
    14. backoffLimit: 4

    1. 在node节点提前下载perl镜像,因为镜像比较大所以提前下载好
    2. node1 node2节点:
    3. # docker pull perl
    4. 创建过程等同于在计算
    5. # kubectl apply -f job.yaml
    6. job.batch/pi created
    7. 查看状态
    8. # kubectl get pods
    9. # kubectl describe pod pi-tkdlc
    10. 查看日志,看计算结果,结果输出到控制台
    11. # kubectl logs pi-tkdlc
    12. 3.141592653589793.............................................共2000

    查看日志,看计算结果,结果输出到控制台 


    七: CronJob 

    周期性任务,像Linux的Crontab一样。
    周期性任务

    应用场景:通知,备份

    ​​​​​​Running Automated Tasks with a CronJob | Kubernetes

    示例: 

    每隔一分钟输出一条信息,打印hello

    1. # vim cronjob.yaml
    2. apiVersion: batch/v1beta1
    3. kind: CronJob
    4. metadata:
    5. name: hello
    6. spec:
    7. schedule: "*/1 * * * *"
    8. jobTemplate:
    9. spec:
    10. template:
    11. spec:
    12. containers:
    13. - name: hello
    14. image: busybox
    15. args:
    16. - /bin/sh
    17. - -c
    18. - date; echo Hello from the Kubernetes cluster
    19. restartPolicy: OnFailure
    20. busybox 是linux内核镜像

    1. # kubectl create -f cronjob.yaml
    2. # kubectl get cronjob
    3. NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
    4. hello */1 * * * * False 0 25s
    5. # kubectl get pods
    6. 查看日志,内容输出到控制台
    7. # kubectl logs hello-1659577380-lfblb
    8. Mon Feb 17 05:29:09 UTC 2020
    9. Hello from the Kubernetes cluster
    10. 等待一分钟后又会再执行一次
    11. # kubectl get pods
    12. # kubectl logs hello-1659577380-lfblb
    13. 最后删除资源,不然第二天服务器宕机
    14. # kubectl delete -f cronjob.yaml


    八:Horizontal Pod Autoscaler(HPA) 

    Kubernetes期望可以实现通过监测Pod的使用情况,实现pod数量的自动调整,于是就产生了Horizontal Pod Autoscaler(HPA)这种控制器。

    HPA可以获取每个Pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA与之前的Deployment一样,也属于一种Kubernetes资源对象,它通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。

    接下来,来做一个实验

    8.1安装metrics-server

    1. # 安装git
    2. [root@master ~]# yum install git -y
    3. # 获取metrics-server, 注意使用的版本
    4. [root@master~]# git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server
    5. # 修改deployment, 注意修改的是镜像和初始化参数
    6. [root@master~]# cd /root/metrics-server/deploy/1.8+/
    7. [root@master 1.8+]# vim metrics-server-deployment.yaml
    8. 按图中添加下面选项
    9. hostNetwork: true
    10. image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
    11. args:
    12. - --kubelet-insecure-tls
    13. - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

    ​​​​​​​​​​​​​​

    1. # 安装metrics-server
    2. [root@k8s-master01 1.8+]# kubectl apply -f ./
    3. # 查看pod运行情况
    4. [root@k8s-master01 1.8+]# kubectl get pod -n kube-system
    5. metrics-server-6b976979db-2xwbj 1/1 Running 0 90s
    6. # 使用kubectl top node 查看资源使用情况
    7. [root@k8s-master01 1.8+]# kubectl top node
    8. NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
    9. k8s-master01 289m 14% 1582Mi 54%
    10. k8s-node01 81m 4% 1195Mi 40%
    11. k8s-node02 72m 3% 1211Mi 41%
    12. [root@k8s-master01 1.8+]# kubectl top pod -n kube-system
    13. NAME CPU(cores) MEMORY(bytes)
    14. coredns-6955765f44-7ptsb 3m 9Mi
    15. coredns-6955765f44-vcwr5 3m 8Mi
    16. etcd-master 14m 145Mi
    17. ...
    18. # 至此,metrics-server安装完成

    8.2准备deployment和servie 

    创建pc-hpa-pod.yaml文件:

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: nginx
    5. namespace: dev
    6. spec:
    7. strategy: # 策略
    8. type: RollingUpdate # 滚动更新策略
    9. replicas: 1
    10. selector:
    11. matchLabels:
    12. app: nginx-pod
    13. template:
    14. metadata:
    15. labels:
    16. app: nginx-pod
    17. spec:
    18. containers:
    19. - name: nginx
    20. image: nginx:1.17.1
    21. resources: # 资源配额
    22. limits: # 限制资源(上限)
    23. cpu: "1" # CPU限制,单位是core数
    24. requests: # 请求资源(下限)
    25. cpu: "100m" # CPU限制,单位是core数
    1. # 创建service
    2. [root@k8s-master01 1.8+]# kubectl create -f pc-hpa-pod.yaml
    1. # 查看
    2. [root@k8s-master01 1.8+]# kubectl get deployment,pod,svc -n dev
    3. NAME READY UP-TO-DATE AVAILABLE AGE
    4. deployment.apps/nginx 1/1 1 1 47s
    5. NAME READY STATUS RESTARTS AGE
    6. pod/nginx-7df9756ccc-bh8dr 1/1 Running 0 47s
    7. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    8. service/nginx NodePort 10.101.18.29 <none> 80:31830/TCP 35s

    8.3部署HPA 

    1. apiVersion: autoscaling/v1
    2. kind: HorizontalPodAutoscaler
    3. metadata:
    4. name: pc-hpa
    5. namespace: dev
    6. spec:
    7. minReplicas: 1 #最小pod数量
    8. maxReplicas: 10 #最大pod数量
    9. targetCPUUtilizationPercentage: 3 # CPU使用率指标
    10. scaleTargetRef: # 指定要控制的nginx信息
    11. apiVersion: apps/v1
    12. kind: Deployment
    13. name: nginx
    1. # 创建hpa
    2. [root@k8s-master01 1.8+]# kubectl create -f pc-hpa.yaml
    3. horizontalpodautoscaler.autoscaling/pc-hpa created
    4. # 查看hpa
    5. [root@k8s-master01 1.8+]# kubectl get hpa -n dev
    6. NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
    7. pc-hpa Deployment/nginx 0%/3% 1 10 1 62s

    8.4测试

    使用压测工具对service地址192.168.223.30:31830进行压测,然后通过控制台查看hpa和pod的变化

    hpa变化

    1. [root@k8s-master01 ~]# kubectl get hpa -n dev -w
    2. NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
    3. pc-hpa Deployment/nginx 0%/3% 1 10 1 4m11s
    4. pc-hpa Deployment/nginx 0%/3% 1 10 1 5m19s
    5. pc-hpa Deployment/nginx 22%/3% 1 10 1 6m50s
    6. pc-hpa Deployment/nginx 22%/3% 1 10 4 7m5s
    7. pc-hpa Deployment/nginx 22%/3% 1 10 8 7m21s
    8. pc-hpa Deployment/nginx 6%/3% 1 10 8 7m51s
    9. pc-hpa Deployment/nginx 0%/3% 1 10 8 9m6s
    10. pc-hpa Deployment/nginx 0%/3% 1 10 8 13m
    11. pc-hpa Deployment/nginx 0%/3% 1 10 1 14m

    deployment变化 

    1. [root@k8s-master01 ~]# kubectl get deployment -n dev -w
    2. NAME READY UP-TO-DATE AVAILABLE AGE
    3. nginx 1/1 1 1 11m
    4. nginx 1/4 1 1 13m
    5. nginx 1/4 1 1 13m
    6. nginx 1/4 1 1 13m
    7. nginx 1/4 4 1 13m
    8. nginx 1/8 4 1 14m
    9. nginx 1/8 4 1 14m
    10. nginx 1/8 4 1 14m
    11. nginx 1/8 8 1 14m
    12. nginx 2/8 8 2 14m
    13. nginx 3/8 8 3 14m
    14. nginx 4/8 8 4 14m
    15. nginx 5/8 8 5 14m
    16. nginx 6/8 8 6 14m
    17. nginx 7/8 8 7 14m
    18. nginx 8/8 8 8 15m
    19. nginx 8/1 8 8 20m
    20. nginx 8/1 8 8 20m
    21. nginx 1/1 1 1 20m

    pod变化

    1. [root@k8s-master01 ~]# kubectl get pods -n dev -w
    2. NAME READY STATUS RESTARTS AGE
    3. nginx-7df9756ccc-bh8dr 1/1 Running 0 11m
    4. nginx-7df9756ccc-cpgrv 0/1 Pending 0 0s
    5. nginx-7df9756ccc-8zhwk 0/1 Pending 0 0s
    6. nginx-7df9756ccc-rr9bn 0/1 Pending 0 0s
    7. nginx-7df9756ccc-cpgrv 0/1 ContainerCreating 0 0s
    8. nginx-7df9756ccc-8zhwk 0/1 ContainerCreating 0 0s
    9. nginx-7df9756ccc-rr9bn 0/1 ContainerCreating 0 0s
    10. nginx-7df9756ccc-m9gsj 0/1 Pending 0 0s
    11. nginx-7df9756ccc-g56qb 0/1 Pending 0 0s
    12. nginx-7df9756ccc-sl9c6 0/1 Pending 0 0s
    13. nginx-7df9756ccc-fgst7 0/1 Pending 0 0s
    14. nginx-7df9756ccc-g56qb 0/1 ContainerCreating 0 0s
    15. nginx-7df9756ccc-m9gsj 0/1 ContainerCreating 0 0s
    16. nginx-7df9756ccc-sl9c6 0/1 ContainerCreating 0 0s
    17. nginx-7df9756ccc-fgst7 0/1 ContainerCreating 0 0s
    18. nginx-7df9756ccc-8zhwk 1/1 Running 0 19s
    19. nginx-7df9756ccc-rr9bn 1/1 Running 0 30s
    20. nginx-7df9756ccc-m9gsj 1/1 Running 0 21s
    21. nginx-7df9756ccc-cpgrv 1/1 Running 0 47s
    22. nginx-7df9756ccc-sl9c6 1/1 Running 0 33s
    23. nginx-7df9756ccc-g56qb 1/1 Running 0 48s
    24. nginx-7df9756ccc-fgst7 1/1 Running 0 66s
    25. nginx-7df9756ccc-fgst7 1/1 Terminating 0 6m50s
    26. nginx-7df9756ccc-8zhwk 1/1 Terminating 0 7m5s
    27. nginx-7df9756ccc-cpgrv 1/1 Terminating 0 7m5s
    28. nginx-7df9756ccc-g56qb 1/1 Terminating 0 6m50s
    29. nginx-7df9756ccc-rr9bn 1/1 Terminating 0 7m5s
    30. nginx-7df9756ccc-m9gsj 1/1 Terminating 0 6m50s
    31. nginx-7df9756ccc-sl9c6 1/1 Terminating 0 6m50s

     

  • 相关阅读:
    【AI视野·今日CV 计算机视觉论文速览 第258期】Mon, 2 Oct 2023
    腾讯汤道生:大模型只是起点,产业落地是AI更大的应用场景
    用AVR128单片机的音乐门铃
    基于stm32单片机厨房安全环境天然气煤气监测系统
    多模态说话人开源项目3D-Speaker
    关于嵌入式的技术竞争力需要花点时间整理一下给大家
    嘉立创使用技巧
    系统分析师备考经验分享:分阶段、分重点
    【技术】烦死了,HTML 怎么转图片?
    正则表达式
  • 原文地址:https://blog.csdn.net/ver_mouth__/article/details/126147174