Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源。
Pod的分类:
自主式Pod:Pod退出后不会被创建
控制器管理的Pod:在控制器的生命周期里,始终要维持Pod的副本数目
控制器类型:
ReplicaSet 是下一代的Replication Controller,官方推荐使用ReplicaSet。ReplicationController用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。
ReplicaSet 和Replication Controller的唯一区别是选择器的支持,ReplicaSet支持新的基于集合的选择器需求。
ReplicaSet 确保任何时间都有指定数量的Pod副本在运行。
虽然ReplicaSets可以独立使用,但今天它主要被Deployments用作协调Pod创建、删除和更新的机制。
Deployment为Pod和ReplicaSet提供了一个申明式的定义方法。
典型的应用场景:
DaemonSet确保全部(或者某些)节点上运行一个Pod的副本。当有节点加入集群时,也会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。删除 DaemonSet将会删除它创建的所有Pod。
DaemonSet的典型用法:
一个简单的用法是在所有的节点上都启动一个DaemonSet,将被作为每种类型的daemon使用。
一个稍微复杂的用法是单独对每种daemon类型使用多个DaemonSet,但具有不同的标志,并且对不同硬件类型具有不同的内存、CPU要求。
StatefulSet是用来管理有状态应用的工作负载API对象。实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用"
StatefulSet用来管理Deployment和扩展一组Pod,井且能为这些Pod提供*序号和唯一性保证*。
StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
Job:
执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束
Cronjob:
HPA:
根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放。
\vi rs.yaml
apiVersion: apps/v1 #api版本定义
kind: ReplicaSet #定义资源类型为ReplicaSet
metadata: #元数据定义
name: replicaset-example
spec: #ReplicaSet的规格定义
replicas: 2 #定义副本数量为2个
selector: #标签选择器,定义匹配pod的标签
matchLabels:
app: nginx
template: #pod的模板定义
metadata: #pod的元数据定义
labels: #定义pod的标签,需要和上面定义的标签一致,也可以多出其他标签
app: nginx
spec: #pod的规格定义
containers: #容器定义
- name: nginx #容器名称
image: nginx #容器镜像
kubectl apply -f rs.yaml
注意:在使用指定控制器时,尽量使用apply来创建pod,apply支持更新而create不支持
kubectl get pod
kubectl get rs
可以看到一次运行了两个pod
kubectl get pod -o wide
实现了负载均衡
pod拉伸:
我们可以直接在yaml文件中修改副本的个数(我改为4个了)
kubectl apply -f rs.yaml
kubectl get pod -o wide
可以看到更改文件后增加成4个
缩减时也可以直接在文件中修改(又改为两个):
kubectl apply -f rs.yaml
kubectl get pod -o wide
可以看到副本数量又变回两个,而且删除的两个是刚才新添加的
使用RS控制pod副本:更改pod的标签
kubectl get pod --show-labels
kubectl label pod fronted-cr2h1 app=myapp --overwrite
kubectl get pod --show-labels
之前是2个pod,由于改了标签,控制器又开启了一个pod,控制自己维护的标签的pod始终是2个
kubectl delete pod fronted-cr2h1
kubectl get pod --show-labels
此时该pod被永久删除
如果我们先修改标签,再恢复标签:
kubectl get pod --show-labels
kubectl label pod fronted-vlpq1 app=myapp --overwrite
kubectl get pod --show-labels
kubectl label pod fronted-vlpq1 app=myapp --overwrite
kubectl get pod --show-labels
可以看到恢复标签后,修改时被新建的副本又被删除了
一个Deployment控制器为Pods和ReplicaSets提供描述性的更新方式。
先删除上面的实验:kubectl delete -f rs.yaml
kubectl get pod
\vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: myapp:v1
ports:
- containerPort: 80
kubectl apply -f deployment.yaml
kubectl get all
拉伸:这里的拉伸和上面的rs没有区别,因为副本的数量就是由rs控制的
滚动更新:只需要在yaml文件中将myapp的版本改为v2即可
kubectl get rs
我们可以看到之前的rs还存在,便于后面的回滚
kubectl get pod -o wide
curl 10.244.2.32
可以看到更新成功
回滚:与更新的方法相同,只需要修改文件内容的版本。回滚会直接使用原来的rs(更新时并没有删除)
DaemonSet确保全部(或者某些)节点上运行一个Pod的副本。当有节点加入集群时,也会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。
首先在server1中拉取zabbix镜像并上传到harbor仓库
vim daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
labels:
app: zabbix-agent
spec:
selector:
matchLabels:
app: zabbix-agent
template:
metadata:
labels:
app: zabbix-agent
spec:
containers:
- name: zabbix-agent
image: zabbix-agent
kubectl apply -f daemonset.yaml
kubectl get all
kubectl get pod -o wide
注意:DaemonSet控制器不需要rs来维护副本。DaemonSet确保每个节点运行一个pod副本。当有节点新加入集群时,也会为他们新增一个pod。当节点从集群删除时,对应的pod会被回收。如果删除DaemonSet会删除它创建的所有pod
删除一个pod:
kubectl get pod -o wide
kubectl delete pod ds-2pk1s
kubectl get pod -o wide
我们可以看到:删除后,DaemonSet控制器会自动再启动一个pod
job比较适合做计算类的操作
首先拉取per镜像,上传至私有仓库
计算圆周率:
vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
kubectl apply -f job.yaml #计算的结果在日志中
kubectl get pod -o wide
vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-example
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: cronjob
image: busybox
args:
- /bin/sh
- -c
- date;echo Hello from k8s cluster
restartPolicy: OnFailure
kubectl get pod -w
kubectl get pod
kubectl logs cronjob-example-1587266520-g6ckb