通常使用 pod 的单个容器,因为它们更容易构建和维护,尽管在某些情况下您可能希望在 Pod 中运行多个容器
使用多容器 Pod 时,容器通常通过共享存储共享数据。
这里我有一个用于创建多容器 sidecar pod 的示例 YAML 文件:
[root@controller ~]# cat create-sidecar.yml
kind: Pod
apiVersion: v1
metadata:
name: sidecar-pod
spec:
volumes:
- name: logs
emptyDir: {}
containers:
- name: app
image: busybox
command: ["/bin/sh"]
args: ["-c", "while true; do date >> /var/log/date.txt; sleep 10; done"]
volumeMounts:
- name: logs
mountPath: /var/log
- name: sidecar
image: centos/httpd
ports:
- containerPort: 80
volumeMounts:
- name: logs
mountPath: /var/www/html
创建Sidecar 容器:
[root@controller ~]# kubectl create -f create-sidecar.yml
pod/sidecar-pod created
验证状态,创建两个容器时需要一些时间:
[root@controller ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 55m
sidecar-pod 0/2 ContainerCreating 0 25s
重新检查一段时间,Pod 应该处于运行状态:
[root@controller ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 67m 10.36.0.4 worker-1.example.com
sidecar-pod 2/2 Running 0 12m 10.44.0.1 worker-2.example.com
以下命令连接到此 pod:
[root@controller ~]# kubectl exec -it sidecar-pod -c sidecar -- /bin/bash
[root@sidecar-pod /]#
现在,我们可以使用在循环中每 10 秒检查一次附加命令输出的内容:curl date.txt date
[root@sidecar-pod ~]# curl http://localhost/date.txt
Fri Nov 27 05:43:00 UTC 2020
Fri Nov 27 05:43:10 UTC 2020
Fri Nov 27 05:43:20 UTC 2020
Fri Nov 27 05:43:30 UTC 2020
Fri Nov 27 05:43:40 UTC 2020
Fri Nov 27 05:43:50 UTC 2020
Fri Nov 27 05:44:00 UTC 2020
Fri Nov 27 05:44:11 UTC 2020
Fri Nov 27 05:44:21 UTC 2020
检查和分析 pod 的不同命令,例如,目前我有我们在上一个示例中创建的 sidecar pod:
[root@controller ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
sidecar-pod 2/2 Running 0 111s
为了获取这个pod的更多详细信息,我们将使用命令,如你所见,它为我们提供了关于这个pod的一系列信息:kubectl describe pods
~]# kubectl describe pods sidecar-pod
Name: sidecar-pod
Namespace: default
Priority: 0
Node: worker-1.example.com/192.168.43.49
Start Time: Sat, 28 Nov 2020 00:10:56 +0530
Labels:
Annotations:
Status: Running
IP: 10.36.0.1
IPs:
IP: 10.36.0.1
Containers:
...
下一个命令可用于从 pod 获取 STDOUT 和 STDERR 消息,为了证明这一点,我创建了另一个 pod,它将每 5 秒在控制台上写入日期输出:sleepy
[root@controller ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
sidecar-pod 2/2 Running 0 15m 10.36.0.1 worker-1.example.com
sleepy 1/1 Running 0 12s 10.44.0.1 worker-2.example.com
[root@controller ~]# kubectl logs sleepy
Fri Nov 27 18:56:32 UTC 2020
Fri Nov 27 18:56:37 UTC 2020
Fri Nov 27 18:56:42 UTC 2020
要连接到 Pod 内的容器:
kubectl exec -it -c --
例如,sidecar要连接到容器sidecar-pod
[root@controller ~]# kubectl exec -it sidecar-pod -c sidecar -- /bin/bash
[root@sidecar-pod /]#
您可以输入,然后按 ENTER 从容器脚本中退出来。exit
kubectl delete pod
因此,要删除我们的nginx pod,我们将使用:
[root@controller ~]# kubectl delete pod nginx
pod "nginx" deleted
可以通过指定完成和并行参数来创建 3 种不同的作业类型:
非并行工作(Non-parallel Jobs):启动一个Pod,除非Pod失败
completions=1
parallelism=1
具有固定完成计数的并行作业:作业在成功运行 jobs.spec.completions 中指定的次数后完成
completions=n
parallelism=m
具有工作队列的并行作业:启动多个作业,当一个作业成功完成时,作业完成
completions=1
parallelism=n
如果您需要一个 Job 运行多次,您可以将完成次数设置为您希望 Job 的 pod 运行的次数。对于此演示,我们需要创建一个Job让我们检查所需的apiVersion.
apiVersion所以Job KIND 的要求是batch/v1
[root@controller ~]# kubectl explain Job
KIND: Job
VERSION: batch/v1
下面是一个示例 YAML 文件:
[root@controller ~]# cat pod-simple-job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: pod-simple-job
spec:
completions: 3
template:
spec:
containers:
- name: sleepy
image: alpine
command: ["/bin/sleep"]
args: ["5"]
restartPolicy: Never
在这里,我们定义了 completion: 3,因此我们希望作业的 pod 按顺序运行 3 次。
[root@controller ~]# kubectl create -f pod-simple-job.yml
job.batch/pod-simple-job created
检查可用 Pod 的列表:
[root@controller ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 47m
pod-simple-job-52vr7 0/1 ContainerCreating 0 3s
一个新的 Pod 启动,根据我们 YAML 文件中的描述创建容器。一旦我们在这个容器中执行的命令完成,另一个 Pod 应该会自动启动,因为希望按顺序发生:
[root@controller ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 48m
pod-simple-job-52vr7 0/1 Completed 0 13s
pod-simple-job-bhrf5 0/1 ContainerCreating 0 2s
一旦第一个 Pod 状态完成,另一个 Pod 就会启动。您可以使用以下方法检查作业的状态:
[root@controller ~]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
pod-simple-job 1/3 16s 16s
完成所有作业后:
[root@controller ~]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
pod-simple-job 3/3 36s 3m36s
当 Job 完成时,不会再创建 Pod,但也不会删除 Pod。保留它们允许您仍然查看已完成的 pod 的日志以检查错误、警告或其他诊断输出。作业对象在完成后也会保留,以便您可以查看其状态。在注意到旧作业的状态后,由用户删除旧作业。
[root@controller ~]# kubectl delete jobs pod-simple-job
job.batch "pod-simple-job" deleted
终止作业的另一种方法是设置有效截止日期。通过将 .spec.activeDeadlineSeconds 作业的字段设置为秒数来执行此操作。适用 activeDeadlineSeconds 于作业的持续时间,无论创建了多少个 Pod。一旦 Job 到达 activeDeadlineSeconds,它所有正在运行的 Pod 都会终止,并且 Job 状态将变为 type: Failed with reason: DeadlineExceeded。
系统中通常不再需要已完成的作业。将它们保留在系统中会给 API 服务器带来压力。如果 Jobs 直接由更高级别的控制器管理,例如 CronJobs,则 Jobs 可以根据指定的基于容量的清理策略由 CronJobs 清理
欢迎各位小伙伴关注、点赞、评论、转发,你的关注和转发是我最大的动力!
页面更新:2024-04-14
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号