k8s 控制器
文章目录
控制器简介
-
Pod 的分类:
- 自主式 Pod:Pod 退出后不会被创建
- 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目
-
控制器类型:
- Replication Controller和ReplicaSet
- Deployment
- DaemonSet
- StatefulSet
- Job
- CronJob
- HPA全称Horizontal Pod Autoscaler
控制器类型
Replication Controller和ReplicaSet
- ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。
- ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持,ReplicaSet 支持新的基于集合的选择器需求。
- ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。
虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制。
Deployment
- Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。
- 典型的应用场景:
- 用来创建Pod和ReplicaSet
- 滚动更新和回滚
- 扩容和缩容
- 暂停与恢复
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 要求。
Job
- 执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束。
CronJob
-
Cron Job 创建基于时间调度的 Jobs。
-
一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。
HPA
- 根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放。
实验
deployment 控制器
# 创建deployment 控制器资源清单
kubectl explain deployment.apiVersion
kubectl explain deployment.spec
kubectl explain deployment.spec.template.spec
# 编写资源清单
vim pod.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 3
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
# 推送
kubectl apply -f pod.yml
# 查看
kubectl get deployments.apps
# 查看pod 标签
kubectl get pod --show-labels
# 删除
kubectl delete -f pod.yml
# 手动创建deployment 控制器
kubectl create deployment nginx --image=myapp:v1
# 以yml 格式输出deployment 创建过程
kubectl get deployments.apps nginx -o yaml
# 删除
kuectel delete deployment nginx
标签操作
# 标签操作
# 查看标签
kubectl get nodes server3 --show-labels
# 添加标签
kubectl label nodes server3 app=nginx
# 重写
kubectl label nodes server3 app=myapp --overwrite
# 删除
kubectl label nodes server3 app-
daemonset 控制器
# daemonset 控制器资源清单
vim 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
# 推送
kubectl apply -f daemonset.yml
# 查看
kubectl get pod -o wide
# 删除
kubectl delete -f daemonset.yml
cronjob 控制器
# cronjob 控制器资源清单
vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busyboxplus
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- date; echo Hello from the kubernetes cluster
restartPolicy: OnFailure
# 查看default namespace 下所有
kubectl get all
# 查看控制器日志
kubectl logs job.batch/hello-27085815
Thu Jul 1 14:15:02 UTC 2021
Hello from the kubernetes cluster
# 删除
kubectl delete -f cronjob.yml
job 控制器
# job 控制器资源清单
vim job-example.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-example.yaml
# 查看
kubectl get pod
NAME READY STATUS RESTARTS AGE
pi-mxjbh 1/1 running 0 10s
# 输出为圆周率
kubectl logs pi-mxjbh
# 删除
kubectl delete -f job-example.yaml