(三)Deployment
Deployment 是 Kubernetes 提供的一种自我修复机制来解决机器故障维护的问题
前面提到了单独部署 Pod,但是这种方式只适合临时的 Pod,用于测试调试
用于生产,则需要 Deployment 等控制器管理部署 Pod,维持 Pod 的副本数量以及 Pod 监控和维护

- Using Generators (Run, Expose)
- Using Imperative way (Create)
- Using Declarative way (Apply)
在本章,我们将会来学习如何使用 Deployment 来部署应用,并学会管理 Pod
以下命令均在 master 节点上执行,如需在 slave 上,会额外说明
创建 Deployment
Deployment 的创建,有两种方法,一种是直接使用命令创建( kubectl create ),一种是通过 YAML( kubectl apply )
当我们创建一个 deployment 时,kubectl create 和 kubectl apply 效果是一样的,但是 apply 还具有更新 (update) 的功能
kubectl apply 会在以前的配置、提供的输入和资源的当前配置之间 找出三方差异,以确定如何修改资源,kubectl apply 命令将会把推送的版本与以前的版本进行比较,并应用你所做的更改, 但是不会自动覆盖任何你没有指定更改的属性
另外还有 kubectl replace 、kubectl edit
kubectl replace是破坏性更新/替换,容易导致问题kubectl edit可以更新 Deployment 等已存在的对象
但我们应该使用以 kubectl create 和 kubectl apply 进行创建资源
kubectl create
我们来使用 deployment 部署一个 Pod,这个 Pod 包含一个 Nginx 容器
kubeclt create deployment nginx-test --image=nginx:latest
# 格式 kubectl create deployment {deployment对象名称} --image={镜像名称和标签}
nginx 容器会以 Pod 的方式部署到节点中,但是被部署到哪个节点是随机的,当前只有一个 slave 节点,所以必定在此节点上
Deployment 会为我们自动创建 Pod,Pod 由 {deployment名称}-{随机名称} 组成
kubectl get deployment -o wide
kubectl get pods -o wide
# 清理资源
# kubectl delete deployment nginx-test

有一个不是很讲究的点需要说一下,那就是 kubectl get xxx 时,不管 xxx 加不加 s,都是可以
只是讲究语义时,我们会习惯性的根据我们的目的加 s,比如想获得全部对象 pods、nodes,对于单一对象则 pod xxx、node xxx
kubectl apply
# 通过 yaml 文件部署 nginx
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
使用 apply 创建时,yaml 文件需要有一些信息,比如:
kind: Deployment
... ...
medatada:
name:nginx
... ...
spec:
containers:
- image: nginx:latest
kubectl apply -f,在 yaml 中指定 kind: Deployment
检查 YAML
有时我们不知道我们的创建命令或 yaml 是否正确,可以使用 --dry-run=client,--dry-run=client 参数来表示当前内容只是预览而不真正提交
root@master:~# kubectl create deployment test-nginx --image=nginx:latest --dry-run=client
deployment.apps/test-nginx created (dry run)
命令的意思是:在本地模拟创建一个名为 test-nginx 的 Deployment,但不提交到 Kubernetes 集群
输出的意思是:命令格式没问题,模拟创建成功,但没有写入集群
此外加上 -o json 参数,可以快速获得需要的 YAML 模板,然后复制到 YAML 文件,根据需要改动、定制,除了 Deployment,其它 kubernetes 对象也可以使用这种方法
kubectl create deployment testnginx --image=nginx:latest --dry-run=client -o yaml

导出 yaml
我们可以从已经创建的 Deployment 、Pod、Service 等对象导出 yaml 文件
kubectl get deployment nginx-deployment -o yaml > mynginx.yaml
# 清理资源
kubectl delete deployment nginx-deployment
# 用导出的 yaml 再创建一个 deployment
kubectl apply -f mynginx.yaml
查看 Deployment
查看 deployment 的信息,这里的 nginx 用的是 apply -y 创建的,不是 create 创建的
kubectl get deployments
kubectl get deployments -o wide

kubectl get events

kubectl describe deployment nginx-deployment
# kubectl describe deployment nginx (名称前缀匹配 会匹配多个 nginx 当前只有一个)

kubectl scale deployment nginx-deployment --replicas=1
查看 Pod
我们通过 Deployment 创建了应用,但这些 Pod 是怎么跟 Deployment 对象关联起来的?接下来我们需要了解如何查看 Pod
kubectl get pods -o wide
curl {nginx_ip}

对于没有指定的 Deployment、Pod、Service 等对象,会默认分配到 default 命名空间中,我们在执行kubectl get {} 时,会获取 default 命名空间中的对象, 后面加上 --all-namespaces 可以获得所有命名空间中的对象,使用 --namespace= 可以指定获取某个命名空间中的对象
kubectl get pods --all-namespaces
kubectl get pods --namespace=default

实时修改
使用 kubectl edit 可以修改的是对象允许更新的字段例,例如 Deployment 的副本数和镜像,这里我们使用前面已经部署好的 Nginx 这个 Deployment
kubectl edit 默认使用的是 vi/vim 编辑器
kubectl edit deployment nginx-deployment

多个容器
一个 Pod 中,是可以包含多个容器的,我们可以使用命令或 YAML 形式创建包含多个容器的 Pod 服务
kubectl create deployment nginx-test --image=nginx:latest --image=busybox:latest --dry-run=client -o yaml

kubectl get services --namespace kubernetes-dashboard
登陆即可,IP 是 master 的 IP

总结
本章我们粗略涉及了一下 deployment 的知识,但 deployment 不仅仅只有这么些内容,当前只是进行了基础操作,对于原理我们尚未涉及
但学习总得有个过程,先学基础概念,再到基础操作,然后深入原理
愿诸君顺遂