Deployment的管理与使用(6)

介 绍 Deployment 相 关 概 念 , 包 括 什 么 是 控 制 器 , 如 何 创 建Deployment,什么是kubectl,如何进行deployment的扩容和升级等。deployment是最常用的控制器。
 描述kubernetes中各种控制器
 创建和使用deployment
 使用kubectl命令行工具

1. Kubernetes管理对象

Kubernetes管理对象 (1)

  • Pod(k8s管理的最小单元)
     Kubernetes基本管理单元,每个Pod是一个或多个容器的一组集合。
     一个Pod作为一个整体运行在一个节点(node)上。
     Pod内的容器共享存储和网络
注:企业中很少通过直接建立pod来进行管理。因为无法单独对pod进行管理,通常利用建立控制器来管理,可以监控pod状态。
  • ReplicationController(简称RC,用于控制副本数量,弹性扩展处理的能力。现在已经不怎么使用了,现在通常使用新一代的rc即RS
     Kubernetes需要管理大量的Pod,而显而易见的是通常情况下一个应用不会以单独的一个Pod完成。比较常见的情况是使用大量的Pod组成一个简单应用。管理这些大量的Pod的一个方式就是RC。
     RC可以指定Pod的副本数量,并且在其中有Pod故障时可以自动拉起新的Pod,大大简化了管理
    难度。

Kubernetes管理对象 (2)

  • ReplicaSet(简称RS)
     ReplicaSet是新一代的RC,主要功能和RC一样,维持Pod的数量稳定,指定Pod的运行位置等,使用方法也相似,主要区别是更新了api,支持更多功能。
    ReplicaSet不建议直接使用,而是用更上层的概念Deployment调用ReplicaSet。
  • Deployment
     目前最常用的控制器就是Deployment,创建Deployment时也会自动创建ReplicaSet
     Deployment可以管理一个或多个RS,并且通过RS来管理Pod。

注意:创建多个pod时候,1.先创建deployment。2.deployment自动创建RS。3.RS管理POD的副本数量。
不适用RS直接控制POD的原因在于,RS不仅可以控制POD的数量,还可以对POD版本进行升级和回退。

Kubernetes管理对象 (3)

  • 从小到大的管理逻辑
    容器<Pod<ReplicaSet<Deployment
  • 通常情况下
     Pod中包含一个容器,或关系特别紧密的几个容器。
     一个ReplicaSet中包含多个相同的Pod。
     Deployment中包含一个或几个不同的RS


    image.png

2. 创建Deployment

两种方法:1命令创建 2yaml文件创建
1)命令行接口 - Kubectl
  • 在 Kubernetes 中的操作很多都是用 kubectl 来完成 , 通过其命令可以管理
    Deployment,Replicaset,ReplicationController,Pod等,进行操作,扩容,
    删除等等全生命周期操作。同时可以对管理对象进行查看或者监控资源使用情况。
  • Kubectl的语法
kubectl [command] [TYPE] [NAME] [flags]

 Command:指定你希望进行的操作,如create,get,describe,delete等。
 TYPE:指定操作对象的类型,如deployment,RS,Pod等
通过 kubectl api-resources命令可以查看资源类型
 NAME:指定对象的名字
 Flags: 可选的标志位 (如 : -o wide -n cube-system等)

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   23h   v1.14.1
k8s-node1    Ready    <none>   22h   v1.14.1
k8s-node2    Ready    <none>   22h   v1.14.1
[root@k8s-master ~]# kubectl get nodes k8s-master
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   23h   v1.14.1
[root@k8s-master ~]# kubectl get nodes k8s-master -o wide
NAME         STATUS   ROLES    AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION          CONTAINER-RUNTIME
k8s-master   Ready    master   23h   v1.14.1   192.168.227.10   <none>        CentOS Linux 7 (Core)   3.10.0-693.el7.x86_64   docker://18.6.2
[root@k8s-master ~]# kubectl get nodes k8s-master -w  //试试监控状态变化 w=watch
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   23h   v1.14.1
Kubectl
kubectl create deployment mydep --image=nginx
Command:Create TYPE:deployment NAME:mydep flags:--image=nginx
创建资源 资源类型是deployment 资源名称是mydep 创建资源使用的镜像是nginx
  • 常用Command:
     Create:创建资源
     Apply:应用资源的配置变更,也可以代替create创建新的资源
     Get:查看资源
     Describe:查看资源的详细描述
     Delete:删除资源

示例:展示的deployment的创建,验证了会同事创建rs和pod

[root@k8s-master ~]# kubectl create deployment mydep --image=nginx
deployment.apps/mydep created
[root@k8s-master ~]# kubectl get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
mydep   1/1     1            1           52s
[root@k8s-master ~]# kubectl get deployments -owide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR
mydep   1/1     1            1           79s   nginx        nginx    app=mydep
[root@k8s-master ~]# kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
mydep-65bbdb4c9f   1         1         1       108s
[root@k8s-master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
mydep-65bbdb4c9f-swgvz   1/1     Running   0          113s
[root@k8s-master ~]# kubectl get pod -owide
NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE        NOMINATED NODE   READINESS GATES
mydep-65bbdb4c9f-swgvz   1/1     Running   0          2m33s   10.244.1.2   k8s-node1   <none>           <none>
[root@k8s-master ~]#
2)使用yaml文件创建Deployment (1)
规范***
  • yaml文件对大小写敏感
  • 使用缩进表示层级关系(严格)
  • 缩进时候不能使用tab键,必须使用空格表示缩进(空格数量没有限制,但一般习惯一个层级空2格)
  • 用“#”号进行注释
  • 字符可以不用引号括起来
  • 一般用键值对描述,用冒号空格来分割“: ”
  • 减号+空格 "- "表示列表项
apiVersion: apps/v1   //通过 api-resources查到
kind: Deployment  //通过 api-resources查到
metadata:
  name: nginx-deployment  //deployment的名字
  labels:
    app: nginx   //给deployment打一个标签
spec:
  replicas: 3   //3)创建3个nginx同样的pod
  selector:
    matchLabels:
      app: nginx       //2)挑选出 nginx这个标签
  template:
    metadata:
      labels:
        app: nginx    //1) 给pod 打上标签 交nginx
    spec:    //当前的规范
      containers:    // POD中跑的是容器
      - name: nginx     //容器的名字是nginx
        image: nginx:1.14.2   //容器的版本是 1.14.2
        ports:
        - containerPort: 80    //容器使用的端口是80端口

编辑一个yaml文件

[root@k8s-node1 ~]# cat > /root/deployment.yaml << EOF
> apiVersion: apps/v1
> kind: Deployment
> metadata:
>   name: nginx-deployment
>   labels:
>     app: nginx
> spec:
>   replicas: 3
>   selector:
>     matchLabels:
>       app: nginx
>   template:
>     metadata:
>       labels:
>         app: nginx
>     spec:
>       containers:
>       - name: nginx
>         image: nginx:1.7.9
>         ports:
>         - containerPort: 80
> EOF
2)使用yaml文件创建Deployment (2)
[root@k8s-master ~]# kubectl apply -f deploy.yaml 
deployment.apps/nginx-deployment created
[root@k8s-master ~]# k get rs
NAME                         DESIRED   CURRENT   READY   AGE
mydep-65bbdb4c9f             1         1         1       33m
nginx-deployment-6dd86d77d   3         3         0       10s
[root@k8s-master ~]# k get pods
NAME                               READY   STATUS              RESTARTS   AGE
mydep-65bbdb4c9f-swgvz             1/1     Running             0          34m
nginx-deployment-6dd86d77d-74gql   1/1     Running             0          27s
nginx-deployment-6dd86d77d-cs4l9   0/1     ContainerCreating   0          27s
nginx-deployment-6dd86d77d-jsf2g   0/1     ContainerCreating   0          27s
[root@k8s-master ~]# k get pods -owide
NAME                               READY   STATUS              RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
mydep-65bbdb4c9f-swgvz             1/1     Running             0          34m   10.244.1.2   k8s-node1   <none>           <none>
nginx-deployment-6dd86d77d-74gql   1/1     Running             0          35s   10.244.1.3   k8s-node1   <none>           <none>
nginx-deployment-6dd86d77d-cs4l9   0/1     ContainerCreating   0          35s   <none>       k8s-node2   <none>           <none>
nginx-deployment-6dd86d77d-jsf2g   1/1     Running             0          35s   10.244.2.2   k8s-node2   <none>           <none>
[root@k8s-master ~]#
2)Yaml文件格式 (1)
  • apiVersion:版本号,固定为apps/v1,如果使 用 1.9.0 以 前 版 本 的 kubernetes , 填 写apps/v1beta2
  • Kind: 类型,选择创建资源类型,可以填写pod,replicaset等
  • Metadata:元数据,其中name项指定了名称,label项指定标签。
  • Spec:deployment规格,其中replicas指定pod副本数量,选择器选择标签匹配为app:nginx

3 Deployment升级和弹性伸缩

3.1弹性伸缩2种方式:1)命令2)yaml文件

命令

[root@k8s-master ~]# kubectl scale deployment mydep --replicas=3
deployment.extensions/mydep scaled
[root@k8s-master ~]# k get pods
NAME                               READY   STATUS    RESTARTS   AGE
mydep-65bbdb4c9f-bvwmp             1/1     Running   0          26s
mydep-65bbdb4c9f-sswdr             1/1     Running   0          26s
mydep-65bbdb4c9f-swgvz             1/1     Running   0          3h48m
nginx-deployment-6dd86d77d-74gql   1/1     Running   0          3h14m
nginx-deployment-6dd86d77d-cs4l9   1/1     Running   0          3h14m
nginx-deployment-6dd86d77d-jsf2g   1/1     Running   0          3h14m

yaml文件
扩:修改/root/deploy.yaml, replicas: 3修改为 replicas: 5。重新apply
缩:修改/root/deploy.yaml, replicas: 5修改为 replicas: 2。重新apply

[root@k8s-master ~]# k get pods
NAME                               READY   STATUS    RESTARTS   AGE
mydep-65bbdb4c9f-bvwmp             1/1     Running   0          26s
mydep-65bbdb4c9f-sswdr             1/1     Running   0          26s
mydep-65bbdb4c9f-swgvz             1/1     Running   0          3h48m
nginx-deployment-6dd86d77d-74gql   1/1     Running   0          3h14m
nginx-deployment-6dd86d77d-cs4l9   1/1     Running   0          3h14m
nginx-deployment-6dd86d77d-jsf2g   1/1     Running   0          3h14m
[root@k8s-master ~]# vi /root/deploy.yaml
[root@k8s-master ~]# kubectl apply -f deploy.yaml 
deployment.apps/nginx-deployment configured
[root@k8s-master ~]# kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
mydep-65bbdb4c9f-bvwmp             1/1     Running   0          4m16s
mydep-65bbdb4c9f-sswdr             1/1     Running   0          4m16s
mydep-65bbdb4c9f-swgvz             1/1     Running   0          3h52m
nginx-deployment-6dd86d77d-46kmj   1/1     Running   0          23s
nginx-deployment-6dd86d77d-4hq4w   1/1     Running   0          23s
nginx-deployment-6dd86d77d-74gql   1/1     Running   0          3h18m
nginx-deployment-6dd86d77d-cs4l9   1/1     Running   0          3h18m
nginx-deployment-6dd86d77d-jsf2g   1/1     Running   0          3h18m
[root@k8s-master ~]# vi deploy.yaml 
[root@k8s-master ~]# kubectl apply -f deploy.yaml 
deployment.apps/nginx-deployment configured
[root@k8s-master ~]# kubectl get pod
NAME                               READY   STATUS    RESTARTS   AGE
mydep-65bbdb4c9f-bvwmp             1/1     Running   0          5m3s
mydep-65bbdb4c9f-sswdr             1/1     Running   0          5m3s
mydep-65bbdb4c9f-swgvz             1/1     Running   0          3h53m
nginx-deployment-6dd86d77d-74gql   1/1     Running   0          3h19m
nginx-deployment-6dd86d77d-jsf2g   1/1     Running   0          3h19m

缩的动作时机就是杀pod的动作,可以设置执行缩(kill)的时间,比如30秒后进行缩的动作。保证存量进程可以在这段时间内继续执行。

  • delete掉一个pod以验证rs对pod数量的监控和维护的功能
    1)由于rs设置了nginx-deployment·的副本数量是2,所以当一个delete掉后rs会自动启动以保证pod数据量满足rs要求。
    2)POD的名字和ip以及node都会放生变化。因为恢复pod的动作相当于重建pod的动作。pod是不稳定的,ip node 名字,可变化。
    3)控制器(deployment)保持副本数量的要求。
    总结:rs保证了弹性伸缩的能力的
[root@k8s-master ~]# kubectl get pods -o wide 
NAME                               READY   STATUS    RESTARTS   AGE     IP           NODE        NOMINATED NODE   READINESS GATES
mydep-65bbdb4c9f-bvwmp             1/1     Running   0          13m     10.244.1.4   k8s-node1   <none>           <none>
mydep-65bbdb4c9f-sswdr             1/1     Running   0          13m     10.244.2.4   k8s-node2   <none>           <none>
mydep-65bbdb4c9f-swgvz             1/1     Running   0          4h1m    10.244.1.2   k8s-node1   <none>           <none>
nginx-deployment-6dd86d77d-74gql   1/1     Running   0          3h27m   10.244.1.3   k8s-node1   <none>           <none>
nginx-deployment-6dd86d77d-jsf2g   1/1     Running   0          3h27m   10.244.2.2   k8s-node2   <none>           <none>
[root@k8s-master ~]# kubectl delete pod nginx-deployment-6dd86d77d-74gql
pod "nginx-deployment-6dd86d77d-74gql" deleted
[root@k8s-master ~]# kubectl get pods -o wide 
NAME                               READY   STATUS    RESTARTS   AGE     IP           NODE        NOMINATED NODE   READINESS GATES
mydep-65bbdb4c9f-bvwmp             1/1     Running   0          13m     10.244.1.4   k8s-node1   <none>           <none>
mydep-65bbdb4c9f-sswdr             1/1     Running   0          13m     10.244.2.4   k8s-node2   <none>           <none>
mydep-65bbdb4c9f-swgvz             1/1     Running   0          4h2m    10.244.1.2   k8s-node1   <none>           <none>
nginx-deployment-6dd86d77d-h7n7j   1/1     Running   0          5s      10.244.1.6   k8s-node1   <none>           <none>
nginx-deployment-6dd86d77d-jsf2g   1/1     Running   0          3h28m   10.244.2.2   k8s-node2   <none>           <none>
[root@k8s-master ~]#

3.2升级

将nginx的版本由1.7.9升级到1.8.1

[root@k8s-master ~]# kubectl get deployments -owide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES        SELECTOR
mydep              3/3     3            3           4h10m   nginx        nginx         app=mydep
nginx-deployment   2/2     2            2           3h37m   nginx        nginx:1.7.9   app=nginx
[root@k8s-master ~]#

利用yaml文件 :
deploy2.yaml 升级至 1.8.1 。
升级采取滚动升级的方式进行(down1个up1个,down第2个up第2个),从下面get rs 命令可以看到多出了一个nginx current是0的记录,该记录为原始的rs记录,数量已经变成了0,新版本以由新的nginx-deployment-59988f74c7替代。后面可利用在升级至1.9.1验证再一次的滚动操作。

image: nginx:1.8.1
[root@k8s-master ~]# kubectl apply -f deploy2.yaml --record
--record :通常加上此参数,用以记录该命令。日后知道升级的时候执行过哪条命令。
[root@k8s-master ~]# kubectl apply -f deploy2.yaml 
deployment.apps/nginx-deployment configured
[root@k8s-master ~]# kubectl get deployments.
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
mydep              3/3     3            3           4h21m
nginx-deployment   2/2     2            2           3h47m
[root@k8s-master ~]# kubectl get deployments. -owide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES        SELECTOR
mydep              3/3     3            3           4h21m   nginx        nginx         app=mydep
nginx-deployment   2/2     2            2           3h47m   nginx        nginx:1.8.1   app=nginx
[root@k8s-master ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
mydep-65bbdb4c9f              3         3         3       4h21m
nginx-deployment-59988f74c7   2         2         2       51s
nginx-deployment-6dd86d77d    0         0         0       3h47m
[root@k8s-master ~]# kubectl describe deployments nginx-deployment
。。。。。。。。。。。。。。。。
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  34m    deployment-controller  Scaled up replica set nginx-deployment-6dd86d77d to 5
  Normal  ScalingReplicaSet  33m    deployment-controller  Scaled down replica set nginx-deployment-6dd86d77d to 2
  Normal  ScalingReplicaSet  5m45s  deployment-controller  Scaled up replica set nginx-deployment-59988f74c7 to 1
  Normal  ScalingReplicaSet  5m18s  deployment-controller  Scaled down replica set nginx-deployment-6dd86d77d to 1
  Normal  ScalingReplicaSet  5m18s  deployment-controller  Scaled up replica set nginx-deployment-59988f74c7 to 2
  Normal  ScalingReplicaSet  5m7s   deployment-controller  Scaled down replica set nginx-deployment-6dd86d77d to 0

deploy3.yaml 升级至 1.9.1

image: nginx:1.9.1

利用deploy3.yaml文件升级,验证再一次的滚动操作

[root@k8s-master ~]# kubectl apply -f deploy3.yaml 
deployment.apps/nginx-deployment configured
[root@k8s-master ~]# k get deployments. -owide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES        SELECTOR
mydep              3/3     3            3           4h33m   nginx        nginx         app=mydep
nginx-deployment   2/2     2            2           3h59m   nginx        nginx:1.9.1   app=nginx
[root@k8s-master ~]# k get rs
NAME                          DESIRED   CURRENT   READY   AGE
mydep-65bbdb4c9f              3         3         3       4h35m
nginx-deployment-59988f74c7   0         0         0       15m
nginx-deployment-6dd86d77d    0         0         0       4h2m
nginx-deployment-784b7cc96d   2         2         2       2m32s
[root@k8s-master ~]# kubectl describe deployments. nginx-deployment
。。。。。。。。
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  44m    deployment-controller  Scaled up replica set nginx-deployment-6dd86d77d to 5
  Normal  ScalingReplicaSet  43m    deployment-controller  Scaled down replica set nginx-deployment-6dd86d77d to 2
  Normal  ScalingReplicaSet  16m    deployment-controller  Scaled up replica set nginx-deployment-59988f74c7 to 1
  Normal  ScalingReplicaSet  16m    deployment-controller  Scaled down replica set nginx-deployment-6dd86d77d to 1
  Normal  ScalingReplicaSet  16m    deployment-controller  Scaled up replica set nginx-deployment-59988f74c7 to 2
  Normal  ScalingReplicaSet  15m    deployment-controller  Scaled down replica set nginx-deployment-6dd86d77d to 0
  Normal  ScalingReplicaSet  3m48s  deployment-controller  Scaled up replica set nginx-deployment-784b7cc96d to 1
  Normal  ScalingReplicaSet  3m32s  deployment-controller  Scaled down replica set nginx-deployment-59988f74c7 to 1
  Normal  ScalingReplicaSet  3m32s  deployment-controller  Scaled up replica set nginx-deployment-784b7cc96d to 2
  Normal  ScalingReplicaSet  2m17s  deployment-controller  Scaled down replica set nginx-deployment-59988f74c7 to 0

查看升级历史,没有使用--record 所以没有记录信息(none),可以通过--revision=编号进行查看。

[root@k8s-master ~]# kubectl rollout history deployment nginx-deployment 
deployment.extensions/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>
[root@k8s-master ~]# kubectl rollout history deployment nginx-deployment --revision=2
deployment.extensions/nginx-deployment with revision #2
Pod Template:
  Labels:       app=nginx
        pod-template-hash=59988f74c7
  Containers:
   nginx:
    Image:      nginx:1.8.1
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

[root@k8s-master ~]#

回滚操作

[root@k8s-master ~]# kubectl rollout undo deployment nginx-deployment --to-revision=2
deployment.extensions/nginx-deployment rolled back
[root@k8s-master ~]# k get deployments. -owide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES        SELECTOR
mydep              3/3     3            3           5h16m   nginx        nginx         app=mydep
nginx-deployment   2/2     2            2           4h42m   nginx        nginx:1.8.1   app=nginx

删除deployment(控制器)
因为无法直接删除pod(删除后rs会自动重建),要想删除POD只能通过删除控制器(deployment)来实现(删除deployment引出删除rs进而删除容器)

[root@k8s-master ~]# kubectl delete deployments. nginx-deployment 
deployment.extensions "nginx-deployment" deleted
[root@k8s-master ~]# k get rs
NAME               DESIRED   CURRENT   READY   AGE
mydep-65bbdb4c9f   3         3         3       5h27m
[root@k8s-master ~]# k get pod
NAME                     READY   STATUS    RESTARTS   AGE
mydep-65bbdb4c9f-bvwmp   1/1     Running   0          99m
mydep-65bbdb4c9f-sswdr   1/1     Running   0          99m
mydep-65bbdb4c9f-swgvz   1/1     Running   0          5h27m
[root@k8s-master ~]#
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容