Pod 的分类:
自主式 Pod:Pod 退出后不会被创建
控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目
官方文档:https://v1-25.docs.kubernetes.io/zh-cn/docs/concepts/workloads/controllers/
- 控制器类型
- Replication Controller和ReplicaSet(RS一般不会单独用,一般都是和deployment一起使用)
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 -> ReplicaSet -> 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 要求。
- StatefulSet
StatefulSet 是用来管理有状态应用的工作负载 API 对象。实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用”
StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供*序号和唯一性保证*。
StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
稳定的、唯一的网络标识符。
稳定的、持久的存储。
有序的、优雅的部署和缩放。
有序的、自动的滚动更新。
- Job
执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束。
- CronJob
Cron Job 创建基于时间调度的 Jobs。
一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。
- HPA
根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放。
[root@k8s2 pod]# vim rs-example.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-example
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
[root@k8s2 pod]# kubectl apply -f rs-example.yml
[root@k8s2 pod]# kubectl get pod --show-labels ##显示所有标签
NAME READY STATUS RESTARTS AGE LABELS
replicaset-example-q2sq9 1/1 Running 0 14s app=nginx
replicaset-example-th24v 1/1 Running 0 14s app=nginx
replicaset-example-w7zpw 1/1 Running 0 14s app=nginx
replicaset是通过标签匹配pod
[root@k8s2 pod]# kubectl label pod replicaset-example-q2sq9 app=myapp --overwrite
[root@k8s2 pod]# kubectl get pod --show-labels ##显示所有标签
NAME READY STATUS RESTARTS AGE LABELS
replicaset-example-276ph 1/1 Running 0 8m52s app=myapp
replicaset-example-ffdbs 1/1 Running 0 5s app=nginx
replicaset-example-hnzmb 1/1 Running 0 8m52s app=nginx
replicaset-example-x9dxr 1/1 Running 0 8m52s app=nginx
[root@k8s2 pod]# kubectl label pod replicaset-example-q2sq9 app=nginx --overwrite ##重新覆盖
[root@k8s2 pod]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-example-276ph 1/1 Running 0 9m38s app=nginx
replicaset-example-hnzmb 1/1 Running 0 9m38s app=nginx
replicaset-example-x9dxr 1/1 Running 0 9m38s app=nginx
replicaset自动控制副本数量,pod可以自愈
[root@k8s2 pod]# kubectl delete pod replicaset-example-276ph
[root@k8s2 pod]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-example-hnzmb 1/1 Running 0 10m app=nginx
replicaset-example-jmjqp 1/1 Running 0 7s app=nginx ##重新生成一个ip
replicaset-example-x9dxr 1/1 Running 0 10m app=nginx
回收资源
[root@k8s2 pod]# kubectl delete -f rs-example.yml
deployment -> rs控制器 -> pod
[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-example
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[root@k8s2 pod]# kubectl apply -f deployment-example.yaml
[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-example
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v2 ##v1改为v2
[root@k8s2 pod]# kubectl apply -f deployment-example.yaml
replicaset就是deployment的一个版本
[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-example
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1 ##改动处
[root@k8s2 pod]# kubectl apply -f deployment-example.yaml
[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-example
spec:
minReadySeconds: 5
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[root@k8s2 pod]# kubectl apply -f deployment-example.yaml
暂停,避免触发不必要的线上更新
[root@k8s2 pod]# kubectl rollout pause deployment deployment-example
[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-example
spec:
minReadySeconds: 5 ##改动处
strategy: ##改动处
rollingUpdate: ##改动处
maxSurge: 1 ##改动处
maxUnavailable: 0 ##改动处
replicas: 6 ##改动处
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx ##以下均有改动
resources:
limits:
cpu: 0.5
memory: 200Mi
requests:
cpu: 0.5
memory: 200Mi
[root@k8s2 pod]# kubectl apply -f deployment-example.yaml
但是更新镜像和修改资源并没有触发更新
[root@k8s2 pod]# kubectl rollout history deployment deployment-example
deployment.apps/deployment-example
REVISION CHANGE-CAUSE
4
5
恢复后开始触发更新
[root@k8s2 pod]# kubectl rollout resume deployment deployment-example
[root@k8s2 pod]# kubectl rollout history deployment deployment-example
deployment.apps/deployment-example
REVISION CHANGE-CAUSE
4
5
6
回收
[root@k8s2 pod]# kubectl delete -f deployment-example.yaml
执行之后会在每一个节点上都运行一个
[root@k8s2 pod]# cat daemonset-example.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
tolerations:
- effect: NoSchedule
operator: Exists
containers:
- name: nginx
image: nginx
[root@k8s2 pod]# kubectl apply -f daemonset-example.yml
回收
[root@k8s2 pod]# kubectl delete -f daemonset-example.yml
[root@k8s2 pod]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
completions: 6
parallelism: 2
template:
spec:
containers:
- name: pi
image: perl:5.34.0 ##拉取上传到harbor仓库
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] ##显示pi后面2000位小数
restartPolicy: Never ##不会重启
backoffLimit: 4 ##出错次数限制为4次
[root@k8s2 pod]# kubectl apply -f job.yml
[root@k8s2 ~]# kubectl logs pi-hjkcl ##查看生成的日志信息
回收
[root@k8s2 pod]# kubectl delete -f job.yml
[root@k8s2 pod]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
[root@k8s2 pod]# kubectl apply -f cronjob.yml
回收
[root@k8s2 pod]# kubectl delete -f cronjob.yml
[root@server2 ~]# kubectl delete cronjob hello ##也可以通过单条命令删除,时间任务名称要看正确即可