pod资源
Pod资源:
spec.containers <[]object>
- name <string>
image <string>
port
# 仅仅是信息, 提示容器的暴露端口
ports:
- name: http
protocol: TCP
containerPort: 80
- name: https
protocol: TCP
containerPort: 443
imagePullPolicy
imagePullPolicy <string>
Always(总是下载,从仓库下载,不管本地是否存在)
Never(从不下载,如果有就用,没有也不去下载)
IfNotPresent(存在就使用,不存在就去下载)
如果镜像标签是latest,那么默认就是Always
如果不是latest,那么默认值是IfNotPresent
command & args
https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/
Entrypoint:
Image中运行程序的命令
Cmd:
Image中运行程序的命令中的参数
command:
Pod中运行程序的命令
args:
Pod中运行程序的命令中的参数
描述 |
Docker file |
kubernetes |
command |
Entrypoint |
command |
arguments |
Cmd |
args |
- 如果既不提供command也不提供args,那么就是使用镜像中的Entrypoint和Cmd
- 如果只定义了command,没定义args,那么只运行command
- 如果只定义了args,没定义command,那么使用镜像中的Entrypoint当做命令,使用args作为参数,cmd无效
- 如果定义了command和args,那么忽略镜像中的Entrypoint和Cmd
Images Entrypoint |
Image Cmd |
Container command |
Container args |
Command run |
[/ep-1] |
[for bar] |
<not set> |
<not set> |
[ep-1 foo bar] |
[/ep-1] |
[for bar] |
[/ep-2] |
<not set> |
[ep-2] |
[/ep-1] |
[for bar] |
<not set> |
[zoo boo] |
[ep-1 zoo boo] |
[/ep-1] |
[for bar] |
[/ep-2] |
[zoo boo] |
[ep-2 zoo boo] |
labels
每个Pod可以有多个标签
每个标签也可以附加到多个Pod
标签:
key=value
key: 字母、数字、_、-、.
value:可以为空,只能字母或数字开头及结尾,中间可使用
标签选择器:
等值关系:=,==,!=
集合关系:
KEY in (VALUE1,VALUE2,...)
KEY notin (VALUE1,VALUE2,...)
KEY
!KEY
许多资源支持内嵌字段定义其使用的标签选择器:
matchLabels:直接给定键值
matchExpressions:基于给定的表达式来定义使用标签选择器,{key:"KEY", operator:"OPERATOR",values:[VAL1,VAL2,...]}
操作符:
In, NotIn:values字段的值必须为非空列表;
Exists, NotExists:values字段的值必须为空列表
nodeSelector <map[string]string> (容器的属性)
节点标签选择器,
spec:
container:
name: ...
image: ...
....
nodeSelector:
disktype: ssd
nodeName <string>
annotations:
与label不同的地方在于,它不能用于挑选资源对象,仅用于为对象提供“元数据”。
labels常用命令
# 查看所有标签
[root@kubeadm-mater01 test]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
curl-66959f6557-2tm4b 1/1 Running 2 7d2h pod-template-hash=66959f6557,run=curl
pod-demo 2/2 Running 1 79m app=myapp,tier=frontend
# 查看只有app标签的pod(标签过滤)
[root@kubeadm-mater01 test]# kubectl get pods -l app
NAME READY STATUS RESTARTS AGE
pod-demo 2/2 Running 1 82m
[root@kubeadm-mater01 test]# kubectl get pods -l app --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 1 82m app=myapp,tier=frontend
# 显示多个标签的标签值
[root@kubeadm-mater01 test]# kubectl get pods -L app,run
NAME READY STATUS RESTARTS AGE APP RUN
curl-66959f6557-2tm4b 1/1 Running 2 7d2h curl
pod-demo 2/2 Running 1 83m myapp
# 给资源对象打标签
[root@kubeadm-mater01 test]# kubectl label pods pod-demo release=canary
pod/pod-demo labeled
[root@kubeadm-mater01 test]# kubectl get pods pod-demo --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 1 86m app=myapp,release=canary,tier=frontend
# 修改标签
[root@kubeadm-mater01 test]# kubectl label pods pod-demo release=stable --overwrite
pod/pod-demo labeled
[root@kubeadm-mater01 test]# kubectl get pods -l app --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 43s app=myapp,release=stable,tier=frontend
#集合选择
## KEY in ()
[root@kubeadm-mater01 test]# kubectl get pods -l 'release in (canary,stable)'
NAME READY STATUS RESTARTS AGE
pod-demo 2/2 Running 0 20m
## KEY notin ()
[root@kubeadm-mater01 test]# kubectl get pods -l 'release notin (canary,stable)'
NAME READY STATUS RESTARTS AGE
curl-66959f6557-2tm4b 1/1 Running 2 7d3h
# 查看node节点标签
[root@kubeadm-mater01 test]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
kubeadm-mater01 Ready master 7d3h v1.13.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=kubeadm-mater01,node-role.kubernetes.io/master=
kubeadm-node01 Ready <none> 7d2h v1.13.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=kubeadm-node01
# 给node节点打标签
[root@kubeadm-mater01 test]# kubectl label nodes kubeadm-node01 disktype=ssd
node/kubeadm-node01 labeled
[root@kubeadm-mater01 test]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
kubeadm-mater01 Ready master 7d3h v1.13.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=kubeadm-mater01,node-role.kubernetes.io/master=
kubeadm-node01 Ready <none> 7d2h v1.13.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=kubeadm-node01
Pod生命周期
- 状态
- Pending: 挂起,调度未完成: 已经创建, 但是没有适合运行的节点
- Running: 运行状态
- Failed: 失败
- Succeeded: 成功
- Unknown: 未知状态
- 创建过程
- 初始化容器
- 容器探测
- livenessProbe: 用于判断容器是否存活,即Pod是否为running状态,如果LivenessProbe探针探测到容器不健康,则kubelet将kill掉容器,并根据容器的重启策略是否重启,如果一个容器不包含LivenessProbe探针,则Kubelet认为容器的LivenessProbe探针的返回值永远成功。
- readinessProbe: 用于判断容器是否启动完成,即容器的Ready是否为True,可以接收请求,如果ReadinessProbe探测失败,则容器的Ready将为False,控制器将此Pod的Endpoint从对应的service的Endpoint列表中移除,从此不再将任何请求调度此Pod上,直到下次探测成功
- 支持的探测方法
- exec:通过执行命令来检查服务是否正常,针对复杂检测或无HTTP接口的服务,命令返回值为0则表示容器健康。
- httpGet:通过发送http请求检查服务是否正常,返回200-399状态码则表明容器健康。
- tcpSocket:通过容器的IP和Port执行TCP检查,如果能够建立TCP连接,则表明容器健康。
- failureThreshold: 失败x次后才认为失败, 默认是三次
- initialDelaySeconds: 重启初始化时间, 默认是30秒, 30秒后开始探测
- periodSeconds: 多久探测一次,
- successThreshold: 成功几次认为程序就已经成功了
- 探测的结果
- Success:Container通过了检查。
- Failure:Container未通过检查。
- Unknown:未能执行检查,因此不采取任何措施。
- restartPolicy: 重启策略
- Always: 总是重启(默认)
- OnFailure: 只有状态为错误是才重启
- Never: 从不重启
livenessProbe实例
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:
containers:
- name: liveness-exec-container
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 3600"]
livenessProbe:
exec:
command: ["test","-e","/tmp/healthy"]
initialDelaySeconds: 1
periodSeconds: 3
readinessProbe实例
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
namespace: default
spec:
containers:
- name: readiness-httpget-container
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
readinessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
网友评论