什么是Deployment

Deployment 是用来部署无状态应用,例如web服务、微服务。
Deployment 可以做到很便捷的管理Pod,只需要在Deployment中描述一下希望的Pod状态是什么,包括定义Pod副本数、滚动升级和回滚应用、扩容和缩容、暂停和继续Deploymentdent,然后Deployment Controller就可以绑我们实现我们想要达到的状态。
Deployment通过label关联起来pods.png

部署应用 YAML 文件

直接命令运行
  1. $ kubectl run nginx --image=nginx:1.22.0 -n demo

Deployment详细示例

以部署nginx为例,nginx-deployment.yaml

  1. apiVersion: apps/v1 # api版本声明:1、extensions/v1beta1 是用于kubernetes版本在1.6之前 2、apps/v1beta1 是用于1.6-1.9版本之间 3、apps/v1 是1.9版本以后使用。目前使用的Kubernetes版本: v1.17.4。
  2. kind: Deployment # 指定创建资源的类型
  3. metadata: # 资源的元数据/属性
  4. name: nginx-deployment # 资源名称,在同一个namespace中唯一
  5. namespace: demo # 指定namespace
  6. spec: # 资源规格定义
  7. revisionHistoryLimit: 10 # 保存最近的10个历史版本
  8. replicas: 1 # 指定pod副本数量
  9. strategy: # 滚动升级策略
  10. type: RollingUpdate # 滚动更新。策略:重建(recreate):停止旧版本部署新版本;滚动更新(rolling-update):一个接一个地以滚动更新方式发布新版本;蓝绿(blue/green):新版本与旧版本一起存在,然后切换流量;金丝雀(canary):将新版本面向一部分用户发布,然后继续全量发布
  11. rollingUpdate:
  12. maxSurge: 1 # 一次可以添加多少个Pod
  13. maxUnavailable: 0 # 滚动更新期间最大多少个Pod不可用
  14. selector: # 定义标签选择器
  15. matchLabels: # 标签匹配
  16. app: nginx-server # 这里选择需要管理的pod的标签名
  17. template: # pod模版定义
  18. metadata: # 资源的元数据/属性
  19. labels: # 定义pod标签
  20. app: nginx-server # pod标签名(自定义)
  21. spec: # 指定该资源的内容
  22. restartPolicy: Always # 容器重启策略。只要退出就重启(Always),失败退出(exit code不等于0)时重启(OnFailure),只要退出就不再重启(Never)
  23. containers: # 定义一个容器
  24. - name: nginx-container # 容器名称
  25. image: nginx:1.22.0 # 镜像名称
  26. imagePullPolicy: IfNotPresent # 镜像拉取策略。 不管镜像是否存在都会进行一次拉取。(Always),只有镜像不存在时,才会进行镜像拉取。(IfNotPresent),只使用本地镜像,从不拉取(Never)
  27. ports: # 端口定义
  28. - name: nginx-port # 端口名称
  29. containerPort: 80 # 容器对外暴露的端口
  30. protocol: TCP # 端口通讯协议
  31. resources: # 容器资源管理
  32. requests: # 容器的请求资源
  33. memory: "256Mi" # 请求内存资源:2G
  34. cpu: "0.1" # 请求CPU资源:1v
  35. limits: # 容器的限制资源
  36. memory: "512Mi" # 容器的限制内存:4G
  37. cpu: "1" # 容器的限制CPU:2v

部署Nginx

  1. # 部署应用
  2. $ kubectl apply -f nginx-deployment.yaml
  3. # 查看 deployment
  4. $ kubectl get deployment -n demo
  5. # 查看 pod
  6. $ kubectl get pod -o wide -n demo
  7. # 查看 pod 详情
  8. $ kubectl describe pod $POD_NAME -n demo
  9. # 查看 log
  10. $ kubectl logs $POD_NAME -f --tail=100 -n demo
  11. # 进入 Pod 容器终端, -c container-name 可以指定进入哪个容器。
  12. $ kubectl exec -it $POD_NAME -- bash -n demo
  13. # 伸缩扩展副本
  14. $ kubectl scale deployment nginx-deployment --replicas=5 -n demo
  15. # 把集群内端口映射到节点
  16. # kubectl port-forward $POD_NAME --address 0.0.0.0 hostPort:containerPort
  17. $ kubectl port-forward $POD_NAME --address 0.0.0.0 32080:80 -n demo
  18. # 查看历史
  19. $ kubectl rollout history deployment nginx-deployment -n demo
  20. # 回到上个版本
  21. $ kubectl rollout undo deployment nginx-deployment -n demo
  22. # 回到指定版本
  23. $ kubectl rollout undo deployment nginx-deployment --to-revision=2 -n demo
  24. # 删除部署
  25. $ kubectl delete deployment nginx-deployment -n demo

更多命令
# 查看全部
$ kubectl get all

# 重新部署
$ kubectl rollout restart deployment nginx-deployment -n demo

# 命令修改镜像,--record 表示把这个命令记录到操作历史中
$ kubectl set image deployment nginx-deployment nginx-container=nginx:1.21.6 --record -n demo

# 暂停运行,暂停后,对 deployment 的修改不会立刻生效,恢复后才应用设置
$ kubectl rollout pause deployment nginx-deployment -n demo

# 恢复
$ kubectl rollout resume deployment nginx-deployment -n demo

# 输出到文件
$ kubectl get deployment nginx-deployment -o yaml >> nginx2.yaml -n demo

# 删除全部资源
$ kubectl delete all --all

更多官网关于 Deployment 的介绍

现存问题

  • 配置文件修改无法持久化,Pod重创后会丢失
  • 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod
  • 访问还需要端口转发

后面介绍如何解决。