工作负载是在kubernetes上运行的应用程序。无论你的负载是单一组件还是由多个一同工作的组件构成,在Kubernetes中你可以在一组Pods中运行它。
在Kuberneres中,pod代表的是集群上处于运行状态的一组容器。
Kubernetes Pods有确定的生命周期。例如,当某Pod在你的集群中运行时,Pod运行所在的节点出现致命错误时,所有该节点上的Pods都会失败。Kubernetes将这类失败视为最终状态:即使该节点后来恢复正常运行,你也需要创建新的Pod来恢复应用。
不过,为了让用户的日子略微好过一点,你并不需要直接管理每个Pod。相反,你可以使用负载资源来替你管理一组Pods。这些资源配置控制器来确保合适类型的、处于运行状态的Pod个数是正确的,与你所指定的状态相一致。
常用的工作负载控制器:
- Deployment:无状态应用部署
- StatefulSet:有状态应用部署
- DaemonSet:确保所有Node运行同一个Pod
- JOb:一次性服务
- Cronjob:定时任务
控制器的作用:
- 管理pod对象
- 使用标签与Pod关联
- 控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等
deployment
一个Deployment为Pods和ReplicaSets提供声明式的更新能力。
你负责描述Deployment中的目标状态,而Deployment控制器以受控速率更改实际状态,使其变为期望状态。你可以定义Deployment以创建新的ReplicaSet,或删除现有Deployment,并通过新的Deployment收养其资源。
Deployment很适合用来管理你的集群上的无状态应用,Deployment中的所有pod都是相互等价的,并且在需要的时候被换掉。
[root@master]# cat deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy
labels:
app: nginx
spec:
replicas: 3 //创建三个pod副本replicas
selector: //定义 Deployment 如何查找要管理的 Pods
matchLabels:
app: nginx //需要满足的规则
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
[root@master]# kubectl apply -f deploy.yml
deployment.apps/deploy created
[root@master]# kubectl get pod
NAME READY STATUS RESTARTS AGE
deploy-8d545c96d-6vmnd 1/1 Running 0 49s
deploy-8d545c96d-l4kx4 1/1 Running 0 49s
deploy-8d545c96d-nk25r 1/1 Running 0 49s
ReplicaSet的工作原理
RepicaSet是通过一组字段来定义的,包括一个识别可获得的Pod的集合的选择算符、一个用来标明应该维护的副本个数的数值、一个用来指定应该创建新Pod以满足副本个数条件时要使用的Pod模板等等。每个ReplicaSet都通过根据需要创建新的Pod时,会使用所提供的Pod模板。
ReplicaSet通过Pod上的字段连接到附属Pod,该字段给出当前对象的属主资源。ReplicaSet所获得的Pod都在其字段中包含了属主ReplicaSet的标识信息。正是通过这一连接,ReplicaSet 知道它所维护的 Pod 集合的状态, 并据此计划其操作行为。metadata.ownerReferences
ownerReferences
ReplicaSet 使用其选择算符来辨识要获得的 Pod 集合。如果某个 Pod 没有 OwnerReference 或者其 OwnerReference 不是一个控制器,且其匹配到 某 ReplicaSet 的选择算符,则该 Pod 立即被此 ReplicaSet 获得。
使用ReplicaSet
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。然而,Deployment 是一个更高级的概念,它管理 ReplicaSet,并向 Pod 提供声明式的更新以及许多其他有用的功能。因此,我们建议使用 Deployment 而不是直接使用 ReplicaSet,除非 你需要自定义更新业务流程或根本不需要更新。
这实际上意味着,你可能永远不需要操作 ReplicaSet 对象:而是使用 Deployment,并在 spec 部分定义你的应用。
[root@master]# cat replicaset.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset
labels:
app: httpd
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: httpd
image: httpd:latest
//查看当前被部署的ReplicaSet
[root@master]# kubectl apply -f replicaset.yaml
replicaset.apps/replicaset created
[root@master]# kubectl apply -f replicaset.yml
replicaset.apps/replicaset created
[root@master]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deploy-8d545c96d 3 3 3 2m16s
replicaset 3 3 0 10s
[[root@master]# kubectl get pod
NAME READY STATUS RESTARTS AGE
deploy-8d545c96d-6vmnd 1/1 Running 0 2m39s
deploy-8d545c96d-l4kx4 1/1 Running 0 2m39s
deploy-8d545c96d-nk25r 1/1 Running 0 2m39s
httpd1-57c7b6f7cb-sk86h 1/1 Running 5 (21h ago) 2d22h
nginx1-7cf8bc594f-8j8tv 1/1 Running 2 (21h ago) 25h
replicaset-2v8rh 1/1 Running 0 33s
replicaset-5r5mb 0/1 ContainerCreating 0 33s
replicaset-rc4zq 0/1 ContainerCreating 0 33s
test 1/1 Running 1 (21h ago) 21h
DaemonSet守护进程集
DaemonSet确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
DaemonSet 的一些典型用法:
- 在每个节点上运行集群守护进程
- 在每个节点上运行日志收集守护进程
- 在每个节点上运行监控守护进程
一种简单的用法是为每种类型的守护进程在所有的节点上都启动一个 DaemonSet。一个稍微复杂的用法是为同一种守护进程部署多个 DaemonSet;每个具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。
创建DaemonSet
[root@master]# cat daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
# this toleration is to have the daemonset runnable on master nodes
# remove it if your masters can't run pods
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
//创建查看
[root@master]# kubectl apply -f daemonset.yml
daemonset.apps/fluentd-elasticsearch created
[root@master]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-6d8c4cb4d-pqvll 1/1 Running 11 2h
etcd-master.example.com 1/1 Running 11 2h
fluentd-elasticsearch-9hcxh 0/1 ContainerCreating 0 20s
fluentd-elasticsearch-wqtv5 0/1 ContainerCreating 0 20s
fluentd-elasticsearch-xk92n 0/1 ContainerCreating 0 20s
job
Job 会创建一个或者多个 Pods,并将继续重试 Pods 的执行,直到指定数量的 Pods 成功终止。随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。当数量达到指定的成功个数阈值时,任务(即 Job)结束。删除 Job 的操作会清除所创建的全部 Pods。挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。
一种简单的使用场景下,你会创建一个 Job 对象以便以一种可靠的方式运行某 Pod 直到完成。当第一个 Pod 失败或者被删除(比如因为节点硬件失效或者重启)时,Job 对象会启动一个新的 Pod。
你也可以使用 Job 以并行的方式运行多个 Pod。
[root@master]# cat jobs.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
//运行查看
[root@master]# kubectl apply -f jobs.yaml
job.batch/pi created
[root@master]# kubectl describe jobs/pi
Name: pi
Namespace: default
Selector: controller-uid=8d4b7a4d-0e9f-476d-ac0c-b05389e85e57
Labels: controller-uid=8d4b7a4d-0e9f-476d-ac0c-b05389e85e57
job-name=pi
Annotations: batch.kubernetes.io/job-tracking:
Parallelism: 1
Completions: 1
Completion Mode: NonIndexed
Start Time: Fri, 24 Dec 2021 08:03:23 -0500
Pods Statuses: 1 Active / 0 Succeeded / 0 Failed
Pod Template:
Labels: controller-uid=8d4b7a4d-0e9f-476d-ac0c-b05389e85e57
job-name=pi
Containers:
pi:
Image: perl
Port: <none>
Host Port: <none>
Command:
perl
-Mbignum=bpi
-wle
print bpi(2000)
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 23s job-controller Created pod: pi-dblxb
CronJob
功能状态: Kubernetes v1.21 [stable]
CronJob创建基于时隔重复调度的Jobs。
一个 CronJob 对象就像crontab (cron table) 文件中的一行。它用Cron格式进行编写, 并周期性地在给定的调度时间执行 Job。
所有CronJob的 时间都是基于 kube-controller-manager.的时区。schedule:
如果你的控制平面在 Pod 或是裸容器中运行了 kube-controller-manager, 那么为该容器所设置的时区将会决定 Cron Job 的控制器所使用的时区。
为 CronJob 资源创建清单时,请确保所提供的名称是一个合法的DNS 子域名.名称不能超过 52 个字符。这是因为 CronJob 控制器将自动在提供的 Job 名称后附加 11 个字符,并且存在一个限制, 即 Job 名称的最大长度不能超过 63 个字符。
CronJob 用于执行周期性的动作,例如备份、报告生成等。这些任务中的每一个都应该配置为周期性重复的(例如:每天/每周/每月一次); 你可以定义任务开始执行的时间间隔。
[root@master]# cat cronjob.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *" //每分钟
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@master]# kubectl apply -f cronjob.yml
Warning: batch/v1beta1 CronJob is deprecated in v1.21+, unavailable in v1.25+; use batch/v1 CronJob
cronjob.batch/hello created[root@master mainfest]# kubectl apply -f cronjob.yaml
cronjob.batch/hello created
[root@master]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-27339185-2z8qj 0/1 Completed 0 16s
[root@master]# kubectl logs hello-27339185-2z8qj
Fri Dec 24 13:05:01 UTC 2021
Hello from the Kubernetes cluster
cron语法格式