文章目录
主要内容
- DaemonSet
- StatefulSet
- Job与CronJob
一.DaemonSet
DaemonSet 控制器能确保全部(或者某些)节点上运行一个 Pod 的副本。当有新节点加入集群
时,也会为新节点启动一个 Pod,当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet
将会删除它创建的所有 Pod。
DaemonSet 的一些典型用法:
1.在每个节点上运行集群守护进程。
2.在每个节点上运行日志收集守护进程。
3.在每个节点上运行监控守护进程。
DaemonSet是Kubernetes中的一种控制器,用于在集群的每个节点上运行一个Pod副本。与其他控制器(如Deployment)不同,DaemonSet的目标是在集群的每个节点上都运行一个Pod副本,而不是在整个集群中维护固定数量的副本。
DaemonSet通常用于在每个节点上运行一些特定的系统级别任务或服务,例如日志收集器、监控代理、网络代理等。它们确保每个节点都有一个Pod副本运行,以便为特定的任务提供服务。当集群的节点动态增加或减少时,DaemonSet会自动调整Pod的副本数,以保持每个节点上都有一个Pod副本运行。
使用DaemonSet的步骤如下:
- 创建一个DaemonSet定义文件,指定要运行的Pod的配置和规范。
- 使用kubectl命令或通过定义文件使用kubectl apply命令来创建DaemonSet。
- Kubernetes会自动在集群的每个节点上创建一个Pod副本,以满足DaemonSet的要求。
- 当新的节点加入集群或现有节点离开集群时,Kubernetes会自动调整Pod的副本数,以保持每个节点上都有一个Pod副本运行。
- 可以使用kubectl命令来查看DaemonSet的状态、副本数和Pod的运行情况。
使用DaemonSet的优点包括:
- 每个节点上都有一个Pod副本,确保每个节点都能执行特定的任务或服务。
- 当集群的节点动态增加或减少时,DaemonSet会自动调整Pod的副本数。
- 提供了一种简单的方式来在整个集群中部署和管理系统级别的任务或服务。
总之,DaemonSet是一种非常有用的控制器,用于在Kubernetes集群的每个节点上运行特定的任务或服务。它提供了一种简单而灵活的方式来管理系统级别的工作负载,并确保每个节点都能执行所需的任务。
1.DaemonSet,使用busybox镜像,在每一个节点上都运行一个Pod。
代码如下(示例):
cat > daemonset.yml <<EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: test-demonset
labels:
daemonset: test
spec:
selector:
matchLabels:
name: testpod
template:
metadata:
labels:
name: testpod
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'sleep 3600']
EOF
kubectl create -f daemonset.yml
kubectl get daemonsets.apps
kubectl delete -f daemonset.yml
2.解释
这是一个创建和删除DaemonSet的示例YAML文件及其相关命令。让我逐句解释一下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: test-demonset
labels:
daemonset: test
apiVersion
:指定使用的Kubernetes API版本。kind
:指定资源类型为DaemonSet。metadata
:指定资源的元数据,包括名称和标签。name
:指定DaemonSet的名称为test-demonset
。labels
:为DaemonSet添加标签,这里的标签是daemonset: test
。
spec:
selector:
matchLabels:
name: testpod
spec
:指定DaemonSet的规范。selector
:指定要选择的Pod的标签。matchLabels
:指定要与Pod标签匹配的标签,这里的标签是name: testpod
。
template:
metadata:
labels:
name: testpod
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'sleep 3600']
template
:指定要创建的Pod的模板。metadata
:指定Pod的元数据,包括标签。labels
:为Pod添加标签,这里的标签是name: testpod
。spec
:指定Pod的规范。containers
:指定Pod中的容器。name
:指定容器的名称为hello
。image
:指定容器使用的镜像为busybox
。imagePullPolicy
:指定镜像拉取策略为IfNotPresent
,即只有在本地不存在时才拉取镜像。command
:指定容器的命令,这里是让容器执行sleep 3600
。
kubectl create -f daemonset.yml
- 使用
kubectl create
命令创建DaemonSet,通过指定YAML文件daemonset.yml
来创建。
kubectl get daemonsets.apps
- 使用
kubectl get
命令获取当前集群中所有的DaemonSet。
kubectl delete -f daemonset.yml
- 使用
kubectl delete
命令删除DaemonSet,通过指定YAML文件daemonset.yml
来删除。
这些命令和YAML文件的组合将创建一个名为test-demonset
的DaemonSet,并在每个节点上运行一个名为hello
的容器,该容器使用busybox
镜像并执行sleep 3600
命令。通过kubectl get daemonsets.apps
命令可以查看DaemonSet的状态和副本数。最后,使用kubectl delete -f daemonset.yml
命令可以删除该DaemonSet。
二.StatefulSet
StatefulSet 控制器用来管理基于相同容器规约的一组 Pod。但和 Deployment 不同的是,
StatefulSet 为它的每个 Pod 维护了一个有粘性的 ID。这些 Pod 是基于相同的规约来创建
的,但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。
StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
1.稳定的、唯一的网络标识符。
2.稳定的、持久的存储。
3.有序的、优雅的部署和缩放。
4. 有序的、自动的滚动更新。
StatefulSet是Kubernetes中的一种控制器,用于管理有状态应用程序的部署。与Deployment不同,StatefulSet为每个Pod副本分配一个唯一的标识符和稳定的网络标识符。这使得有状态应用程序能够保持数据的持久性和稳定性。
使用StatefulSet可以实现以下功能:
-
稳定的网络标识符:StatefulSet为每个Pod副本分配一个稳定的网络标识符,该标识符基于Pod的名称和唯一索引。这使得有状态应用程序能够使用固定的网络标识符进行通信,而不会受到Pod重启或重新调度的影响。
-
有序部署和删除:StatefulSet支持有序部署和有序删除Pod副本。这意味着在创建或删除Pod副本时,StatefulSet会确保按照定义的顺序进行操作。这对于有状态应用程序非常重要,因为它们可能依赖于特定的启动或关闭顺序。
-
持久性存储:StatefulSet可以与持久性存储卷(如PersistentVolumeClaim)一起使用,以实现数据的持久性。每个Pod副本可以使用独立的持久性存储卷来存储数据,从而确保数据在Pod重启或重新调度时不会丢失。
使用StatefulSet的步骤如下:
- 创建一个StatefulSet定义文件,指定要运行的有状态应用程序的配置和规范,包括Pod模板、持久性存储等。
- 使用kubectl命令或通过定义文件使用kubectl apply命令来创建StatefulSet。
- Kubernetes会自动创建并管理Pod副本,为每个Pod副本分配唯一的标识符和网络标识符。
- 可以使用kubectl命令来查看StatefulSet的状态、副本数和Pod的运行情况。
使用StatefulSet的优点包括:
- 提供了稳定的网络标识符和有序部署/删除功能,确保有状态应用程序的稳定性和可靠性。
- 支持与持久性存储卷一起使用,实现数据的持久性和可靠性。
- 提供了一种简单而灵活的方式来管理有状态应用程序的部署。
总之,StatefulSet是一种非常有用的控制器,用于管理有状态应用程序的部署。它提供了稳定的网络标识符、有序部署/删除和持久性存储等功能,以确保有状态应用程序的稳定性和可靠性。
1.StatefulSet,使用NGINX镜像,创建一个副本数为3的有状态应用,并挂载本地目录到容器中。
代码如下(示例):
cat > statefulset.yml <<EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumes:
- name: www
emptyDir: {}
EOF
kubectl create -f statefulset.yml
kubectl get pods -w
kubectl delete -f daemonset.yml
2.解释
这是一个创建和删除DaemonSet的示例YAML文件及其相关命令。让我逐句解释一下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: test-demonset
labels:
daemonset: test
apiVersion
:指定使用的Kubernetes API版本。kind
:指定资源类型为DaemonSet。metadata
:指定资源的元数据,包括名称和标签。name
:指定DaemonSet的名称为test-demonset
。labels
:为DaemonSet添加标签,这里的标签是daemonset: test
。
spec:
selector:
matchLabels:
name: testpod
spec
:指定DaemonSet的规范。selector
:指定要选择的Pod的标签。matchLabels
:指定要与Pod标签匹配的标签,这里的标签是name: testpod
。
template:
metadata:
labels:
name: testpod
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'sleep 3600']
template
:指定要创建的Pod的模板。metadata
:指定Pod的元数据,包括标签。labels
:为Pod添加标签,这里的标签是name: testpod
。spec
:指定Pod的规范。containers
:指定Pod中的容器。name
:指定容器的名称为hello
。image
:指定容器使用的镜像为busybox
。imagePullPolicy
:指定镜像拉取策略为IfNotPresent
,即只有在本地不存在时才拉取镜像。command
:指定容器的命令,这里是让容器执行sleep 3600
。
kubectl create -f daemonset.yml
- 使用
kubectl create
命令创建DaemonSet,通过指定YAML文件daemonset.yml
来创建。
kubectl get daemonsets.apps
- 使用
kubectl get
命令获取当前集群中所有的DaemonSet。
kubectl delete -f daemonset.yml
- 使用
kubectl delete
命令删除DaemonSet,通过指定YAML文件daemonset.yml
来删除。
这些命令和YAML文件的组合将创建一个名为test-demonset
的DaemonSet,并在每个节点上运行一个名为hello
的容器,该容器使用busybox
镜像并执行sleep 3600
命令。通过kubectl get daemonsets.apps
命令可以查看DaemonSet的状态和副本数。最后,使用kubectl delete -f daemonset.yml
命令可以删除该DaemonSet。
三.Job与CronJob
Job和CronJob是Kubernetes中用于管理批处理任务的两个重要资源。它们的详细解释和用法如下:
Job
Job是一种用于在Kubernetes集群中运行一次性任务的资源。它确保任务成功完成,即使在任务失败后也会重试。Job资源的用法如下:
- 创建一个Job:使用YAML文件定义Job的规范,其中包括任务的模板、重试策略和完成策略。
- 提交Job:使用
kubectl create
命令将Job的YAML文件提交给Kubernetes API服务器。 - 监视Job的状态:使用
kubectl get jobs
命令获取当前集群中所有的Job,使用kubectl describe job <job-name>
命令获取特定Job的详细信息。 - 查看任务的日志:使用
kubectl logs <pod-name>
命令查看任务的日志输出。 - 清理Job:使用
kubectl delete job <job-name>
命令删除Job及其相关的Pod。
Job资源适用于一次性的、并行的、非周期性的任务。例如,批量处理数据、数据迁移、数据备份等。
CronJob
CronJob是一种用于在Kubernetes集群中运行周期性任务的资源。它基于Cron表达式,可以按照指定的时间间隔或时间点来调度任务。CronJob资源的用法如下:
- 创建一个CronJob:使用YAML文件定义CronJob的规范,其中包括任务的模板、调度时间和重试策略。
- 提交CronJob:使用
kubectl create
命令将CronJob的YAML文件提交给Kubernetes API服务器。 - 监视CronJob的状态:使用
kubectl get cronjobs
命令获取当前集群中所有的CronJob,使用kubectl describe cronjob <cronjob-name>
命令获取特定CronJob的详细信息。 - 查看任务的日志:使用
kubectl logs <pod-name>
命令查看任务的日志输出。 - 清理CronJob:使用
kubectl delete cronjob <cronjob-name>
命令删除CronJob及其相关的Pod。
CronJob资源适用于周期性的任务,如定时生成报表、定期清理数据等。
总结:Job适用于一次性任务,而CronJob适用于周期性任务。它们都提供了一种简单而强大的方式来管理和调度批处理任务,使得在Kubernetes集群中运行和管理这些任务变得更加方便和可靠。
1.Job与CronJob,一次性作业,不断打印CKA JOB!字符串,失败最多重试4次。
代码如下(示例):
cat > job.yml <<EOF
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: busybox
imagePullPolicy: IfNotPresent
command: ["sh", "-c", "while true; do echo CKA JOB!; done"]
restartPolicy: Never
backoffLimit: 4
EOF
kubectl create -f job.yml
kubectl get jobs,pods
kubectl logs pi-l4kdj
kubectl delete -f job.yml
2.解释
下面是对每一句命令的详细解释:
cat > job.yml <<EOF
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: busybox
imagePullPolicy: IfNotPresent
command: ["sh", "-c", "while true; do echo CKA JOB!; done"]
restartPolicy: Never
backoffLimit: 4
EOF
cat > job.yml
:将后续输入的内容写入名为job.yml
的文件中。<<EOF
:开始输入多行文本,直到遇到EOF
为止。这里是在命令行中直接输入Job的YAML定义。apiVersion: batch/v1
:指定使用的API版本为batch/v1
,表示使用批处理API。kind: Job
:指定资源类型为Job。metadata: name: pi
:指定Job的名称为pi
。spec: template: spec:
:定义Job的Pod模板规范。containers: - name: pi
:定义一个名为pi
的容器。image: busybox
:指定容器使用的镜像为busybox
。imagePullPolicy: IfNotPresent
:指定镜像拉取策略为IfNotPresent
,即只有在本地不存在时才拉取镜像。command: ["sh", "-c", "while true; do echo CKA JOB!; done"]
:指定容器的命令,这里是让容器无限循环输出CKA JOB!
。restartPolicy: Never
:指定Pod的重启策略为Never
,表示任务完成后不会自动重启。backoffLimit: 4
:指定任务的重试次数限制为4次。
kubectl create -f job.yml
- 使用
kubectl create
命令创建Job,通过指定YAML文件job.yml
来创建。
kubectl get jobs,pods
- 使用
kubectl get
命令获取当前集群中所有的Jobs和Pods,以查看Job和相关的Pod的状态。
kubectl logs pi-l4kdj
- 使用
kubectl logs
命令查看特定Pod的日志输出,这里的pi-l4kdj
是Pod的名称,可以从kubectl get pods
命令的输出中获取。
kubectl delete -f job.yml
- 使用
kubectl delete
命令删除Job,通过指定YAML文件job.yml
来删除。
这些命令和YAML文件的组合将创建一个名为pi
的Job,并在一个Pod中运行一个名为pi
的容器,该容器使用busybox
镜像并无限循环输出CKA JOB!
。通过kubectl get jobs,pods
命令可以查看Job和相关Pod的状态。最后,使用kubectl delete -f job.yml
命令可以删除该Job。
3.周期性作业,每分钟打印一次指定字符串。
代码如下(示例):
cat > crobjob.yml <<EOF
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjobtest
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
EOF
kubectl create -f crobjob.yml
kubectl get cronjobs,pod
kubectl logs cronjobtest-28030327-zrdsj
kubectl delete -f crobjob.yml
4.解释
下面是对每一句命令的详细解释:
cat > crobjob.yml <<EOF
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjobtest
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
EOF
cat > crobjob.yml
:将后续输入的内容写入名为crobjob.yml
的文件中。<<EOF
:开始输入多行文本,直到遇到EOF
为止。这里是在命令行中直接输入CronJob的YAML定义。apiVersion: batch/v1
:指定使用的API版本为batch/v1
,表示使用批处理API。kind: CronJob
:指定资源类型为CronJob。metadata: name: cronjobtest
:指定CronJob的名称为cronjobtest
。spec: schedule: "*/1 * * * *"
:指定CronJob的调度时间表达式为每分钟执行一次。jobTemplate: spec: template: spec:
:定义CronJob的Job模板规范。containers: - name: hello
:定义一个名为hello
的容器。image: busybox
:指定容器使用的镜像为busybox
。imagePullPolicy: IfNotPresent
:指定镜像拉取策略为IfNotPresent
,即只有在本地不存在时才拉取镜像。command: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster.
:指定容器的命令,这里是打印当前时间和输出一条消息。restartPolicy: OnFailure
:指定Pod的重启策略为OnFailure
,表示任务失败时才会重启。
kubectl create -f crobjob.yml
- 使用
kubectl create
命令创建CronJob,通过指定YAML文件crobjob.yml
来创建。
kubectl get cronjobs,pod
- 使用
kubectl get
命令获取当前集群中所有的CronJobs和Pods,以查看CronJob和相关的Pod的状态。
kubectl logs cronjobtest-28030327-zrdsj
- 使用
kubectl logs
命令查看特定Pod的日志输出,这里的cronjobtest-28030327-zrdsj
是Pod的名称,可以从kubectl get pods
命令的输出中获取。
kubectl delete -f crobjob.yml
- 使用
kubectl delete
命令删除CronJob,通过指定YAML文件crobjob.yml
来删除。
这些命令和YAML文件的组合将创建一个名为cronjobtest
的CronJob,该CronJob将每分钟执行一次任务。任务会在一个Pod中运行一个名为hello
的容器,该容器使用busybox
镜像,并执行一条命令来打印当前时间和输出一条消息。通过kubectl get cronjobs,pods
命令可以查看CronJob和相关Pod的状态。最后,使用kubectl delete -f crobjob.yml
命令可以删除该CronJob。
总结
以上是今天要讲的内容,学到了DaemonSet;StatefulSet;Job与CronJob。