zl程序教程

您现在的位置是:首页 >  其他

当前栏目

kubernetes中最常用的资源对象Deployment

2023-03-14 22:49:05 时间

kubernetes deployment

简述kubernetes中replication controller以及deployment的使用.

replication controller

RC解决的问题如主机监控脚本、应用监控脚本、故障恢复脚本等

  • 在大多数情况下,我们通过定义一个RC实现Pod的创建过程及副本数量的自动控制。
  • RC里包括完整的Pod定义模版。
  • RC通过Label Selector机制实现对Pod副本的自动控制。
  • 通过改变RC里的Pod副本数量,可以实现Pod的扩容或缩容功能。
  • 通过改变RC里的Pod模版中的镜像版本,可以实现Pod的滚动升级功能。
  • 删除RC并不会影响通过该RC已创建好的Pod

Deployment

创建一个Deployment对象来生成对应的Replica Set并完成Pod副本的创建过程。

创建deployment

kubectl apply -f example.yaml

检查Deployment的状态来看部署动作是否完成(Pod副本的数量是否达到预期的值)。

➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k get deploy -n learning      
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
abcontainer   1/1     1            1           31d
dp-tomcat     1/1     1            1           2m38s
➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k get pods -n learning -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP             NODE                  NOMINATED NODE   READINESS GATES
abcontainer-58c67cfb87-g4j8q   1/1     Running   0          25d     10.244.1.177   dev-k8s-02.example.com   <none>           <none>
dp-tomcat-7ddcfb68bf-cbvvx     1/1     Running   0          2m43s   10.244.4.119   dev-k8s-05.example.com   <none>           <none>

更新Deployment以创建新的Pod(比如镜像升级)。

➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k set image deployment/dp-tomcat dp-tomcat=tomcat:8.5 -n learning
deployment.apps/dp-tomcat image updated
➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k describe deploy dp-tomcat -n learning|grep -i Image
    Image:      tomcat:8.5

暴露deployment一个服务

➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) kubectl expose deployment dp-tomcat --selector=app=dp-tomcat --name=tomcat-svc --port=8080 --target-port=8080 --protocol=TCP -n learning
service/tomcat-svc exposed
➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k get svc -n learning   NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
mysql        ClusterIP   10.102.156.115   <none>        3306/TCP   27d
tomcat-svc   ClusterIP   10.105.21.78     <none>        8080/TCP   4s

如果当前Deployment不稳定,则回滚到一个早先的Deployment版本。

➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) kubectl rollout history deploy/dp-tomcat -n learning       
deployment.apps/dp-tomcat 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) kubectl rollout history deploy/dp-tomcat --revision=1 -n learning
deployment.apps/dp-tomcat with revision #1
Pod Template:
  Labels:       app=dp-tomcat
        pod-template-hash=7ddcfb68bf
  Containers:
   dp-tomcat:
    Image:      tomcat:9.0
    Port:       8080/TCP
    Host Port:  0/TCP
    Limits:
      cpu:      500m
      memory:   128Mi
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) kubectl rollout history deploy/dp-tomcat --revision=2 -n learning
deployment.apps/dp-tomcat with revision #2
Pod Template:
  Labels:       app=dp-tomcat
        pod-template-hash=5b4465b6bf
  Containers:
   dp-tomcat:
    Image:      tomcat:8.5
    Port:       8080/TCP
    Host Port:  0/TCP
    Limits:
      cpu:      500m
      memory:   128Mi
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>
➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k set image deployment/dp-tomcat dp-tomcat=tomcat:9.0 --record=true -n learning
deployment.apps/dp-tomcat image updated
➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) kubectl rollout status deploy/dp-tomcat -n learning
Waiting for deployment "dp-tomcat" rollout to finish: 2 old replicas are pending termination...
Waiting for deployment "dp-tomcat" rollout to finish: 2 old replicas are pending termination...
Waiting for deployment "dp-tomcat" rollout to finish: 2 old replicas are pending termination...
Waiting for deployment "dp-tomcat" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "dp-tomcat" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "dp-tomcat" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "dp-tomcat" rollout to finish: 5 of 6 updated replicas are available...
deployment "dp-tomcat" successfully rolled out
➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k rollout history deploy/dp-tomcat -n learning
deployment.apps/dp-tomcat 
REVISION  CHANGE-CAUSE
2         <none>
3         kubectl set image deployment/dp-tomcat dp-tomcat=tomcat:9.0 --record=true --namespace=learning

➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k rollout status deploy/dp-tomcat -n learning
deployment "dp-tomcat" successfully rolled out
➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k get pods -n learning -o wide                     
NAME                           READY   STATUS    RESTARTS   AGE   IP             NODE                  NOMINATED NODE   READINESS GATES
abcontainer-58c67cfb87-g4j8q   1/1     Running   0          25d   10.244.1.177   dev-k8s-02.example.com   <none>           <none>
dp-tomcat-5b4465b6bf-cj9jp     1/1     Running   0          29s   10.244.4.135   dev-k8s-05.example.com   <none>           <none>
➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k rollout history deploy/dp-tomcat -n learning
deployment.apps/dp-tomcat 
REVISION  CHANGE-CAUSE
3         kubectl set image deployment/dp-tomcat dp-tomcat=tomcat:9.0 --record=true --namespace=learning
4         <none>

暂停Deployment以便于一次性修改多个PodTemplateSpec的配置项,之后再恢复Deployment,进行新的发布。

kubectl rollout pause deployment/dp-tomcat -n learning
kubectl set image deployment/dp-tomcat --replicas=10 -n learning
kubectl rollout resume deployment/dp-tomcat -n learning

扩展Deployment以应对高负载。

➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) kubectl scale deploy dp-tomcat --replicas=4 -n learning;sleep 3
deployment.apps/dp-tomcat scaled
➜  deployment git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k get pods -n learning -o wide                                 
NAME                           READY   STATUS    RESTARTS   AGE     IP             NODE                  NOMINATED NODE   READINESS GATES
abcontainer-58c67cfb87-g4j8q   1/1     Running   0          25d     10.244.1.177   dev-k8s-02.example.com   <none>           <none>
dp-tomcat-7ddcfb68bf-5j2bn     1/1     Running   0          12s     10.244.4.122   dev-k8s-05.example.com   <none>           <none>
dp-tomcat-7ddcfb68bf-98gsw     1/1     Running   0          13s     10.244.4.120   dev-k8s-05.example.com   <none>           <none>
dp-tomcat-7ddcfb68bf-cbvvx     1/1     Running   0          8m53s   10.244.4.119   dev-k8s-05.example.com   <none>           <none>
dp-tomcat-7ddcfb68bf-qjdt8     1/1     Running   0          12s     10.244.4.121   dev-k8s-05.example.com   <none>           <none>

查看Deployment的状态,以此作为发布是否成功的指标。

➜  ~ (☸ kubernetes-admin@kubernetes:default) kubectl rollout status deploy/dp-tomcat -n learning
deployment "dp-tomcat" successfully rolled out
➜  ~ (☸ kubernetes-admin@kubernetes:default) echo $?
0

kubectl rollout undo deployment/nginx-deployment --to-revision=2

清理不再需要的旧版本ReplicaSets。

➜  ~ (☸ kubernetes-admin@kubernetes:default) k get rs -n learning
NAME                     DESIRED   CURRENT   READY   AGE
abcontainer-58c67cfb87   1         1         1       31d
dp-tomcat-5b4465b6bf     2         2         2       149m
dp-tomcat-7ddcfb68bf     0         0         0       165m

#会自动清理旧版本的rs
➜  ~ (☸ kubernetes-admin@kubernetes:default) kubectl rollout history deployment dp-tomcat -n learning
deployment.apps/dp-tomcat
REVISION  CHANGE-CAUSE
9         kubectl set image deployment/dp-tomcat dp-tomcat=tomcat:8.5 --record=true --namespace=learning
10        kubectl set image deployment/dp-tomcat dp-tomcat=tomcat:9.0 --record=true --namespace=learning