• 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的资源规范

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

    4.Deployment的配置示例:

    # 以Nginx应用为示例配置
    root@kubernetes-master01:~# cat nginx-deployment-test.yaml 
    apiVersion: apps/v1     # 资源群组
    kind: Deployment        # 资源类型
    metadata:               # 元数据
      name: deployment-nginx-test  # Pod名称
      namespace: default           # Pod所在的名称空间
    spec:
      replicas: 2                  # Pod的副本数
      selector:                    # 标签选择器
        matchLabels:
          app: nginx-deployment     # Pod的标签
    
      template:                      # 定义Pod的模板
        metadata:                    # 
          labels:                    # 标签同上要一致
            app: nginx-deployment
        spec:                         # 定义容器的
          containers:                 
          - name: nginx                # 容器名称
            image: nginx               # 容器镜像
            imagePullPolicy: IfNotPresent # 容器拉取策略
            ports:                     # 定义容器的端口
            - name: http         
              containerPort: 80          # 容器端口为80
    
    # 
    root@kubernetes-master01:~# kubectl apply -f nginx-deployment-test.yaml
    deployment.apps/deployment-nginx-test created
    
    折叠

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

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

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

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

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

    root@kubernetes-master01:~# cat  nginx-service-test.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-deployment-test
      namespace: default
    spec:
      type: ClusterIP  # 类型为ClusterIP
      selector:    # 标签选择器跟Pod的标签相匹配,才能被识别为后端端点。
        app: nginx-deployment
      ports:
      - name: http
        protocol: TCP
        port: 80  
        targetPort: 80
    # 
    root@kubernetes-master01:~# kubectl apply -f nginx-service-test.yaml 
    service/nginx-deployment-test created
    

    6.进行访问测试

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

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

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

    root@kubernetes-master01:~# curl 10.107.246.117
    nginx2-haitang.com
    root@kubernetes-master01:~# curl 10.107.246.117
    nginx-1-haitang.net
    root@kubernetes-master01:~# curl 10.107.246.117
    nginx2-haitang.com
    root@kubernetes-master01:~# curl 10.107.246.117
    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就绪后加入到后端的可用端点。
    再次访问测试。也是没有问题。

    root@kubernetes-master01:~# curl 10.107.246.117
    nginx2-haitang.com
    root@kubernetes-master01:~# curl 10.107.246.117
    
    
    
    Welcome to nginx!
    
    
    
    

    Welcome to nginx!

    If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

    For online documentation and support please refer to nginx.org.
    Commercial support is available at nginx.com.

    Thank you for using nginx.

    root@kubernetes-master01:~# curl 10.107.246.117 nginx-1-haitang.net
    折叠

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

    root@kubernetes-master01:~# kubectl describe deploy deployment-nginx-test  
    Pod Template:
      Labels:  app=nginx-deployment
      Containers:
       nginx:
        Image:        nginx
        Port:         80/TCP
        Host Port:    0/TCP
        Environment:  
        Mounts:       
      Volumes:        
    Conditions:
      Type           Status  Reason
      ----           ------  ------
      Progressing    True    NewReplicaSetAvailable
      Available      True    MinimumReplicasAvailable
    OldReplicaSets:  
    NewReplicaSet:   deployment-nginx-test-dd5bdc67f (3/3 replicas created)
    Events:
      Type    Reason             Age   From                   Message
      ----    ------             ----  ----                   -------
      Normal  ScalingReplicaSet  36s   deployment-controller  Scaled up replica set deployment-nginx-test-dd5bdc67f to 3
    
    折叠

    8.故障测试。

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

    root@kubernetes-master01:~# kubectl delete pods deployment-nginx-test-dd5bdc67f-2vggw  
    pod "deployment-nginx-test-dd5bdc67f-2vggw" deleted
    
    # 有控制器管理的Pod删除会自动重建,没有控制器管理的Pod删除就是删除了不可能会自动重建。我们创建的Pod受控于Deployment Controller。所以能重建。
    root@kubernetes-master01:~# kubectl get pods
    deployment-nginx-test-dd5bdc67f-2vggw   1/1     Running   0          4s
    deployment-nginx-test-dd5bdc67f-lc6nm   1/1     Running   0          4s
    
  • 相关阅读:
    论文分享 | 智能放牧无人机&多旋翼无人机发展趋势
    授权规则及规则持久化
    linux安装nginx1.9.9
    【护网急训2】帕鲁杯应急响应靶场
    java8中“::”双冒号的功能简介说明
    基于Django的博客系统之登录增加忘记密码(八)
    【Docker容器】Docker容器日志查询工具dozzle的安装与使用
    Virtual Serial Port Driver Pro 10.0.992 安装以及使用教程
    软考-软件设计师 - 第12章 软件系统分析与设计【附补充常考知识点】
    Redis快速上手篇八(redission完善分布式锁)
  • 原文地址:https://www.cnblogs.com/xunweidezui/p/16522331.html