🤵 个人博客: https://www.tingyinhu.com
🎨 微信公众号:java编程秀
✏️ 记录基础知识,做大家的备忘录。
🚀 分享前沿技术,做大家的加油站。
📝 如果文章对你有帮助的话,欢迎 「分享⏩在看👀点赞👍收藏📂」,不胜感激!
Pod
每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类:
-
用户程序所在的容器,数量可多可少
-
Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:
-
可以以它为依据,评估整个Pod的健康状态
-
可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现Pod内部的网路通信
-
这里是Pod内部的通讯,Pod的之间的通讯采用虚拟二层网络技术来实现,我们当前环境用的是Flannel
Pod的资源清单:
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,资源类型,例如 Pod
metadata: #必选,元数据
name: string #必选,Pod名称
namespace: string #Pod所属的命名空间,默认为"default"
labels: #自定义标签列表
- name: string
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表
- name: string #必选,容器名称
image: string #必选,容器的镜像名称
imagePullPolicy: [ Always|Never|IfNotPresent ] #获取镜像的策略
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口的名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存请求,容器启动的初始可用数量
lifecycle: #生命周期钩子
postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要制定的命令或脚本
httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure] #Pod的重启策略
nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上
nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: #在该pod上定义共享存储卷列表
- name: string #共享存储卷名称 (volumes类型有很多种)
emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string #Pod所在宿主机的目录,将被用于同期中mount的目录
secret: #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
eg:
apiVersion: v1
kind: Pod
metadata:
name: pod-nginx
labels:
app: myapp
spec:
containers:
- name: app-nginx-pod
image: nginx:1.20.0
- name: app-busybox-pod
image: busybox:1.34.0
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
[root@master k8sstudy]# kubectl get pod -o wide | grep pod
pod-nginx 2/2 Running 0 29s 10.244.1.20 node1 <none> <none>
[root@master k8sstudy]# kubectl describe pod pod-nginx
Name: pod-nginx
Namespace: default
Priority: 0
Node: node1/192.168.233.91
Start Time: Tue, 08 Nov 2022 09:21:45 +0800
Labels: app=myapp
Annotations: <none>
Status: Running
IP: 10.244.1.20
IPs:
IP: 10.244.1.20
Containers:
app-nginx-pod:
Container ID: docker://b5b473adb9abb17c4be03c97b5c5f6629c2ae54ee6fe7914719e38e4e02a94d3
Image: nginx:1.20.0
Image ID: docker-pullable://nginx@sha256:ea4560b87ff03479670d15df426f7d02e30cb6340dcd3004cdfc048d6a1d54b4
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 08 Nov 2022 09:21:46 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-dzwqk (ro)
app-busybox-pod:
Container ID: docker://dc3cb65dac35271fe2e3a60c8ff903475db50c3c400111aabbec76796ec156c6
Image: busybox:1.34.0
Image ID: docker-pullable://busybox@sha256:e8e5cca392e3cf056fcdb3093e7ac2bf83fcf28b3bcf5818fe8ae71cf360c231
Port: <none>
Host Port: <none>
Command:
/bin/sh
-c
sleep 3600
State: Running
Started: Tue, 08 Nov 2022 09:22:03 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-dzwqk (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-dzwqk:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-dzwqk
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m43s default-scheduler Successfully assigned default/pod-nginx to node1
Normal Pulled 3m43s kubelet, node1 Container image "nginx:1.20.0" already present on machine
Normal Created 3m43s kubelet, node1 Created container app-nginx-pod
Normal Started 3m42s kubelet, node1 Started container app-nginx-pod
Normal Pulling 3m42s kubelet, node1 Pulling image "busybox:1.34.0"
Normal Pulled 3m25s kubelet, node1 Successfully pulled image "busybox:1.34.0"
Normal Created 3m25s kubelet, node1 Created container app-busybox-pod
Normal Started 3m25s kubelet, node1 Started container app-busybox-pod
[root@master k8sstudy]# kubectl exec -it pod-nginx -c app-busybox-pod -- /bin/sh
~ # cd /bin
/bin # ls
[ dnsdomainname id mkfs.minix rev tee
[[ dos2unix ifconfig mkfs.vfat rm telnet
acpid dpkg ifdown mknod rmdir telnetd
ReplicationController(RC)
ReplicationController(RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的 Pod 来替代;而如果异常多出来的容器也会自动回收;
在新版本的 Kubernetes 中建议使用 ReplicaSet 来取代 ReplicationController 。ReplicaSet 跟ReplicationController 没有本质的不同,只是名字不一样,并且 ReplicaSet 支持集合式的 selector;
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: app-rc-ngx
image: nginx:1.20.0
ports:
- containerPort: 80
[root@master ~]# kubectl get rc,pod | grep rc
replicationcontroller/rc-nginx 3 3 3 31h
pod/rc-nginx-6nnjb 1/1 Running 1 31h
pod/rc-nginx-vstnn 1/1 Running 1 31h
pod/rc-nginx-w4qs9 1/1 Running 1 31h
ReplicaSet(RS)
ReplicaSet的主要作用是保证一定数量的pod正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和镜像版本的升降级。
ReplicaSet的资源清单文件:
apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: #标签
controller: rs
spec: # 详情描述
replicas: 3 # 副本数量
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: nginx-pod
matchExpressions: # Expressions匹配规则
- {key: app, operator: In, values: [nginx-pod]}
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
eg:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
spec:
selector:
matchExpressions:
- key: app
operator: In
values:
- spring-k8s
- hahahah
template:
metadata:
labels:
app: spring-k8s
spec:
containers:
- name: app-rs-ngx
image: nginx:1.20.0
ports:
- containerPort: 80
[root@master ~]# kubectl get rs,pod | grep rs
replicaset.apps/rs-nginx 1 1 1 31h
pod/rs-nginx-nqvxp 1/1 Running 1 31h
Deployment(Deploy)
为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。值得一提的是,这种控制器并不直接管理pod,而是通过管理ReplicaSet来简介管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加强大。
Deployment主要功能有下面几个:
- 支持ReplicaSet的所有功能
- 支持发布的停止、继续
- 支持滚动升级和回滚版本
Deployment的资源清单文件:
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: #标签
controller: deploy
spec: # 详情描述
replicas: 3 # 副本数量
revisionHistoryLimit: 3 # 保留历史版本
paused: false # 暂停部署,默认是false
progressDeadlineSeconds: 600 # 部署超时时间(s),默认是600
strategy: # 策略
type: RollingUpdate # 滚动更新策略
rollingUpdate: # 滚动更新
maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数
maxUnavailable: 30% # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: nginx-pod
matchExpressions: # Expressions匹配规则
- {key: app, operator: In, values: [nginx-pod]}
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
eg:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: deploy-nginx
template:
metadata:
labels:
app: deploy-nginx
spec:
containers:
- name: app-nginx-deploy
image: nginx:1.20.0
ports:
- containerPort: 80
[root@master ~]# kubectl get deploy,rs,pod | grep deploy
deployment.apps/nginx-deployment 3/3 3 3 31h
replicaset.apps/nginx-deployment-8647cf8445 3 3 3 31h
pod/nginx-deployment-8647cf8445-bvqrx 1/1 Running 1 31h
pod/nginx-deployment-8647cf8445-q6gg2 1/1 Running 1 31h
pod/nginx-deployment-8647cf8445-zlm64 1/1 Running 1 31h
DaemonSet(DS)
DaemonSet类型的控制器可以保证在集群中的每一台(或指定)节点上都运行一个副本。一般适用于日志收集、节点监控等场景。也就是说,如果一个Pod提供的功能是节点级别的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet类型的控制器创建。
DaemonSet控制器的特点:
- 每当向集群中添加一个节点时,指定的 Pod 副本也将添加到该节点上
- 当节点从集群中移除时,Pod 也就被垃圾回收了
DaemonSet的资源清单文件:
apiVersion: apps/v1 # 版本号
kind: DaemonSet # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: #标签
controller: daemonset
spec: # 详情描述
revisionHistoryLimit: 3 # 保留历史版本
updateStrategy: # 更新策略
type: RollingUpdate # 滚动更新策略
rollingUpdate: # 滚动更新
maxUnavailable: 1 # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: nginx-pod
matchExpressions: # Expressions匹配规则
- {key: app, operator: In, values: [nginx-pod]}
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
eg:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-deamonset
labels:
app: daemonset
spec:
selector:
matchLabels:
name: nginx-deamonset
template:
metadata:
labels:
name: nginx-deamonset
spec:
containers:
- name: app-nginx-deamonset
image: nginx:1.20.0
ports:
- containerPort: 80
[root@master ~]# kubectl get ds,pod -o wide | grep deamonset
daemonset.apps/nginx-deamonset 2 2 2 2 2 <none> 14h app-nginx-deamonset nginx:1.20.0 name=nginx-deamonset
pod/nginx-deamonset-fw7lr 1/1 Running 0 14h 10.244.1.19 node1 <none> <none>
pod/nginx-deamonset-zd57l 1/1 Running 0 14h 10.244.2.31 node2 <none> <none>
Job
Job,主要用于负责**批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)**任务。Job特点如下:
- 当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量
- 当成功结束的pod达到指定的数量时,Job将完成执行
Job的资源清单文件:
apiVersion: batch/v1 # 版本号
kind: Job # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: #标签
controller: job
spec: # 详情描述
completions: 1 # 指定job需要成功运行Pods的次数。默认值: 1
parallelism: 1 # 指定job在任一时刻应该并发运行Pods的数量。默认值: 1
activeDeadlineSeconds: 30 # 指定job可运行的时间期限,超过时间还未结束,系统将会尝试进行终止。
backoffLimit: 6 # 指定job失败后进行重试的次数。默认是6
manualSelector: true # 是否可以使用selector选择器选择pod,默认是false
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: counter-pod
matchExpressions: # Expressions匹配规则
- {key: app, operator: In, values: [counter-pod]}
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never # 重启策略只能设置为Never或者OnFailure
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 2;done"]
关于重启策略设置的说明:
如果指定为OnFailure,则job会在pod出现故障时重启容器,而不是创建pod,failed次数不变
如果指定为Never,则job会在pod出现故障时创建新的pod,并且故障pod不会消失,也不会重启,failed次数加1
如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行了,当然不对,所以不能设置为Always
eg:
apiVersion: batch/v1
kind: Job
metadata:
name: busybox-job
spec:
template:
metadata:
name: busybox-job
spec:
containers:
- name: app-busybox-job
image: busybox:1.34.0
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 2;done"]
restartPolicy: Never
[root@master k8sstudy]# kubectl create -f job.yaml
job.batch/busybox-job created
[root@master k8sstudy]# kubectl get job,pod -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
job.batch/busybox-job 0/1 18s 18s app-busybox-job busybox:1.34.0 controller-uid=2f0f8cb7-6686-4196-9d3d-c948dc05eec7
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/busybox-job-q7nkk 1/1 Running 0 18s 10.244.1.21 node1 <none> <none>
[root@master k8sstudy]# kubectl logs -f pod/busybox-job-q7nkk
9
8
7
6
5
4
3
2
1
[root@master k8sstudy]# kubectl get job,pod -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
job.batch/busybox-job 1/1 19s 83s app-busybox-job busybox:1.34.0 controller-uid=2f0f8cb7-6686-4196-9d3d-c948dc05eec7
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/busybox-job-q7nkk 0/1 Completed 0 83s 10.244.1.21 node1 <none> <none>
CronJob(CJ)
CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。也就是说,CronJob可以在特定的时间点(反复的)去运行job任务。
CronJob的资源清单文件:
apiVersion: batch/v1beta1 # 版本号
kind: CronJob # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: #标签
controller: cronjob
spec: # 详情描述
schedule: # cron格式的作业调度运行时间点,用于控制任务在什么时间执行
concurrencyPolicy: # 并发执行策略,用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业
failedJobHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为1
successfulJobHistoryLimit: # 为成功的任务执行保留的历史记录数,默认为3
startingDeadlineSeconds: # 启动作业错误的超时时长
jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象;下面其实就是job的定义
metadata:
spec:
completions: 1
parallelism: 1
activeDeadlineSeconds: 30
backoffLimit: 6
manualSelector: true
selector:
matchLabels:
app: counter-pod
matchExpressions: 规则
- {key: app, operator: In, values: [counter-pod]}
template:
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 20;done"]
需要重点解释的几个选项:
schedule: cron表达式,用于指定任务的执行时间
*/1 * * * *
<分钟> <小时> <日> <月份> <星期>
分钟 值从 0 到 59.
小时 值从 0 到 23.
日 值从 1 到 31.
月 值从 1 到 12.
星期 值从 0 到 6, 0 代表星期日
多个时间可以用逗号隔开; 范围可以用连字符给出;*可以作为通配符; /表示每...
concurrencyPolicy:
Allow: 允许Jobs并发运行(默认)
Forbid: 禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行
Replace: 替换,取消当前正在运行的作业并用新作业替换它
eg:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: busybox-cronjob
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: app-busybox-cronjob
image: busybox:1.34.0
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]
restartPolicy: OnFailure
[root@master ~]# kubectl get cronjobs,jobs,pods
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob.batch/busybox-cronjob */1 * * * * False 0 54s 3m9s
NAME COMPLETIONS DURATION AGE
job.batch/busybox-cronjob-1667875260 1/1 29s 2m48s
job.batch/busybox-cronjob-1667875320 1/1 29s 108s
job.batch/busybox-cronjob-1667875380 1/1 29s 48s
NAME READY STATUS RESTARTS AGE
pod/busybox-cronjob-1667875260-dsqs2 0/1 Completed 0 2m48s
pod/busybox-cronjob-1667875320-xrll4 0/1 Completed 0 108s
pod/busybox-cronjob-1667875380-jmx8r 0/1 Completed 0 48s