k8s —— deployment应用 (转发)

k8s的deployment应用

Kubernetes 通过各种 Controller 来管理 Pod 的生命周期。为了满足不同业务场景,Kubernetes 开发了 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等多种 Controller。我们首先学习最常用的 Deployment。

运行一个deployment

复制代码
[root@k8s-master k8s]# kubectl run nginx-deployment --image=nginx:1.79 --replicas=2
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
deployment.apps/nginx-deployment created

[root@k8s-master k8s]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 2 2 2 2 3m17s

[root@k8s-master k8s]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-deployment-5fd98dbf5f-w94g4 1/1 Running 0 3m55s 10.244.2.7 k8s-node1 <none>
nginx-deployment-5fd98dbf5f-x5jt5 1/1 Running 0 3m55s 10.244.1.7 k8s-node2 <none>

复制代码

部署一个deployment名称叫 nginx-deployment    镜像是nginx:1.79  2个副本

 查看详细信息

通过kubectl describe  deployment   查看该deployment详细信息

这个对象  nginx-deployment-5fd98dbf5f   2个副本被创建了  来自deployment-controller

查看pod

发觉这两个pod的前缀都是 nginx-deployment-5fd98dbf5f  不同的是后面的5位随机数

查看pod的详细信息

 

通过查看pod的详细信息,可以看到 控制管理器是 replicasset,事件(Events)记录了 pod的创建过程,如果创建失败可以从事件中查找原因

创建过程

1、kubectl创建deployment

2、deployment创建Replcasset

3、根据Replicaset创建pod

命名方式

replicas的命名方式 :deployment名称+随机数

pod的命名方式:replicas名称+随机数

k8s资源应用的自由伸缩Scale(up/down)

 

伸缩(Scale Up/Down)是指在线增加或减少 Pod 的副本数。

1.增加副本

Deployment   nginx-deployment初始是两个副本。

复制代码
[root@k8s-master k8s]# kubectl apply -f nginx.yaml 
deployment.extensions/nginx-deployment created
[root@k8s-master k8s]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE
nginx-deployment-57f56449d9-8b9xp   1/1     Running   0          16s   10.244.2.11   k8s-node1   <none>
nginx-deployment-57f56449d9-lnxlb   1/1     Running   0          16s   10.244.1.11   k8s-node2   <none>
复制代码

现在将配置文件中原先replicas为2 改为5 pod将会怎么分布

[root@k8s-master k8s]# kubectl apply -f nginx.yaml 
deployment.extensions/nginx-deployment configured

2.master节点工作负载选择

这里由于我将master节点去除了污点,所以他既是管理节点也是工作节点。

下面的命令就是去除master节点污点的命令

kubectl taint node k8s-master node-role.kubernetes.io/master-

如果不想让master节点参与到工作负载

kubectl taint node k8s-master node-role.kubernetes.io/master="":NoSchedule

删除deployment 重新执行

[root@k8s-master k8s]# kubectl delete -f nginx.yaml 
deployment.extensions "nginx-deployment" deleted

3.减少副本 

接下来修改配置文件,将副本数减少为 3 个,重新执行 kubectl apply

 

可以看到两个副本被删除,最终保留了 3 个副本。

k8s的故障切换(failover)

 

当前3个节点的状态都为ready

当前node1有两个pod  node2有1个pod

现在将node1关机会有怎样的现象

ping 分布在node1节点的pod地址已经ping不通。

 

在node1节点上的pod状态都变为unknow,并重新在node2上开启两个pod维持副本数始终为3,实现了fail over。

 当 k8s-node1 恢复后,Unknown 的 Pod 会被删除,不过已经运行的 Pod 不会重新调度回 k8s-node1。(也就是说是非抢占式的)

 

pod的状态 Unkown状态 变为 Terminating 状态 最后这些pod会消失。

删除deployment

[root@k8s-master k8s]# kubectl delete -f nginx.yaml 
deployment.extensions "nginx-deployment" deleted

k8s通过label来控制pod的位置

 

默认情况下,scheduler会将pod调度到所有可用的Node,不过有些情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。

kubernetes通过label来实现这个功能

label 是 key-value 对,各种资源都可以设置 label,灵活添加各种自定义属性。比如执行如下命令标注 k8s-node1 是配置了 SSD 的节点

首先我们给k8s-node1节点打上一个ssd的标签

kubectl label node k8s-node1 disktype=ssd

通过 kubectl get node --show-labels

disktype=ssd 已经成功添加到 k8s-node1,除了 disktype,Node 还有几个 Kubernetes 自己维护的 label。

有了自定义的disktype=ssd 这个标签,只需要在配置文件中定义 nodeselector 为这个自定义标签,就可以指定pod在k8s-node1中运行

部署deployment验证

 

全部 6 个副本都运行在 k8s-node1 上,符合我们的预期。

要删除 label disktype,执行如下命令:

kubectl label node k8s-node1 disktype-

 node/k8s-node1 labeled

不过删除标签 并不会重新部署,所以pod依旧是在k8s-node1上。

要想让k8s-node2也参与到工作负载,则必须删掉当前的deployment,并删除或注释掉配置文件中的 nodeSelector配置。

 我们看到之前的pod会被全部删除掉,并重新调度到不同的k8s节点上

原文地址:https://www.cnblogs.com/panpanwelcome/p/13634078.html