k8s(2)-容器运行应用(上)

发布于:2023-01-04 ⋅ 阅读:(675) ⋅ 点赞:(0)

1.Deployment运行原理

前面我们有提到过Deployment实现对Pod的多副本管理实际上是使用了ReplicaSet。

执行命令:

kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2

流程:

  1. 用户通过 kubectl 创建 Deployment。

  2. Deployment 创建 ReplicaSet。

  3. 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+配置文件的部署方法提高工作效率。

基于命令的方式:

  1. 简单直观快捷,上手快。

  2. 适合临时测试或实验。

基于配置文件的方式:

  1. 配置文件描述了 What,即应用最终要达到的状态。

  2. 配置文件提供了创建资源的模板,能够重复部署。

  3. 可以像管理代码一样管理部署。

  4. 适合正式的、跨环境的、规模化部署。

  5. 这种方式要求熟悉配置文件的语法,有一定难度。

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。


网站公告

今日签到

点亮在社区的每一天
去签到