(3):Controller之deployment解析

一、Controller(控制器)

在k8s集群中,用于管理和运行容器的对象,也称之工作负载(workload)。如Deployment、DaemonSet、Job、StatefulSet等。


二、Pod和Controller的关系

Pod通过Controller来实现应用的运维,如伸缩、滚动升级。

如在Controller中,

selector:
  matchLabels:
    app: nginx

Pod中,

template:
  labels:
    app: nginx

两者之间通过label标签来建立关系


三、Deployment控制器的应用场景

 部署无状态应用(web应用、微服务)

 管理Pod和ReplicaSet

 滚动升级(回退)应用


四、通过Deployment控制器进行应用部署的示例

kubectl create deployment web --image=nginx --dry-run=client -o yaml > web.yaml

kubectl apply -f web.yaml

[root@master-146 ~]# kubectl create deployment web --image=nginx --dry-run=client -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web-svc -o yaml

kubectl apply -f web-svc.yaml

[root@master-146 ~]# kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web-svc -o yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2021-07-24T06:49:30Z"
  labels:
    app: web
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:app: {}
      f:spec:
        f:externalTrafficPolicy: {}
        f:ports:
          .: {}
          k:{"port":80,"protocol":"TCP"}:
            .: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector:
          .: {}
          f:app: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: kubectl
    operation: Update
    time: "2021-07-24T06:49:30Z"
  name: web-svc
  namespace: default
  resourceVersion: "248889"
  selfLink: /api/v1/namespaces/default/services/web-svc
  uid: b0a781e7-6811-4cb3-85d1-f01cec5c2734
spec:
  clusterIP: 10.108.132.128
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 31999
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

结果如下:

[root@master-146 ~]# kubectl get pods,svc
NAME                       READY   STATUS    RESTARTS   AGE
pod/web-5dcb957ccc-qljjr   1/1     Running   0          33m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        38h
service/ngnix        NodePort    10.103.94.181   <none>        80:30608/TCP   30h
service/web-svc      NodePort    10.99.61.243    <none>        80:32170/TCP   33m

访问web界面:nodeIp:32170

[root@master-146 ~]# curl -I worker-144:32170
HTTP/1.1 200 OK
Server: nginx/1.21.1
Date: Sat, 24 Jul 2021 08:18:39 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 06 Jul 2021 14:59:17 GMT
Connection: keep-alive
ETag: "60e46fc5-264"
Accept-Ranges: bytes

五、应用升级回滚
spec:
  replicas: 2
  template:
    spec:
      containers:
      - image: nginx:1.14

修改yaml中这部分参数,设置2个副本,镜像版本设置为1.14,再次执行这个yaml,此时会调度2个pod到相应节点。

[root@master-146 ~]# kubectl get deployment -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES       SELECTOR
web    2/2     1            2           76m   nginx        nginx:1.14   app=web

应用升级:kubectl set image deployment web nginx=nginx:1.15

[root@master-146 ~]# kubectl get pods -o wide
NAME                  READY   STATUS    RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES
web-bbcf684cb-mnjh5   1/1     Running   0          4m22s   10.244.1.14   worker-145   <none>           <none>
web-bbcf684cb-qn4zw   1/1     Running   0          4m55s   10.244.2.13   worker-144   <none>           <none>
[root@master-146 ~]# kubectl get deployment -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES       SELECTOR
web    2/2     2            2           75m   nginx        nginx:1.15   app=web

UP-TO-DATE为1时,表示正在升级;UP-TO-DATE为2时,表明版本升级完成。


查看是否升级成功:kubectl rollout status deployment web

[root@master-146 ~]# kubectl rollout status deployment web
deployment "web" successfully rolled out

查看版本升级信息:kubectl rollout history deploy/web

[root@master-146 ~]# kubectl rollout history deploy/web
deployment.apps/web 
REVISION  CHANGE-CAUSE
4         <none>
5         <none>
6         <none>
7         <none>

添加参数–record来记录升级信息,便于回滚

[root@master-146 ~]# kubectl set image deployment web nginx=nginx:1.16 --record
deployment.apps/web image updated
[root@master-146 ~]# kubectl rollout history deploy/web
deployment.apps/web 
REVISION  CHANGE-CAUSE
5         <none>
6         <none>
7         <none>
9         <none>
10        kubectl set image deployment web nginx=nginx:1.16 --record=true

回滚到指定版本:kubectl rollout undo deployment web --to-revision=9

[root@master-146 ~]# kubectl rollout undo deploy web --to-revision=9
deployment.apps/web rolled back
[root@master-146 ~]# kubectl rollout status deploy web
Waiting for deployment "web" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "web" rollout to finish: 1 old replicas are pending termination...
deployment "web" successfully rolled out

回滚到上一个版本:kubectl rollout undo deploy web


六、弹性伸缩

kubectl scale deployment web --replicas=10

[root@master-146 ~]# kubectl scale deploy web --replicas=10
deployment.apps/web scaled
[root@master-146 ~]# kubectl get pods -o wide
NAME                   READY   STATUS              RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES
web-66bf4959f5-77cm9   1/1     Running             0          62s     10.244.1.29   worker-145   <none>           <none>
web-66bf4959f5-g7lbm   1/1     Running             0          62s     10.244.2.27   worker-144   <none>           <none>
web-66bf4959f5-k6zln   0/1     ContainerCreating   0          62s     <none>        worker-145   <none>           <none>
web-66bf4959f5-m79jw   0/1     ContainerCreating   0          62s     <none>        worker-144   <none>           <none>
web-66bf4959f5-p9dn5   1/1     Running             0          8m37s   10.244.2.25   worker-144   <none>           <none>
web-66bf4959f5-tmsg4   1/1     Running             0          8m14s   10.244.1.26   worker-145   <none>           <none>
web-66bf4959f5-wbbwh   1/1     Running             0          62s     10.244.2.26   worker-144   <none>           <none>
web-66bf4959f5-wz7vz   1/1     Running             0          62s     10.244.2.28   worker-144   <none>           <none>
web-66bf4959f5-xhphc   1/1     Running             0          62s     10.244.1.27   worker-145   <none>           <none>
web-66bf4959f5-zlbmf   1/1     Running             0          62s     10.244.1.28   worker-145   <none>           <none>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一生要强的Zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值