6and7.Pod控制器应用进阶

Pod控制器应用进阶:
imagepullpolicy: 镜像获取策略
Always,Never,IfNoPresent

暴露端口: ports
labels 标签可以后期添加修改。


============================================
资源标签:
key=value

注意键值
key 只能是字母数字下划线 _ - .等,且只能是字母或者数字开头及结尾,中间可以有下划线等,长度不能超过64个字符
value 可以为空,只能是字母数字下划线 _ - .等,且只能是字母或者数字开头及结尾,中间可以有下划线等,长度不能超过64个字符


查看标签:
[root@k8s-master manifests]# kubectl get pods --show-labels

-L 显示指定标签的值
-l 标签过滤

[root@k8s-master manifests]# kubectl get pods -l app,release


[root@k8s-master manifests]# kubectl get pods -l app --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 1/2 CrashLoopBackOff 29 128m app=myapp,tier=frontend

添加标签: release
[root@k8s-master manifests]# kubectl label pods pod-demo release=canary
pod/pod-demo labeled

[root@k8s-master manifests]# kubectl get pods pod-demo --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 1/2 CrashLoopBackOff 29 130m app=myapp,release=canary,tier=frontend

标签修改:
[root@k8s-master manifests]# kubectl label pods pod-demo release=stable --overwrite
pod/pod-demo labeled
[root@k8s-master manifests]# kubectl get pods pod-demo --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 1/2 CrashLoopBackOff 30 133m app=myapp,release=stable,tier=frontend

 

标签选择器:
等值关系: =,==,!=
集合关系:
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>
节点标签选择器

nodeName <string>
指定在某个节点运行

annotations: 资源注解
与label不同的地方在于,他不能用于挑选资源对象,仅仅用于为对象提供“元数据”

KEY in 查询:
[root@k8s-master manifests]# kubectl get pods -l "release in (stable,beta)"
NAME READY STATUS RESTARTS AGE
pod-demo 1/2 CrashLoopBackOff 31 141m

 

[root@k8s-master manifests]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
annotations:
magedu.com/created-by: "cluster admin"
spec:
containers:
- name: myapp-nginx
image: nginx:1.14-alpine
ports:
- name: http
containerPort: 80 #这里填写并不完全决定真正的暴露
- name: https
containerPort: 443

==============================

pod生命周期:


init container (初始化容器,可以有多个,并行进行) --》main container及辅助容器启动 --> man container stop


主容器结束,pod也就结束
主容器在启动之前是可以有一些操作(post start) 钩子
主容器在结束之后是可以有一些操作(pre stop)
在主容器运行期间可以进行,liveness probe(存活状态)检测,以及readiness probe(就绪状态检测)
容器存活不一定能对外提供服务

常见的pod状态:
Pending 挂起,调度正在进行
Running 运行
Failed
Successded
Unknown

pod生命周期中的重要行为:
初始化容器
容器探测
liveness 主要用于探测容器的存活状态
readiness 探测程序是否正常,是否能够正常提供服务



创建pod:
apiserver --> etcd
--> scheduler

pod创建过程:
apiserver接收到用户提交的请求,然后apiserver将目标状态保存到etcd中,然后apiserver开始请求scheduler开始调度,如果调度成功则将调度的结果保存在etcd中间
目标节点kubelet当发现etcd中保存的目标信息发生改变后会获取到客户提交的资源清单,然后目标node会根据资源清单创建pod,然后将创建的转态发送给apiserver,apiserver再将该转态存储在etcd当中


================================================
restartPolicy: 容器的重启策略
Always,OnFailure,Never,Default to Always
Always, 一直重启,第一次是马上重启,之后会延时重启,最后是隔300s重启
OnFailure 遇到意外突然挂掉会重启
Never, 不重启

删除pod,会平滑重启

 

=================================================
容器状态检测
liveness 探针类型:
execaction,TCPSocketaction, httpaction

1.execaction,通过命令去检测

cat liveness.yaml

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 -rf /tmp/healthy; sleep 3600"]
livenessProbe:
exec:
command: ["test","-e","/tmp/healthy"] #判断该文件是否存在,如果存在则证明容器存活,如果不存在,则说明有问题
initialDelaySeconds: 1 #初始化后延时1秒开始检测
periodSeconds: 3 #每隔3秒检测一次


当检测有问题时候,pod就会开始重启

2. TCPSocketaction, httpaction 如果是web服务,则可以使用tcp,http探针检测

[root@k8s-master manifests]# cat liveness.http.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-http-pod
namespace: default
spec:
containers:
- name: liveness-http-container
image: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80

livenessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3


使用http检测

 

readiness 就绪状态检测(这个的检测很重要,可能容器是正常运行,但是已经不能够正常提供服务了,如果没有这个检测,那么service还是会将请求发送到该pod上,这样会造成大量的请求失败)
这个的检测方式和liveness的格式一样。 kubectl get pods这个命令执行结果中READY列即显示为readiness的检测状态。

[root@k8s-master manifests]# cat readiness.http.yaml
apiVersion: v1
kind: Pod
metadata:
name: readiness-http-pod
namespace: default
spec:
containers:
- name: readiness-http-container
image: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80

readinessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3

 

==================================================================

 

 

 

 

 











 

上一篇:error: .repo/manifests/: contains uncommitted changes


下一篇:Android 版本号和分支查看