1.Deployment运行原理
前面我们有提到过Deployment实现对Pod的多副本管理实际上是使用了ReplicaSet。
执行命令:
kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2
流程:
用户通过
kubectl
创建 Deployment。Deployment 创建 ReplicaSet。
ReplicaSet 创建 Pod。
补充命令:
查看Deployment状态:kubectl get deployment
kubectl describe deployment(详细)
查看ReplicaSet状态:kubectl get replicaset kubectl describe replicaset2.
2.yaml配置文件
不仅kubectl可以创建资源,配置文件同样可以,配置文件和kubectl apply配合使用。举个例子:
用 kubectl 命令直接创建,比如:
kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2
通过配置文件和 kubectl apply
创建,要完成前面同样的工作,可执行命令:
kubectl apply -f nginx.yml
nginx.yml 的内容为:
两者实现的部署相同。
尽量使用apply+配置文件的部署方法提高工作效率。
基于命令的方式:
简单直观快捷,上手快。
适合临时测试或实验。
基于配置文件的方式:
配置文件描述了
What
,即应用最终要达到的状态。配置文件提供了创建资源的模板,能够重复部署。
可以像管理代码一样管理部署。
适合正式的、跨环境的、规模化部署。
这种方式要求熟悉配置文件的语法,有一定难度。
3.什么是yaml?
注意yaml配置文件是以yml为文件拓展名。
以 nginx-deployment 为例,配置文件如下图所示:
① apiVersion
是当前配置格式的版本。
② kind
是要创建的资源类型,这里是 Deployment
。
③ metadata
是该资源的元数据,name
是必需的元数据项。
④ spec
部分是该 Deployment
的规格说明。
⑤ replicas
指明副本数量,默认为 1。
⑥ template
定义 Pod 的模板,这是配置文件的重要部分。
⑦ metadata
定义 Pod 的元数据,至少要定义一个 label。label 的 key 和 value 可以任意指定。
⑧ spec
描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name
和 image
是必需的。
执行 kubectl apply -f nginx.yml
部署成功。
Deployment、ReplicaSet、Pod 都已经就绪。
如果要删除这些资源,删除Deployment或者yaml文件。执行 kubectl delete deployment nginx-deployment
或者 kubectl delete -f nginx.yml
。
4.伸缩改变pod的数量(Scale Up/Down)
更改yaml文件的replicas选项,重新执行 kubectl apply -f nginx.yml即可。
值得注意的是,在默认情况下,pod不会别分配到Msater节点上,平均分配到两个Node节点,当然Master也可以当做普通Node节点使用。执行命令:
kubectl taint node k8s-master node-role.kubernetes.io/master-
如果想要解除Master当做Node节点:
kubectl taint node k8s-master node-role.kubernetes.io/master="":NoSchedule
5.模拟节点宕机
前面还剩下三个nginx副本,随机分配在node1和node2节点上,在node2上执行halt -h,模拟node2节点宕机。等待一段时间,Kubernetes 会检查到 k8s-node2 不可用,将 k8s-node2 上的 Pod 标记为 Unknown
状态,并在 k8s-node1 上新创建两个 Pod,维持总副本数为 3。
当 k8s-node2 恢复后,Unknown
的 Pod 会被删除,不过已经运行的 Pod 不会重新调度回 k8s-node2。
删除nginx-deployment,为第6部分做准备。
6.label控制Pod运行位置
如果你想把全部副本部署到node1而不要部署在node2呢?
1.给node1添加自定义标签label。
kubectl label node k8s-node1 disktype=ssd
注意这里disktype=ssd为自定义标签,可以随意写属性和属性值。
2.修改yaml文件
添加这两行,指定Pod部署到有该自定义标签的node节点上。
有个问题,如何额查看节点已有的标签?(等待解答)
部署 Deployment 并查看 Pod 的运行节点:
要删除 label disktype
,执行如下命令:
kubectl label node k8s-node1 disktype-
一个横杆表示删除。不过此时 Pod 并不会重新部署,依然在 k8s-node1 上运行。除非在 nginx.yml 中删除 nodeSelector
设置,然后通过 kubectl apply
重新部署。Kubernetes 会删除之前的 Pod 并调度和运行新的 Pod。