内容

  • 什么是Controller
  • Pod和Controller的关系
  • Deployment控制器应用场景
  • yaml文件字段说明
  • Deployment控制器部署应用
  • 升级回滚
  • 弹性伸缩

    一 、什么是Controller

    Controller是在集群上管理和运行容器的对象,Controller是实际存在的,Pod是虚拟机的

    二、 Pod和Controller的关系

    Pod是通过Controller实现应用的运维,比如弹性伸缩,滚动升级等
    Pod 和 Controller之间是通过label标签来建立关系,同时Controller又被称为控制器工作负载
    Kubernetes核心技术Controller - 图1

    三、Deployment控制器应用

  • Deployment控制器可以部署无状态应用

  • 管理Pod和ReplicaSet
  • 部署,滚动升级等功能
  • 应用场景:web服务,微服务
    1. Deployment表示用户对K8S集群的一次更新操作。Deployment是一个比RS( Replica Set, RS) 应用模型更广的 API 对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧RS中的副本数减少到0的复合操作。
    2. 这样一个复合操作用一个RS是不好描述的,所以用一个更通用的Deployment来描述。以K8S的发展方向,未来对所有长期伺服型的业务的管理,都会通过Deployment来管理。

四、 Deployment部署应用

之前我们也使用Deployment部署过应用,如下代码所示

  1. kubectl create deployment web --image=nginx

但是上述代码不是很好的进行复用,因为每次我们都需要重新输入代码,所以我们都是通过YAML进行配置
但是我们可以尝试使用上面的代码创建一个镜像【只是尝试,不会创建】

  • tip : 意思就是以上代码不好,不要用了!
  1. kubectl create deployment web --image=nginx --dry-run=client -o yaml > nginx.yaml

然后输出一个yaml配置文件 nginx.yml ,配置文件如下所示

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. creationTimestamp: null
  5. labels:
  6. app: web
  7. name: web
  8. spec:
  9. replicas: 1
  10. # 选择器
  11. selector:
  12. matchLabels:
  13. app: web
  14. strategy: {}
  15. template:
  16. metadata:
  17. creationTimestamp: null
  18. # 标签
  19. labels:
  20. app: web
  21. spec:
  22. containers:
  23. - image: nginx
  24. name: nginx
  25. resources: {}
  26. status: {}

我们看到的 selector 和 label 就是我们Pod 和 Controller之间建立关系的桥梁


使用YAML创建Pod
通过刚刚的代码,我们已经生成了YAML文件,下面我们就可以使用该配置文件快速创建Pod镜像了

  1. kubectl apply -f nginx.yaml

Kubernetes核心技术Controller - 图2
但是因为这个方式创建的,我们只能在集群内部进行访问,所以我们还需要对外暴露端口

  1. kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1

关于上述命令,有几个参数

  • —port:就是我们内部的端口号
  • —target-port:就是暴露外面访问的端口号
  • —name:名称
  • —type:类型

同理,我们一样可以导出对应的配置文件

  1. kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml

得到的web1.yaml如下所示

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. creationTimestamp: "2020-11-16T02:26:53Z"
  5. labels:
  6. app: web
  7. managedFields:
  8. - apiVersion: v1
  9. fieldsType: FieldsV1
  10. fieldsV1:
  11. f:metadata:
  12. f:labels:
  13. .: {}
  14. f:app: {}
  15. f:spec:
  16. f:externalTrafficPolicy: {}
  17. f:ports:
  18. .: {}
  19. k:{"port":80,"protocol":"TCP"}:
  20. .: {}
  21. f:port: {}
  22. f:protocol: {}
  23. f:targetPort: {}
  24. f:selector:
  25. .: {}
  26. f:app: {}
  27. f:sessionAffinity: {}
  28. f:type: {}
  29. manager: kubectl
  30. operation: Update
  31. time: "2020-11-16T02:26:53Z"
  32. name: web2
  33. namespace: default
  34. resourceVersion: "113693"
  35. selfLink: /api/v1/namespaces/default/services/web2
  36. uid: d570437d-a6b4-4456-8dfb-950f09534516
  37. spec:
  38. clusterIP: 10.104.174.145
  39. externalTrafficPolicy: Cluster
  40. ports:
  41. - nodePort: 32639
  42. port: 80
  43. protocol: TCP
  44. targetPort: 80
  45. selector:
  46. app: web
  47. sessionAffinity: None
  48. type: NodePort
  49. status:
  50. loadBalancer: {}

然后我们可以通过下面的命令来查看对外暴露的服务

  1. kubectl get pods,svc

Kubernetes核心技术Controller - 图3
然后我们访问对应的url,即可看到 nginx了 [http://192.168.177.130:32639/](http://192.168.177.130:32639/)
Kubernetes核心技术Controller - 图4

五、 升级回滚和弹性伸缩

  • 升级: 假设从版本为1.14 升级到 1.15 ,这就叫应用的升级【升级可以保证服务不中断】
  • 回滚:从版本1.15 变成 1.14,这就叫应用的回滚
  • 弹性伸缩:我们根据不同的业务场景,来改变Pod的数量对外提供服务,这就是弹性伸缩

    5.1 应用升级和回滚

    首先我们先创建一个 1.14版本的Pod

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. creationTimestamp: null
    5. labels:
    6. app: web
    7. name: web
    8. spec:
    9. replicas: 1
    10. selector:
    11. matchLabels:
    12. app: web
    13. strategy: {}
    14. template:
    15. metadata:
    16. creationTimestamp: null
    17. labels:
    18. app: web
    19. spec:
    20. containers:
    21. - image: nginx:1.14
    22. name: nginx
    23. resources: {}
    24. status: {}

    我们先指定版本为1.14,然后开始创建我们的Pod

    1. kubectl apply -f nginx.yaml

    同时,我们使用docker images命令,就能看到我们成功拉取到了一个 1.14版本的镜像
    Kubernetes核心技术Controller - 图5
    我们使用下面的命令,可以将nginx从 1.14 升级到 1.15

    1. kubectl set image deployment web nginx=nginx:1.15

    在我们执行完命令后,能看到升级的过程
    Kubernetes核心技术Controller - 图6

  • 首先是开始的nginx 1.14版本的Pod在运行,然后 1.15版本的在创建

  • 然后在1.15版本创建完成后,就会暂停1.14版本
  • 最后把1.14版本的Pod移除,完成我们的升级

我们在下载 1.15版本,容器就处于ContainerCreating状态,然后下载完成后,就用 1.15版本去替换1.14版本了,这么做的好处就是:升级可以保证服务不中断
Kubernetes核心技术Controller - 图7
我们到我们的node2节点上,查看我们的 docker images;
Kubernetes核心技术Controller - 图8
能够看到,我们已经成功拉取到了 1.15版本的nginx了

5.2 查看升级状态

下面可以,查看升级状态

  1. kubectl rollout status deployment web

Kubernetes核心技术Controller - 图9

5.3 查看历史版本

我们还可以查看历史版本

  1. kubectl rollout history deployment web

5.4 应用回滚

我们可以使用下面命令,完成回滚操作,也就是回滚到上一个版本

  1. kubectl rollout undo deployment web

然后我们就可以查看状态

  1. kubectl rollout status deployment web

Kubernetes核心技术Controller - 图10
同时我们还可以回滚到指定版本

  1. kubectl rollout undo deployment web --to-revision=2

5.5 弹性伸缩

弹性伸缩,也就是我们通过命令一下创建多个副本

  1. kubectl scale deployment web --replicas=10

能够清晰看到,我们一下创建了10个副本
Kubernetes核心技术Controller - 图11