pod控制器
1,资源的清单格式:
一级字段:apiVersion(group/version), kind, metadata(name,namespace,labels,annotations, ...), spec,status(只读)
查看字段说明:kubectl explain pods
查看二级字段说明(例):kubectl explain pods.metadata
查看三级字段说明(例):kubectl explain pods.spec.containers
•nodeSelector <map[string]string>:节点标签选择器
•nodeName <string>
•annotations:与label不同的地方在于,它不能用于挑选资源对象,仅用于为对象提供“元数据”
◆Pod生命周期中的重要行为:
•初始化容器
•容器探测:
•liveness:存活性探测
•readiness:就绪性探测
•lifecycle:生命周期;定义启动后(poststart)和终止前(prestop)的钩子行为。
•查看帮助:
kubectl explain pods.spec.containers.livenessProbe
kubectl explain pods.spec.containers.livenessProbe.exec
kubectl explain pods.spec.containers.livenessProbe.httpGet
•Pod的生命周期:
状态:Pending, Running, Failed, Succeeded, Unknown
•restartPolicy: Always, OnFailure, Never. Default to Always.
•探针类型有三种:ExecAction、TCPSocketAction、HTTPGetAction
【yaml创建pod示例】
官方文档:https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/
2,利用yaml文件创建pod
命令:kubectl create -f pod-demo.yaml
删除文件定义的资源:kubectl delete -f pod-demo.yaml
查看pod信息:kubectl describe pods pod-demo
查询出错容器的log:kubectl logs pod-demo busybox #pod-demo中的busybox容器
删除pod:kubectl delete pods pod-demo
进入pod中的某个容器:kubectl exec -it pod-demo -c myapp -- /bin/sh
apiVersion: v1
kind: Pod #自主式pod,删除pod不会重建。
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
annotations: #添加资源注解
aaabbb.com/created-by: "testuser01"
spec:
container:
- name: myapp
image: qiaomu2020/myapp:v1
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent #latest标签的镜像默认策略为always,修改后,节省带宽。
#command: ["/bin/sh","-c","sleep 3600"] #这样的写法也是可以的。
command:
- "bin/sh
- "-c"
- "sleep 1800"
nodeSelector: #给pod添加节点选择器。
disktype: hhd
◆镜像和容器中的命令生效规则如下图:

3,标签相关操作
◆标签:
key=value
key: 字母、数字、_、-、.
value:可以为空,只能字母或数字开头及结尾,中间可使用_、-、.
◆标签选择器:
•等值关系:=,==,!=
•集合关系:
KEY in (VALUE1,VALUE2,...)
KEY notin (VALUE1,VALUE2,...)
KEY
!KEY
•过滤出包含app标签的pod: kubectl get pods -l app --show-labels
•过滤出包含app标签和release标签的pod: kubectl get pods -l release,app
•过滤出包含app=myapp和release=stable的pod: kubectl get pods -l release=stable,app=myapp
•查询结果中显示app标签和Run标签这两列:kubelctl get pods -L app,run
•添加标签/打新标签:kubectl label pods pod-demo release=canary #添加标签/打新标签 release=canary
•修改标签值:kubectl label pods pod-demo release=stable --overwrite #标签值改为stable。
•过滤出release in (canary,beta,alpha)的pod: kubectl get pods -l “release in (canary,beta,alpha)”
◆许多资源支持内嵌字段定义其使用的标签选择器:
matchLabels:直接给定键值
matchExpressions:基于给定的表达式来定义使用标签选择器,{key:"KEY", operator:"OPERATOR",values:[VAL1,VAL2,...]}
•操作符:
In, NotIn:values字段的值必须为非空列表;
Exists, NotExists:values字段的值必须为空列表;
•节点标签选择器,用于指定pod运行于那一类节点上:nodeSelector <map[string]string>
指定node名,用于指定pod运行于那个节点上:nodeName <string>
annotations:资源注解;与label不同的地方在于,它不能用于挑选资源对象,仅用于为对象提供“元数据”。
例:
显示节点的标签列:kubectl get nodes --show-labels
给节点打标签:kubectl label nodes k8snode01 disktype=hhd
查看annotations:kubectl pods describe pod-demo
4,探针
◆liveness 探针的exec使用例
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 #探测周期
●验证
创建pod:kubectl create -f liveness-exec.yaml
•查看pod:
kubectl get pods -w
kubectl describe pods liveness-exec-pod
◆liveness 探针的httpget使用例
apiVersion: v1
kind: Pod #自主式pod,删除pod不会重建。
metadata:
name: liveness-httpget-pod
namespace: default
spec:
containers:
- name: liveness-httpget-container
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: http_port
containerPort: 80
livenessProbe:
httpGet:
port: http_port
path: /index.html
initialDelaySeconds: 1 #延迟几秒,开始探测
periodSeconds: 3 #探测周期
●验证
创建pod:kubectl create -f liveness-httpget.yaml
•查看pod:
kubectl get pods -w
kubectl describe pods liveness-httpget-pod
kubectl exec –it liveness-httpget-pod -- /bin/sh
制造问题:接入容器,手动删除index.html.
删除pod: kubectl delete -f liveness-httpget.yaml
◆readiness 探针的httpget使用例
apiVersion: v1
kind: Pod #自主式pod,删除pod不会重建。
metadata:
name: readiness-httpget-pod
namespace: default
spec:
containers:
- name: readiness-httpget-container
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: http_port
containerPort: 80
readinessProbe:
httpGet:
port: http_port
path: /index.html
initialDelaySeconds: 1 #延迟几秒,开始探测
periodSeconds: 3 #探测周期
◆lifecycle的poststart使用例
apiVersion: v1
kind: Pod #自主式pod,删除pod不会重建。
metadata:
name: poststart-pod
namespace: default
spec:
containers:
- name: busybox-httpd
image: busybox:latest
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: ["/bin/sh","-c","mkdir -p /data/web/html; echo 'Home Page' >> /data/web/html/index.html"]
#command: ["/bin/httpd"] #注释掉2行,此处要是强依赖poststart的命令,pod会出错的。
#args: ["-f","-h /data/web/html"]
5,Pod控制器:
kind: Pod:为自主式pod,删除pod后不会重建。
ReplicationController:
ReplicaSet:为新一代的ReplicationController,kubenetes不推荐使用。
Deployment:建立在ReplicaSet之上,比其功能更强大。支持滚动更新,回滚等。管理无状态应用最好的控制器,推荐使用。
DaemonSet:部署系统级应用,以守护进程持续运行在集群的一个节点上,且一个节点仅部署一个。
Job:
Cronjob:周期性任务。
StatefulSet:
5.1,ReplicaSet控制器
•查看帮助:
kubectl explain rs
kubectl explain rs.spec.selector
◆ReplicaSet控制器示例(rsdemo.yaml):
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp
namespace: default
spec: #控制器的规格。
replicas: 2
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
name: myapp-pod
labels:
app: myapp #模板中定义的标签务必包含符合pod选择器中的标签,否则定义无意义。
release: canary
environment: qa
spec: #pod的规格
containers:
- name: myapp-container
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
查询:kubectl get rs
•动态修改ReplicaSet控制器:kubectl edit rs rsdemo #直接修改控制器,若Pod未重建,更改并未生效。
5.2,Deployment控制器
kubectl explain deploy.spec.template
kubectl rollout –help
◆Deployment控制器示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: qiaomu2020/myapp:v2
ports:
- name: http
containerPort: 80
●确认
kubectl apply –f deploy-demo.yaml #apply可以执行多次,create只能执行一次。
kubectl get deploy
kubectl get rs -o wide
•查看详细信息:kubectl describe deploy myapp-deploy
•过滤监视app=myapp:kubectl get pods –l app=myapp -w
•更新镜像:kubectl set image deployment myapp-deploy myapp=qiaomu2020/myapp:v3
•查看滚动历史:kubectl rollout history deployment myapp-deploy
•更新deployment的配置:
kubectl patch deployment myapp-deploy –p ‘{“spec”:{“replicas”:5}}’
kubectl patch deployment myapp-deploy –p ‘{“spec”:{“strategy”:{“rollingUpdate”:{masSurge”:1,”maxUnavailable”:0}}}}’
•回滚到某个历史版本:
kubectl rollout undo deployment myapp-deploy –to-revision=1
5.3,DaemonSet控制器
支持滚动更新。
滚动更新策略:kubectl explain ds.spec.upldateStrategy
◆DaemonSet控制器示例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filetest-ds
namespace: default
spec:
selector:
matchLabels:
app: filetest
release: stable
template:
metadata:
labels:
app: filetest
release: stable
spec:
containers:
- name: filetest
image: qiaomu2020/filetest:2.3-alpine
env:
- name: REDIS_HOST
value: redis.default.svc.cluster.local
- name: REDIS_LOG_LEVEL
value: info
●确认
kubectl apply –f ds-demo.yaml
kubectl expose deployment redis --port=6379
更新镜像:kubectl set image daemonsets filetest-ds filetest=qiaomu2020/filetest:2.3-alpine

浙公网安备 33010602011771号