5. kubernetes pod控制器应用
[TOC]
本文基于马哥的docker和k8s视频总结, 在此致谢马哥.
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels: # 直接在metadata中打标签
app: myapp
tier: frontend # 分层标签
annotations: # 自定义的资源注解
alexti/created-by: "cluster admin"
spec:
containers:
- name: myapp # 创建的第一个容器的容器名
image: nginx:1.14-alpine # 容器所使用的镜像
ports: # 暴露端口
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: busybox # 创建的第二个容器的容器名
image: busybox:latest
imagePullPolicy: IfNotPresent
command: # 修改容器启动时使用的默认命令
- "/bin/sh"
- "-c"
- "sleep 3600"
nodeSelector: # 选择安装在标签为diskytpe且值为ssd的node上, 需要先给节点打上标签
disktype: ssd # 必须要装在有此标签的node上, 找不到此标签, pod会被pending
配置Pod资源中的spec
内嵌字段
spec.containers <[]object>
- name
image # 指定特定路径中的镜像
imagePullPolicy
# Always, Never, IfNotPresent, 此字段在对象创建后不可更改
# Always: 就算本地有镜像, 也不用而是直接去下载, latest标签的镜像默认使用Always
# Never: 本地有就用, 没有则不下载, 想用必须用户手动下载
# IfNotPresent: 本地存在就用, 没有就去下载
ports <[]object>
# name
# containerPort -required-
args <[]object>
# 如果自行手动指定了args参数, 则会覆盖镜像中CMD指定的内容
# 特别注意变量引用使用的格式: $(VAR_NAME)
# 如果一定要使用命令引用的方式: $$(VAR_NAME)
command <[]object>
# Entrypoint array. Not executed within a shell
# 一旦定义了command, 镜像中的Cmd和Entrypoint都会失效
# 如果只定义了args, 没定义command,
# 则会将args定义的值作为参数传递给镜像中的Entrypoint
livenessProbe
spec.nodeSelector
metadata.annotations
# 与label不同的是, 它不能用于挑选资源对象, 仅用于为对象提供"元数据"
- args和command区别示例:
标签
标签与对象是多对多的关系(一个标签可以贴多个对象, 一个对象也可以被贴多个标签)
- key=value
- key和value字符长度都要小于等于63
- key不可为空, value可为空
# 显示标签为app的那类pod
kubectl get pods -l app [--show-labels]
kubectl get pods -l app=myapp,tire!=frontend
kubectl get pods -l "release notin (canary,beta,alpha)"
# 显示标签以及标签值
kubectl get pods -L app,run
# 打标签, 已有标签时会报错, 除非使用--overwrite
kubectl label pods pod-demo release=canary
kubectl get pods -l app [--show-labels]
标签选择器
- 等值关系:
=, ==, !=
- 集合关系:
KEY in|notin (VALUE1, VALUE2, ...)
-
!KEY
: 不存在此键的资源
许多资源支持内嵌字段定义其使用的标签选择器:
matchLabels: # 直接给定键值
matchExpressions: # 基于给定的表达式来定义使用的标签选择器,
# {key:"KEY", operator:"OPERATOR", values:[VAL1,VAL2,...]}
# 操作符: In, NotIn values字段的值必须为非空列表
# Exists, NotExists values字段的值必须为空列表
Pod的生命周期
- 状态: Pending (挂起), Running(运行), Failed, Succeeded, Unknown
- Pod生命周期中的重要行为:
- 初始化容器
- 容器探测:
- 存活性探测 liveness
- 就绪性探测 readiness
探针类型
- (1) ExecAction
- (2) TCPSocketAction
- (3) HTTPGetAction
liveness
和readiness
对于容器来讲一般要做存活性探测和就绪性探测 !
exec
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:
containers:
- name: liveness-exec-container
image: busybox:latest
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
restartPolicy: OnFailure
httpGet
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
namespace: default
spec:
containers:
- name: readiness-httpget-container
image: nginx:1.14-alpine
ports:
name: http
containerPort: 80
livenessProbe:
httpGet:
port: http # 可以直接根据ports的name进行指定, 也可以直接设置为80
path: /index.html # 指定请求内容
initialDelaySeconds: 1
periodSeconds: 3
readinessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
restartPolicy: OnFailure
postStart
和preStop
- 特别要注意
postStart
内command
和containers
内command
执行的先后顺序 !!!-
containers
内的command
先执行,postStart
内command
后执行!
-
apiVersion: v1
kind: 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/"
command:
- "/bin/sh"
- "-c"
args:
- "sleep 3600"
# 如果去掉上面代码块中的第15,16两行, 创建pod然后连入pod中的容器查看进程,
# 会发现PID为1的进程会有一开始设置的/bin/sh替换为sleep 3600, 所以后面
# exec中的command指定的命令会有报错.
kubectl create -f /tmp/poststart-pod.yml
kubectl exec poststart-pod -c busybox-httpd -it -- /bin/sh
/ # ps -ef
PID USER TIME COMMAND
1 root 0:00 sleep 3600
11 root 0:00 /bin/sh
17 root 0:00 ps -ef