Kubernetes---使用 Deployment 运行一个无状态应用

使用 Deployment 运行一个无状态应用


一、创建Deployment

创建一个 Kubernetes Deployment 对象来运行一个应用, 在一个 YAML 文件中描述 Deployment。例如, 下面这个 YAML 文件描述了一个运行 nginx:1.14.2 Docker 镜像的 Deployment:

[root@master k8s]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # 告知 Deployment 运行 2 个与该模板匹配的 Pod
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

通过 YAML 文件创建一个 Deployment:

[root@master k8s]# kubectl apply -f deployment.yaml
deployment.apps/nginx-deployment created

显示该 Deployment 的相关信息:

[root@master k8s]# kubectl describe deployment nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Wed, 24 Aug 2022 15:59:16 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               2 desired | 2 updated | 2 total | 0 available | 2 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.14.2
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      False   MinimumReplicasUnavailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deployment-9456bbbf9 (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  12s   deployment-controller  Scaled up replica set nginx-deployment-9456bbbf9 to 2

列出该 Deployment 创建的 Pod:

[root@master k8s]# kubectl get pods -l app=nginx
NAME                               READY   STATUS              RESTARTS   AGE
nginx-deployment-9456bbbf9-fcfbz   0/1     ContainerCreating   0          26s
nginx-deployment-9456bbbf9-w2sqn   0/1     ContainerCreating   0          24s
# 此时正在拉取镜像创建中
[root@master k8s]# kubectl get pods -l app=nginx
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-9456bbbf9-fcfbz   1/1     Running   0          14m
nginx-deployment-9456bbbf9-w2sqn   1/1     Running   0          14m
# 此时已创建成功

展示某一个 Pod 信息:

kubectl describe pod <pod-name>  # 这里的 <pod-name> 是某一Pod的名称
[root@master k8s]# kubectl describe pod nginx 
Name:         nginx-deployment-9456bbbf9-fcfbz
Namespace:    default
Priority:     0
Node:         node1/192.168.76.101
Start Time:   Wed, 24 Aug 2022 15:59:19 +0800
Labels:       app=nginx
              pod-template-hash=9456bbbf9
Annotations:  cni.projectcalico.org/podIP: 10.244.166.129/32
              cni.projectcalico.org/podIPs: 10.244.166.129/32
Status:       Running
IP:           10.244.166.129
IPs:
  IP:           10.244.166.129
Controlled By:  ReplicaSet/nginx-deployment-9456bbbf9
Containers:
  nginx:
    Container ID:   docker://eb15ca37ee972d4b0761041a3cb2b04baed2f6ef2e28fc20c16f90441b4fbc4c
    Image:          nginx:1.14.2
    Image ID:       docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 24 Aug 2022 16:02:55 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-kkfjm (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  kube-api-access-kkfjm:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  15m   default-scheduler  Successfully assigned default/nginx-deployment-9456bbbf9-fcfbz to node1
  Normal  Pulling    14m   kubelet            Pulling image "nginx:1.14.2"
  Normal  Pulled     12m   kubelet            Successfully pulled image "nginx:1.14.2" in 1m47.763090495s
  Normal  Created    12m   kubelet            Created container nginx
  Normal  Started    12m   kubelet            Started container nginx

Name:         nginx-deployment-9456bbbf9-w2sqn
Namespace:    default
Priority:     0
Node:         node2/192.168.76.102
Start Time:   Wed, 24 Aug 2022 15:59:20 +0800
Labels:       app=nginx
              pod-template-hash=9456bbbf9
Annotations:  cni.projectcalico.org/podIP: 10.244.104.1/32
              cni.projectcalico.org/podIPs: 10.244.104.1/32
Status:       Running
IP:           10.244.104.1
IPs:
  IP:           10.244.104.1
Controlled By:  ReplicaSet/nginx-deployment-9456bbbf9
Containers:
  nginx:
    Container ID:   docker://324d787fa9f90c4f3270bc9ae22dd65a770b8d53d333d0632b63526c20371380
    Image:          nginx:1.14.2
    Image ID:       docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 24 Aug 2022 16:03:57 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-ssdsf (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  kube-api-access-ssdsf:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  15m   default-scheduler  Successfully assigned default/nginx-deployment-9456bbbf9-w2sqn to node2
  Normal  Pulling    12m   kubelet            Pulling image "nginx:1.14.2"
  Normal  Pulled     11m   kubelet            Successfully pulled image "nginx:1.14.2" in 1m34.930550489s
  Normal  Created    11m   kubelet            Created container nginx
  Normal  Started    11m   kubelet            Started container nginx

二、更新 Deployment

应用一个新的 YAML 文件来更新 Deployment。下面的 YAML 文件指定该 Deployment 镜像更新为 nginx 1.16.1。

[root@master k8s]# cat deployment-update.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1 # 将 nginx 版本从 1.14.2 更新为 1.16.1
        ports:
        - containerPort: 80

应用新的 YAML:

[root@master k8s]# kubectl apply -f deployment-update.yaml
deployment.apps/nginx-deployment configured

查看该 Deployment 以新的名称创建 Pod 同时删除旧的 Pod:

[root@master k8s]# kubectl get pods -l app=nginx
NAME                               READY   STATUS              RESTARTS   AGE
nginx-deployment-9456bbbf9-fcfbz   1/1     Running             0          22m
nginx-deployment-9456bbbf9-w2sqn   1/1     Terminating         0          22m
nginx-deployment-ff6655784-nzq29   0/1     ContainerCreating   0          8s
nginx-deployment-ff6655784-vzl68   1/1     Running             0          102s
[root@master k8s]# kubectl get pods -l app=nginx
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-ff6655784-nzq29   1/1     Running   0          8m7s
nginx-deployment-ff6655784-vzl68   1/1     Running   0          9m41s
[root@master k8s]# kubectl describe pod nginx
Name:         nginx-deployment-ff6655784-nzq29
Namespace:    default
Priority:     0
Node:         node1/192.168.76.101
Start Time:   Wed, 24 Aug 2022 16:21:18 +0800
Labels:       app=nginx
              pod-template-hash=ff6655784
Annotations:  cni.projectcalico.org/podIP: 10.244.166.130/32
              cni.projectcalico.org/podIPs: 10.244.166.130/32
Status:       Running
IP:           10.244.166.130
IPs:
  IP:           10.244.166.130
Controlled By:  ReplicaSet/nginx-deployment-ff6655784
Containers:
  nginx:
    Container ID:   docker://e35b4dd370a899ebf9a6a8f5ef18fe39cf1d03eca40bbdf3a858af98afe1fe58
    Image:          nginx:1.16.1
    Image ID:       docker-pullable://nginx@sha256:d20aa6d1cae56fd17cd458f4807e0de462caf2336f0b70b5eeb69fcaaf30dd9c
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 24 Aug 2022 16:23:21 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-8pj6k (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  kube-api-access-8pj6k:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  8m56s  default-scheduler  Successfully assigned default/nginx-deployment-ff6655784-nzq29 to node1
  Normal  Pulling    8m37s  kubelet            Pulling image "nginx:1.16.1"
  Normal  Pulled     6m55s  kubelet            Successfully pulled image "nginx:1.16.1" in 1m41.169627748s
  Normal  Created    6m53s  kubelet            Created container nginx
  Normal  Started    6m53s  kubelet            Started container nginx

Name:         nginx-deployment-ff6655784-vzl68
Namespace:    default
Priority:     0
Node:         node2/192.168.76.102
Start Time:   Wed, 24 Aug 2022 16:19:44 +0800
Labels:       app=nginx
              pod-template-hash=ff6655784
Annotations:  cni.projectcalico.org/podIP: 10.244.104.2/32
              cni.projectcalico.org/podIPs: 10.244.104.2/32
Status:       Running
IP:           10.244.104.2
IPs:
  IP:           10.244.104.2
Controlled By:  ReplicaSet/nginx-deployment-ff6655784
Containers:
  nginx:
    Container ID:   docker://ee8e71c7ad3def0c31fce59417ce91d5644998c9f8872e55084ad3deca568751
    Image:          nginx:1.16.1
    Image ID:       docker-pullable://nginx@sha256:d20aa6d1cae56fd17cd458f4807e0de462caf2336f0b70b5eeb69fcaaf30dd9c
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 24 Aug 2022 16:21:15 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-c22g5 (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  kube-api-access-c22g5:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  10m    default-scheduler  Successfully assigned default/nginx-deployment-ff6655784-vzl68 to node2
  Normal  Pulling    10m    kubelet            Pulling image "nginx:1.16.1"
  Normal  Pulled     9m5s   kubelet            Successfully pulled image "nginx:1.16.1" in 1m21.970003066s
  Normal  Created    9m2s   kubelet            Created container nginx
  Normal  Started    8m59s  kubelet            Started container nginx

三、通过增加副本数来扩缩应用

通过应用新的 YAML 文件来增加 Deployment 中 Pod 的数量。 下面的 YAML 文件将 replicas 设置为 4,指定该 Deployment 应有 4 个 Pod:

[root@master k8s]# cat deployment-scale.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 4 # 将副本数从 2 更新为 4
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        ports:
        - containerPort: 80

应用新的 YAML 文件:

[root@master k8s]# kubectl apply -f deployment-scale.yaml
deployment.apps/nginx-deployment configured
[root@master k8s]# kubectl get pods -l app=nginx
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-ff6655784-6nl58   1/1     Running   0          30s
nginx-deployment-ff6655784-8ws9j   1/1     Running   0          30s
nginx-deployment-ff6655784-nzq29   1/1     Running   0          11m
nginx-deployment-ff6655784-vzl68   1/1     Running   0          13m

四、删除Deployment

基于名称删除 Deployment:

[root@master k8s]# kubectl delete deployment nginx-deployment
deployment.apps "nginx-deployment" deleted
[root@master k8s]# kubectl get pods -l app=nginx
No resources found in default namespace.
# 删除成功

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值