什么是Deployment
Deployment 是用来部署无状态应用,例如web服务、微服务。
Deployment 可以做到很便捷的管理Pod,只需要在Deployment中描述一下希望的Pod状态是什么,包括定义Pod副本数、滚动升级和回滚应用、扩容和缩容、暂停和继续Deploymentdent,然后Deployment Controller就可以绑我们实现我们想要达到的状态。
部署应用 YAML 文件
直接命令运行
$ kubectl run nginx --image=nginx:1.22.0 -n demo
Deployment详细示例
以部署nginx为例,nginx-deployment.yaml
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。kind: Deployment # 指定创建资源的类型metadata: # 资源的元数据/属性name: nginx-deployment # 资源名称,在同一个namespace中唯一namespace: demo # 指定namespacespec: # 资源规格定义revisionHistoryLimit: 10 # 保存最近的10个历史版本replicas: 1 # 指定pod副本数量strategy: # 滚动升级策略type: RollingUpdate # 滚动更新。策略:重建(recreate):停止旧版本部署新版本;滚动更新(rolling-update):一个接一个地以滚动更新方式发布新版本;蓝绿(blue/green):新版本与旧版本一起存在,然后切换流量;金丝雀(canary):将新版本面向一部分用户发布,然后继续全量发布rollingUpdate:maxSurge: 1 # 一次可以添加多少个PodmaxUnavailable: 0 # 滚动更新期间最大多少个Pod不可用selector: # 定义标签选择器matchLabels: # 标签匹配app: nginx-server # 这里选择需要管理的pod的标签名template: # pod模版定义metadata: # 资源的元数据/属性labels: # 定义pod标签app: nginx-server # pod标签名(自定义)spec: # 指定该资源的内容restartPolicy: Always # 容器重启策略。只要退出就重启(Always),失败退出(exit code不等于0)时重启(OnFailure),只要退出就不再重启(Never)containers: # 定义一个容器- name: nginx-container # 容器名称image: nginx:1.22.0 # 镜像名称imagePullPolicy: IfNotPresent # 镜像拉取策略。 不管镜像是否存在都会进行一次拉取。(Always),只有镜像不存在时,才会进行镜像拉取。(IfNotPresent),只使用本地镜像,从不拉取(Never)ports: # 端口定义- name: nginx-port # 端口名称containerPort: 80 # 容器对外暴露的端口protocol: TCP # 端口通讯协议resources: # 容器资源管理requests: # 容器的请求资源memory: "256Mi" # 请求内存资源:2Gcpu: "0.1" # 请求CPU资源:1vlimits: # 容器的限制资源memory: "512Mi" # 容器的限制内存:4Gcpu: "1" # 容器的限制CPU:2v
部署Nginx
# 部署应用$ kubectl apply -f nginx-deployment.yaml# 查看 deployment$ kubectl get deployment -n demo# 查看 pod$ kubectl get pod -o wide -n demo# 查看 pod 详情$ kubectl describe pod $POD_NAME -n demo# 查看 log$ kubectl logs $POD_NAME -f --tail=100 -n demo# 进入 Pod 容器终端, -c container-name 可以指定进入哪个容器。$ kubectl exec -it $POD_NAME -- bash -n demo# 伸缩扩展副本$ kubectl scale deployment nginx-deployment --replicas=5 -n demo# 把集群内端口映射到节点# kubectl port-forward $POD_NAME --address 0.0.0.0 hostPort:containerPort$ kubectl port-forward $POD_NAME --address 0.0.0.0 32080:80 -n demo# 查看历史$ kubectl rollout history deployment nginx-deployment -n demo# 回到上个版本$ kubectl rollout undo deployment nginx-deployment -n demo# 回到指定版本$ kubectl rollout undo deployment nginx-deployment --to-revision=2 -n demo# 删除部署$ 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
- 访问还需要端口转发
后面介绍如何解决。
