文章目录
1.控制器的介绍
Pod 的分类:
• 自主式 Pod:Pod 退出后不会被创建
• 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目
控制器类型:
• Replication Controller和ReplicaSet
• Deployment
• DaemonSet
• StatefulSet
• Job
• CronJob
• HPA全称Horizontal Pod Autoscaler
1.Replication Controller和ReplicaSet
ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。
ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持,ReplicaSet 支持新的基于集合的选择器需求。ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制。
2.Deployment
Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。典型的应用场景: 用来创建Pod和ReplicaSet 、滚动更新和回滚、扩容和缩容、暂停与恢复。
3.DaemonSet
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
DaemonSet 的典型用法:
• 在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。
• 在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。
• 在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等
• 一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种 类型的 daemon 使用。 • 一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet, 但具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。
4.StatefulSet
StatefulSet 是用来管理有状态应用的工作负载 API 对象。实例之间有不对 等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用”
StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供序号和唯一性保证。
StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
• 稳定的、唯一的网络标识符。
• 稳定的、持久的存储。
• 有序的、优雅的部署和缩放。
• 有序的、自动的滚动更新。
5.Job
Job执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束。
6.CronJob
Cron Job 创建基于时间调度的 Jobs。 一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。
7.HPA
HPA根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放。
2. ReplicaSet控制器
参考官网:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#replicaset-v1-apps
[kubeadm@server1 mainfest]$ vim rs.yml
[kubeadm@server1 mainfest]$ cat rs.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-example
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[kubeadm@server1 mainfest]$ kubectl apply -f rs.yml
replicaset.apps/replicaset-example created
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
replicaset-example-69tbm 1/1 Running 0 17s 10.244.1.31 server2 <none> <none>
replicaset-example-d46ff 1/1 Running 0 17s 10.244.2.44 server3 <none> <none>
replicaset-example-tmm25 1/1 Running 0 17s 10.244.2.45 server3 <none> <none>
[kubeadm@server1 mainfest]$ vim rs.yml
[kubeadm@server1 mainfest]$ cat rs.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-example
spec:
replicas: 10
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[kubeadm@server1 mainfest]$ kubectl apply -f rs.yml
replicaset.apps/replicaset-example configured
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
replicaset-example-69tbm 1/1 Running 0 39s 10.244.1.31 server2 <none> <none>
replicaset-example-7zxcw 1/1 Running 0 4s 10.244.1.35 server2 <none> <none>
replicaset-example-94p7z 1/1 Running 0 4s 10.244.2.47 server3 <none> <none>
replicaset-example-d46ff 1/1 Running 0 39s 10.244.2.44 server3 <none> <none>
replicaset-example-f9vf9 1/1 Running 0 4s 10.244.1.33 server2 <none> <none>
replicaset-example-lbpls 1/1 Running 0 4s 10.244.2.48 server3 <none> <none>
replicaset-example-spt6f 1/1 Running 0 4s 10.244.1.32 server2 <none> <none>
replicaset-example-tfwjh 1/1 Running 0 4s 10.244.1.34 server2 <none> <none>
replicaset-example-tmm25 1/1 Running 0 39s 10.244.2.45 server3 <none> <none>
replicaset-example-vsl5k 1/1 Running 0 4s 10.244.2.46 server3 <none> <none>
[kubeadm@server1 mainfest]$ vim rs.yml
[kubeadm@server1 mainfest]$ cat rs.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-example
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[kubeadm@server1 mainfest]$ kubectl apply -f rs.yml
replicaset.apps/replicaset-example configured
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
replicaset-example-69tbm 1/1 Running 0 57s 10.244.1.31 server2 <none> <none>
replicaset-example-7zxcw 0/1 Terminating 0 22s 10.244.1.35 server2 <none> <none>
replicaset-example-94p7z 0/1 Terminating 0 22s 10.244.2.47 server3 <none> <none>
replicaset-example-d46ff 0/1 Terminating 0 57s 10.244.2.44 server3 <none> <none>
replicaset-example-f9vf9 0/1 Terminating 0 22s 10.244.1.33 server2 <none> <none>
replicaset-example-lbpls 0/1 Terminating 0 22s 10.244.2.48 server3 <none> <none>
replicaset-example-spt6f 0/1 Terminating 0 22s 10.244.1.32 server2 <none> <none>
replicaset-example-tfwjh 0/1 Terminating 0 22s 10.244.1.34 server2 <none> <none>
replicaset-example-tmm25 1/1 Running 0 57s 10.244.2.45 server3 <none> <none>
replicaset-example-vsl5k 0/1 Terminating 0 22s 10.244.2.46 server3 <none> <none>
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
replicaset-example-69tbm 1/1 Running 0 66s 10.244.1.31 server2 <none> <none>
replicaset-example-tmm25 1/1 Running 0 66s 10.244.2.45 server3 <none> <none>
[kubeadm@server1 mainfest]$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/replicaset-example-69tbm 1/1 Running 0 74s
pod/replicaset-example-tmm25 1/1 Running 0 74s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d
NAME DESIRED CURRENT READY AGE
replicaset.apps/replicaset-example 2 2 2 74s
控制器可以任意拉缩
回收的时候会优先回收新创建的容器
但是如果修改镜像,则不会满足。
3.deployment控制器
参考官网:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#deployment-v1-apps
3.1 单个deployment控制器
[kubeadm@server1 mainfest]$ vim deployment.yml
[kubeadm@server1 mainfest]$ cat deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
ports:
- containerPort: 80
[kubeadm@server1 mainfest]$ kubectl apply -f deployment.yml
deployment.apps/deployment-myapp created
[kubeadm@server1 mainfest]$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/deployment-myapp-569fb7cdcb-4z2bp 1/1 Running 0 10s
pod/deployment-myapp-569fb7cdcb-s7qv6 1/1 Running 0 10s
pod/deployment-myapp-569fb7cdcb-wrddw 1/1 Running 0 10s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d1h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/deployment-myapp 3/3 3 3 10s
NAME DESIRED CURRENT READY AGE
replicaset.apps/deployment-myapp-569fb7cdcb 3 3 3 10s
注意:在deployment控制器中,如果删除pod后还会有新的pod的pod,所以如果pod状态不对可以删除进行调整。
3.2 多个deployment控制器
[kubeadm@server1 mainfest]$ vim deployment.yml
[kubeadm@server1 mainfest]$ cat deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-v1
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-v2
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v2
ports:
- containerPort: 80
[kubeadm@server1 mainfest]$ kubectl apply -f deployment.yml
deployment.apps/deployment-v1 created
deployment.apps/deployment-v2 created
[kubeadm@server1 mainfest]$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/deployment-myapp-569fb7cdcb-2tnnl 1/1 Running 0 10m
pod/deployment-myapp-569fb7cdcb-9n92v 1/1 Running 0 10m
pod/deployment-myapp-569fb7cdcb-pzjwt 1/1 Running 0 10m
pod/deployment-v1-569fb7cdcb-bqtjj 1/1 Running 0 8s
pod/deployment-v1-569fb7cdcb-ctzp6 1/1 Running 0 8s
pod/deployment-v1-569fb7cdcb-xjnf4 1/1 Running 0 8s
pod/deployment-v2-6b54f6ffb9-lbbbx 1/1 Running 0 7s
pod/deployment-v2-6b54f6ffb9-q7fph 1/1 Running 0 8s
pod/deployment-v2-6b54f6ffb9-rvgzq 1/1 Running 0 7s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d1h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/deployment-myapp 3/3 3 3 18m
deployment.apps/deployment-v1 3/3 3 3 8s
deployment.apps/deployment-v2 3/3 3 3 8s
NAME DESIRED CURRENT READY AGE
replicaset.apps/deployment-myapp-569fb7cdcb 3 3 3 18m
replicaset.apps/deployment-myapp-6b54f6ffb9 0 0 0 13m
replicaset.apps/deployment-v1-569fb7cdcb 3 3 3 8s
replicaset.apps/deployment-v2-6b54f6ffb9 3 3 3 8s
[kubeadm@server1 mainfest]$ kubectl delete deployments.apps deployment-v1 ##删除其中一个控制器
4.DaemonSet控制器
DaemonSet控制器可以每个节点部署一个容器
参考
[kubeadm@server1 mainfest]$ vim daemonset.yml
[kubeadm@server1 mainfest]$ cat daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
labels:
k8s-app: zabbix-agent
spec:
selector:
matchLabels:
name: zabbix-agent
template:
metadata:
labels:
name: zabbix-agent
spec:
containers:
- name: zabbix-agent
image: zabbix-agent
[kubeadm@server1 mainfest]$ kubectl apply -f daemonset.yml
daemonset.apps/daemonset-example created
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-example-8n9mv 1/1 Running 0 8s 10.244.2.59 server3 <none> <none>
daemonset-example-zfprr 1/1 Running 0 8s 10.244.1.44 server2 <none> <none>
5.Job控制器
参考官网:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#job-v1-batch
[kubeadm@server1 mainfest]$ vim job.yml
[kubeadm@server1 mainfest]$ cat job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
metadata:
name: pi
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
[kubeadm@server1 mainfest]$ kubectl apply -f job.yml
job.batch/pi created
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
pi-fzj8p 0/1 Completed 0 6s
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-fzj8p 0/1 Completed 0 12s 10.244.2.60 server3 <none> <none>
[kubeadm@server1 mainfest]$ kubectl logs pi-fzj8p
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
6. CronJob 控制器
[kubeadm@server1 mainfest]$ vim cronjob.yml
[kubeadm@server1 mainfest]$ cat cronjob.yml
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
[kubeadm@server1 mainfest]$ kubectl apply -f cronjob.yml
cronjob.batch/cronjob-example created
[kubeadm@server1 mainfest]$ kubectl get pod
No resources found in default namespace.
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
cronjob-example-1593121920-sv47j 0/1 Completed 0 54s
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
cronjob-example-1593121920-sv47j 0/1 Completed 0 65s
cronjob-example-1593121980-pxjvs 0/1 ContainerCreating 0 5s
[kubeadm@server1 mainfest]$ kubectl logs cronjob-example-1593121920-sv47j
Thu Jun 25 21:52:39 UTC 2020
Hello from k8s cluster
[kubeadm@server1 mainfest]$ kubectl logs cronjob-example-1593121980-pxjvs
Thu Jun 25 21:53:13 UTC 2020
Hello from k8s cluster