• kubernetes之Deployment


    1.什么是Deployment?

    Deployment(简写为deploy)是kubernetes控制器的又一种实现,构建于ReplicasSet控制器之上,可以为Pod和ReplicaSet提供声明式更新。相比较而言,Pod和ReplicaSet很少用来直接使用,而是借助于控制器来使用。Deployment Controller核心功能也是保证Pod资源的正常使用,大部分功能调用ReplicaSet来实现。

    1.2我们只需要描述Deployment中目标Pod期望状态,而Deployment控制器以控制更改为实际状态,使其变成期望状态。我们不需要直接使用Pod和ReplicaSet来实现,Deployment控制器在ReplicaSet的基础上增加了部分特性:

    1.事件和状态查看: 可以通过特定的命令查看Deployment对象的更新进度和状态;

    2.版本记录: 将Deployment对象的历史更新操作都进行保存,以便于后续执行回滚操作使用;

    3.多种更新方案: Recreate重建,可以实现单批次更新所有的Pod。RollingUpdate可以实现多批次替换Pod至新版本。

    2.Deployment的构成部分

    Deployment是标准的k8s资源,Deployment构建于ReplicaSet之上,spec字段嵌套了包含了replicaset控制器支持的selector、replicas、template、minReadySeconds

    2.1Selector: 标签选择器,匹配并关联Pod,并对其受控制的Pod进行管理;

    2.2Replicas: 期望的Pod的副本数,期望在集群所运行的Pod对象的数量;

    2.3template: Pod的模板;实际上定义了Pod的内容,相当于把一个Pod的描述信息以模板的方式嵌套在ReplicaSet;

    3.Deployment的资源规范

    1. apiVersion: apps/v1 # API群组及版本;
    2. kind: Deployment # 资源类型;
    3. metadata: # Pod元数据;
    4. name: # 资源名称,在作用域中要唯一;
    5. namespace: # 名称空间,Deployment隶属名称空间级别;
    6. spec:
    7. minReadySeconds: <integer> # Pod就绪后多少秒内任一容器无Crash方可为就绪;
    8. replicas: <integer> # 期望的Pod副本数,默认为1;
    9. selector: # 标签选择器,必须匹配template字段中Pod模板中的标签;
    10. template: # Pod模板对象;
    11. revisionHistoryLimit: <integer> # 滚动更新历史记录数量,默认为10;
    12. strategy: # 滚动更新策略;
    13. type: # 滚动更新类型,可用值有Recreate和Rollingupdate;
    14. rollingUpdaate: # 滚动更新参数,专用于RollingUpdate类型;
    15. maxSurge: # 更新起见可比期望的Pod数量多出的数量和比例;
    16. maxUnavailable: # 更新期间可比期望的Pod数量缺少的数量或比例;
    17. progressDeadlineSeconds: <integer> # 滚动更新故障超时时长,默认为600;
    18. paused: # 是否暂停部署过程;
    19. 4.Deployment的配置示例:

      1. # 以Nginx应用为示例配置
      2. root@kubernetes-master01:~# cat nginx-deployment-test.yaml
      3. apiVersion: apps/v1 # 资源群组
      4. kind: Deployment # 资源类型
      5. metadata: # 元数据
      6. name: deployment-nginx-test # Pod名称
      7. namespace: default # Pod所在的名称空间
      8. spec:
      9. replicas: 2 # Pod的副本数
      10. selector: # 标签选择器
      11. matchLabels:
      12. app: nginx-deployment # Pod的标签
      13. template: # 定义Pod的模板
      14. metadata: #
      15. labels: # 标签同上要一致
      16. app: nginx-deployment
      17. spec: # 定义容器的
      18. containers:
      19. - name: nginx # 容器名称
      20. image: nginx # 容器镜像
      21. imagePullPolicy: IfNotPresent # 容器拉取策略
      22. ports: # 定义容器的端口
      23. - name: http
      24. containerPort: 80 # 容器端口为80
      25. #
      26. root@kubernetes-master01:~# kubectl apply -f nginx-deployment-test.yaml
      27. deployment.apps/deployment-nginx-test created

      4.1查看Pod,Deployment的名称-Replicaset的名称-随机字符串hash值是由Deployment Controller自动生成。Pod对应的名称遵循ReplicaSet控制器的命名格式,它以Replicaset控制器的名称为签注,后跟5位随机字符。

      1. root@kubernetes-master01:~/cloud-Native/deployment/replicas# kubectl get pods
      2. NAME READY STATUS RESTARTS AGE
      3. deployment-nginx-test-dd5bdc67f-b5dlz 1/1 Running 0 6m12s
      4. deployment-nginx-test-dd5bdc67f-t94j7 1/1 Running 0 6m12s
      5. # NAME: 列出了集群中Deployment的名称。
      6. # READY: 显示应用程序的可用的"副本数"显示的模式是"就绪个数/期望个数"
      7. # UP-TO-DATE: 标识已经达到期望状态的Pod的副本数量。
      8. # AVAILABLE: 表示当前处于可用状态的Pod的数量。

      4.2查看replicaset,Deployment控制器会自动创建相关的ReplicaSet控制器资源,并以[DEPLOYMENT-NAME]-[POD-TEMPLATE-HASH-VALUE]格式为其命名,其中的hash值由Deployment控制器自动生成,由Deployment创建的ReplicaSet对象会自动使用相同的标签选择器。

      1. root@kubernetes-master01:~# kubectl get replicaset deployment-nginx-test-dd5bdc67f
      2. NAME DESIRED CURRENT READY AGE
      3. deployment-nginx-test-dd5bdc67f 2 2 2 9m34s

      5.为Pod创建Service资源以实现负载均衡。

      1. root@kubernetes-master01:~# cat nginx-service-test.yaml
      2. apiVersion: v1
      3. kind: Service
      4. metadata:
      5. name: nginx-deployment-test
      6. namespace: default
      7. spec:
      8. type: ClusterIP # 类型为ClusterIP
      9. selector: # 标签选择器跟Pod的标签相匹配,才能被识别为后端端点。
      10. app: nginx-deployment
      11. ports:
      12. - name: http
      13. protocol: TCP
      14. port: 80
      15. targetPort: 80
      16. #
      17. root@kubernetes-master01:~# kubectl apply -f nginx-service-test.yaml
      18. service/nginx-deployment-test created

      6.进行访问测试

      6.1我提前修改了Nginx的index文件。方便效果。

      1. root@kubernetes-master01:~# echo "nginx-1-haitang.net" > /usr/share/nginx/html/index.html
      2. root@kubernetes-master01:~# echo "nginx2-haitang.com" > /usr/share/nginx/html/index.html

      6.2访问Service的IP,因为是ClusterIP,只能在集群内访问。也是没有问题的。

      1. root@kubernetes-master01:~# curl 10.107.246.117
      2. nginx2-haitang.com
      3. root@kubernetes-master01:~# curl 10.107.246.117
      4. nginx-1-haitang.net
      5. root@kubernetes-master01:~# curl 10.107.246.117
      6. nginx2-haitang.com
      7. root@kubernetes-master01:~# curl 10.107.246.117
      8. nginx-1-haitang.net

      7.Pod的伸缩

      7.1比如现在两个副本有点无法应对突发的流量,可以通过命令的方式修改replicas也可以通过修改配置文件的方式去修改。

      1.1# 命令方式来伸缩
      root@kubernetes-master01:~# kubectl scale deployment deployment-nginx-test --replicas=3
      deployment.apps/deployment-nginx-test scaled
      
      1.2# 缩容的话就是=多少副本数即可。 例如=2
      root@kubernetes-master01:~# kubectl scale deployment deployment-nginx-test --replicas=2
      
      1.3# 修改配置文件vim nginx-deployment-test.yaml 修改spec字段的replicas即可。

      7.2伸缩完成后,Service就会发现带有同样标签的Pod,Pod就绪后加入到后端的可用端点。

      再次访问测试。也是没有问题。

      1. root@kubernetes-master01:~# curl 10.107.246.117
      2. nginx2-haitang.com
      3. root@kubernetes-master01:~# curl 10.107.246.117
      4. html>
      5. <html>
      6. <head>
      7. <title>Welcome to nginx!title>
      8. <style>
      9. html { color-scheme: light dark; }
      10. body { width: 35em; margin: 0 auto;
      11. font-family: Tahoma, Verdana, Arial, sans-serif; }
      12. style>
      13. head>
      14. <body>
      15. <h1>Welcome to nginx!h1>
      16. <p>If you see this page, the nginx web server is successfully installed and
      17. working. Further configuration is required.p>
      18. <p>For online documentation and support please refer to
      19. <a href="http://nginx.org/">nginx.orga>.<br/>
      20. Commercial support is available at
      21. <a href="http://nginx.com/">nginx.coma>.p>
      22. <p><em>Thank you for using nginx.em>p>
      23. body>
      24. html>
      25. root@kubernetes-master01:~# curl 10.107.246.117
      26. nginx-1-haitang.net

      7.3也可以通过describe命令来查看Events事件。

      1. root@kubernetes-master01:~# kubectl describe deploy deployment-nginx-test
      2. Pod Template:
      3. Labels: app=nginx-deployment
      4. Containers:
      5. nginx:
      6. Image: nginx
      7. Port: 80/TCP
      8. Host Port: 0/TCP
      9. Environment: <none>
      10. Mounts: <none>
      11. Volumes: <none>
      12. Conditions:
      13. Type Status Reason
      14. ---- ------ ------
      15. Progressing True NewReplicaSetAvailable
      16. Available True MinimumReplicasAvailable
      17. OldReplicaSets: <none>
      18. NewReplicaSet: deployment-nginx-test-dd5bdc67f (3/3 replicas created)
      19. Events:
      20. Type Reason Age From Message
      21. ---- ------ ---- ---- -------
      22. Normal ScalingReplicaSet 36s deployment-controller Scaled up replica set deployment-nginx-test-dd5bdc67f to 3

      8.故障测试。

      8.1现在删除Pod会发生什么?

      1. root@kubernetes-master01:~# kubectl delete pods deployment-nginx-test-dd5bdc67f-2vggw
      2. pod "deployment-nginx-test-dd5bdc67f-2vggw" deleted
      3. # 有控制器管理的Pod删除会自动重建,没有控制器管理的Pod删除就是删除了不可能会自动重建。我们创建的Pod受控于Deployment Controller。所以能重建。
      4. root@kubernetes-master01:~# kubectl get pods
      5. deployment-nginx-test-dd5bdc67f-2vggw 1/1 Running 0 4s
      6. deployment-nginx-test-dd5bdc67f-lc6nm 1/1 Running 0 4s

    20. 相关阅读:
      2022年最新前端面试题
      centos 7环境部署百度开源apache doris 1.1
      EF7创建模型继承映射篇
      互联网医院系统源码:预约问诊小程序的开发方案详解
      mybatis plus遇到invalid bound statement(not found)报错
      OpenWrt kernel install分析(2)
      JSON数据格式
      人工智能基础:机器学习常见的算法介绍
      Triton推理服务器吞吐量测试
      兔老大的系统设计(一)健康度系统
    21. 原文地址:https://blog.csdn.net/JavaShark/article/details/126013570