kubernetes09(kubernetes的pod控制器)
这里写目录标题
kubernetes09(kubernetes的pod控制器)
一.引子
上一篇笔者对kubernetes的资源对象进行了分类,说白了,kubernetes的pod控制器也是一组对象。pod控制器的类型有很多,他们的功能和使用让笔者娓娓道来。
二.pod控制器简介
Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。
三.pod控制器种类
(一).ReplicationController(RC):
1.ReplicationController 工作原理
在用户定义范围内,如果pod增多,则ReplicationController会终止额外的pod,如果减少,RC会创建新的pod,始终保持在定义范围。例如,RC会在Pod维护(例如内核升级)后在节点上重新创建新Pod。
2.使用RC创建POD
vim rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
[[email protected] ~]# kubectl create -f rc.yaml
replicationcontroller/nginx created
(二).ReplicaSet(RS):
ReplicaSet(RS)是Replication Controller(RC)的升级版本。ReplicaSet 和 Replication Controller之间的唯一区别是对选择器的支持。ReplicaSet支持labels user guide中描述的set-based选择器要求(多标签集合控制), 而Replication Controller仅支持equality-based的选择器要求。代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
ReplicaSet主要三个组件组成:
(1)用户期望的pod副本数量
(2)标签选择器,判断哪个pod归自己管理
(3)当现存的pod数量不足,会根据pod资源模板进行新建
帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。
(三).Deployment:
1.Deployment的概念
工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。Deployment为Pod和Replica Set(升级版的 Replication Controller)提供声明式更新。你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。这就是声明式的含义。
2.Deployment的用例
- 使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod。检查启动状态,看它是成功还是失败。
- 然后,通过更新Deployment的PodTemplateSpec字段来声明Pod的新状态。这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新的ReplicaSet中。
- 如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。
- 扩容Deployment以满足更高的负载。
- 暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。
- 根据Deployment 的状态判断上线是否hang住了。
- 清除旧的不必要的 ReplicaSet。
3.Deployment的状态管理(创建,更新,扩容…)
(1).deployment的创建(使用yaml文件)
[[email protected] ~]# kubectl create -f dep.yaml
deployment.apps/nginx-deployment created
[[email protected] ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 98m
[[email protected] ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5754944d6c 3 3 3 98m
[[email protected] ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-deployment-5754944d6c-5fxlw 1/1 Running 0 101m app=nginx,pod-template-hash=5754944d6c
nginx-deployment-5754944d6c-bmmx8 1/1 Running 0 101m app=nginx,pod-template-hash=5754944d6c
nginx-deployment-5754944d6c-bmzzd 1/1 Running 0 101m app=nginx,pod-template-hash=5754944d6c
(2).更新deployment(命令,yaml文件,edit)
[[email protected] ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.extensions/nginx-deployment image updated
[[email protected] ~]# kubectl edit deployment/nginx-deployment
containers:
- image: nginx:1.9.1
imagePullPolicy: IfNotPresent
[[email protected] ~]# kubectl rollout status deployment/nginx-deployment
deployment "nginx-deployment" successfully rolled out
(3).回滚到上一个版本(其实有点像更新,最好还是保留yaml文件进行管理)
#查看更新历史版本
[[email protected] ~]# kubectl rollout history deployment/nginx-deployment
deployment.extensions/nginx-deployment
REVISION CHANGE-CAUSE
#回滚到上一个版本
[[email protected] ~]# kubectl rollout undo deployment/nginx-deployment
deployment.extensions/nginx-deployment rolled back
#指定回滚版本
[[email protected] ~]# kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment.extensions/nginx-deployment rolled back
(4).deployment的扩容
[[email protected] ~]# kubectl scale deployment nginx-deployment --replicas 5
deployment.extensions/nginx-deployment scaled
[[email protected] ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-7448597cd5-6q8lr 1/1 Running 0 2m3s
nginx-deployment-7448597cd5-8pmp6 1/1 Running 0 12s
nginx-deployment-7448597cd5-hpcp5 1/1 Running 0 118s
nginx-deployment-7448597cd5-k76wj 1/1 Running 0 2m5s
nginx-deployment-7448597cd5-wvzn9 1/1 Running 0 12s
(5).暂停和恢复Deployment
kubectl rollout pause deployment/nginx-deployment
#Deployment 暂停前的初始状态将继续它的功能,而不会对 Deployment 的更新产生任何影响,只要 Deployment是暂停的。
Deployment 在生命周期中有多种状态。在创建一个新的 ReplicaSet 的时候它可以是 progressing 状态, complete 状态,或者 fail to progress 状态。
(四).DaemonSet:
DaemonSet* 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod**
特性:服务是无状态的
服务必须是守护进程
使用 DaemonSet 的一些典型用法:
- 运行集群存储 daemon,例如在每个 Node 上运行 glusterd、ceph
- 在每个 Node 上运行日志收集 daemon,例如fluentd、logstash
- 在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter(https://github.com/prometheus/node_exporter)、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: deamonset-example
labels:
app: daemonset
spec:
selector:
matchLabels:
name: deamonset-example
template:
metadata:
labels:
name: deamonset-example
spec:
containers:
- name: daemonset-example
image: wangyanglinux/myapp:v1
(五).Job:
Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束,只要完成就立即退出,不需要重启或重建。
(六).Cronjob:
周期性任务控制,不需要持续后台运行.
典型的用法如下所示:
- 在给定的时间点调度 Job 运行
- 创建周期性运行的 Job,例如:数据库备份、发送邮件
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
(七).StatefulSet:
管理有状态应用
StatefulSet 作为 Controller 为 Pod 提供唯一的标识。它可以保证部署和 scale 的顺序。
StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括:**
- 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
- 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
- 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
- 有序收缩,有序删除(即从N-1到0)
小结:其实无论是有状态还是无状态的pod控制器,本质上都是对pod进行管理。控制器和pod都可以在yaml被定义及进行管理。
上一篇: Centos7下安装和配置vim
推荐阅读
-
kubernetes09(kubernetes的pod控制器)
-
kubernetes中的静态Pod
-
[kubernetes]pod的存活探针
-
Kubernetes强制删除一直处于Terminating状态的pod,namespace
-
Kubernetes 配置Pod和容器(十二)configmap的使用
-
Kubernetes强制删除一直处于Terminating状态的pod,namespace
-
Kubernetes-pod的运用
-
Kubernetes:强制删除一直处于Terminating状态的pod,deployment,namespace,server
-
Kubernetes pod的yaml详解
-
浅析kubernetes的控制器和标签