一、为什么要有Deployment?

  • 处理在线业务
  • 预防pod出错导致的容器不可维护性
  • 应对在线业务多实例、高可用、版本更新等许多复杂的操作

既然Pod管理不了自己,就再创建一个新的对象,由它来管理Pod,采用和Job/CronJob一样的形式“对象套对象”。

这个用来管理Pod,实现在线业务应用的新API对象,就是Deployment。

二、如何使用YAML描述Deployment?

1、查看eployment的基本信息

[root@master k8s-stdy]# kubectl api-resources | grep deployments
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
deployments                       deploy       apps/v1                                true         Deployment

2、创建Deployment模板

  • replicas:副本数量,指定要在Kubernetes集群里运行多少个Pod实例
  • selector:“筛选”出要被Deployment管理的Pod对象
    下属字段“matchLabels”定义了Pod对象应该携带的label,它必须和“template”里Pod定义的“labels”完全相同,否则Deployment就会找不到要控制的Pod对象,apiserver也会告诉你YAML格式校验错误无法创建。
[root@master k8s-stdy]# kubectl create deploy ngx-dep --image=nginx:alpine --dry-run=client -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: ngx-dep
  name: ngx-dep
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ngx-dep
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: ngx-dep
    spec:
      containers:
      - image: nginx:alpine
        name: nginx
        resources: {}
status: {}

三、如何使用kubectl操作Deployment?

1、创建2个pod

[root@master 18]# cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: ngx-dep
  name: ngx-dep
spec:
  replicas: 2
  selector:
    matchLabels:
      app: ngx-dep
  template:
    metadata:
      labels:
        app: ngx-dep
    spec:
      containers:
      - image: nginx:alpine
        name: nginx
[root@master 18]# kubectl apply -f deploy.yaml
deployment.apps/ngx-dep created
[root@master 18]# kubectl get deploy
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
ngx-dep   2/2     2            2           38s
[root@master 18]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
ngx-dep-bfbb5f64b-5p4tl   1/1     Running   0          4m19s
ngx-dep-bfbb5f64b-qchdq   1/1     Running   0          4m19s

# 删除pod,验证其可以自动创建新的pod保证pod数量不变
[root@master 18]# kubectl delete pod ngx-dep-bfbb5f64b-qchdq
pod "ngx-dep-bfbb5f64b-qchdq" deleted
[root@master 18]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
ngx-dep-bfbb5f64b-5p4tl   1/1     Running   0          7m25s
ngx-dep-bfbb5f64b-qvgsz   1/1     Running   0          4s

2、将pod扩容到5个

[root@master 18]# kubectl scale --replicas=5 deploy ngx-dep
deployment.apps/ngx-dep scaled
[root@master 18]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
ngx-dep-bfbb5f64b-5p4tl   1/1     Running   0          10m
ngx-dep-bfbb5f64b-bw4qq   1/1     Running   0          4s
ngx-dep-bfbb5f64b-dbbsl   1/1     Running   0          4s
ngx-dep-bfbb5f64b-p8zpd   1/1     Running   0          4s
ngx-dep-bfbb5f64b-qvgsz   1/1     Running   0          3m33s

注意:
kubectl scale是命令式操作,扩容和缩容只是临时的措施,如果应用需要长时间保持一个确定的Pod数量,最好还是编辑Deployment的YAML文件,改动“replicas”,再以声明式的kubectl apply修改对象的状态。

3、根据“app”标签获取pod信息

[root@master 18]# kubectl get pod -l app=ngx-dep
NAME                      READY   STATUS    RESTARTS   AGE
ngx-dep-bfbb5f64b-5p4tl   1/1     Running   0          32m
ngx-dep-bfbb5f64b-bw4qq   1/1     Running   0          21m
ngx-dep-bfbb5f64b-dbbsl   1/1     Running   0          21m
ngx-dep-bfbb5f64b-p8zpd   1/1     Running   0          21m
ngx-dep-bfbb5f64b-qvgsz   1/1     Running   0          25m
[root@master 18]# kubectl get pod -l 'app in (ngx,nginx,ngx-dep)'
NAME                      READY   STATUS    RESTARTS   AGE
ngx-dep-bfbb5f64b-5p4tl   1/1     Running   0          30m
ngx-dep-bfbb5f64b-bw4qq   1/1     Running   0          19m
ngx-dep-bfbb5f64b-dbbsl   1/1     Running   0          19m
ngx-dep-bfbb5f64b-p8zpd   1/1     Running   0          19m
ngx-dep-bfbb5f64b-qvgsz   1/1     Running   0          23m
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐