Deployment部署

k8s中,我们部署应用通常都不是直接创建Pod,而是通过Deployment来定义Pod,以及其副本数量,然后交给k8s自动调度。通过操作Deployment,还能实现升级、回退、扩容等操作。

Deployment例子

下面例子中,部署了一个1.20版本的Nginx,并配置了3个副本。

deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    k8s-app: nginx-demo
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.20
          ports:
          - containerPort: 80

上面配置中,我们可以看到,其实template中定义的就是Pod相关的内容。spec.selector需要能够匹配spec.template.metadata.labels,这样才能正常部署。

Deployment基本操作

通过yaml配置文件部署Deployment:

kubectl apply -f <yaml配置文件>

kubectl createkubectl apply的区别:

  • create:删除现有的组件,根据配置文件重新生成
  • apply:根据配置文件升级现有的组件

查看当前所有Deployment:

kubectl get deployments

查看Deployment详细信息:

kubectl describe deployments <Deployment名称>

删除Deployment:

kubectl delete deployments <Deployment名称>

注:删除Deployment后,对应Pod会自动销毁、删除。

重新部署

实际的线上环境因为情况非常复杂,我们可能遇到部署失败的情况,有时我们希望已有的Deployment重新尝试部署,可以使用如下命令实现:

kubectl rollout restart deployment <Deployment名称>

升级和回退版本

k8s能够按照一定的策略进行弹性升级,这里我们以上面部署的nginx为例进行操作。

查看升级操作状态:

kubectl rollout status deployment <Deployment名称>

输出结果例子:

Waiting for deployment "nginx-deploy" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deploy" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deploy" successfully rolled out

查看升级操作历史:

kubectl rollout history deployment <Deployment名称>

输出结果例子:

deployment.apps/nginx-deploy
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

升级到指定镜象版本例子:

kubectl set image deployment nginx-deploy nginx=nginx:1.20.1

回退到指定版本例子:

kubectl rollout undo deployment nginx-deploy --to-revision=1

这里的revision版本号我们可以通过kubectl rollout history来找到。

伸缩副本数量

上面我们创建了3个副本,这里我们将其修改为5个副本:

kubectl scale deployment nginx-deploy --replicas=5

伸缩操作和软件镜像版本无关,因此不会计入revision中。

如果我们需要操作所有的Deployment,例如紧急情况下我们要将所有副本数改为0,可以使用--all参数指定,例子如下:

kubectl scale deployment --all --replicas=0
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap