k8s Pod管理
1.2.1.2 Linux常用的capabilities内核单元1.2.1.3 pod级别的sysctls内核参数1.2.2 举例1.2.2.1 设置普通用户和组1.2.2.2 设置capabilities内核功能1.2.2.3 设置sysctls内核安全参数二、Pod探针和hook2.1 pod过程......
Pod参数解释
apiVersion: v1
kind: Pod
metadata: {...}
spec:
#在 Kubernetes 中,Pod 停止时 kubelet 会先给容器中的主进程发 SIGTERM 信号来通知进程进行 shutdown 以实现优雅停止,如果超时进程还未完全停止则会使用 SIGKILL 来强行终止,terminationGracePeriodSeconds就是强行终止的时间,发送SIGTERM 信号 30s(默认是30s)之后容器还未终止,就会强行终止。
#特别说明: preStop Hook并不会影响SIGTERM的处理,因此有可能preStopHook还没有执行完就收到SIGKILL导致容器强制退出。因此如果preStop Hook设置了n秒,需要设置terminationGracePeriodSeconds为terminationGracePeriodSeconds+n秒。
terminationGracePeriodSeconds: 30s
##pod级别 安全上下文
securityContext: # Pod级别的安全上下文,对内部所有容器均有效
runAsUser <integer> # 以指定的用户身份运行容器进程,默认由镜像中的USER指定
runAsGroup <integer> # 以指定的用户组运行容器进程,默认使用的组随容器运行时
supplementalGroups <[]integer> #为容器中1号进程的用户添加的附加组;
fsGroup <integer> #为容器中的1号进程附加的一个专用组,其功能类似于sgid
runAsNonRoot <boolean>#是否以非root身份运行 seLinuxOptions <0bject> #SELinux的相关配置
sysctls <[]0bject> # 应用到当前Pod上的名称空间级别的sysctl参数设置列表
windows0ptions <0bject> #Windows容器专用的设置
containers:
name:…
image: …
##容器级别 安全上下文
securityContext: # 容器级别的安全上下文,仅生效于当前容器
runAsUser <integer> # 以指定的用户身份运行容器进程
runAsGroup <integer> # 以指定的用户组运行容器进程
runAsNonRoot <boolean> #是否以非root身份运行
allowPrivilegeEscalation <boolean> # 是否允许特权升级
capabilities <0biect> # 于当前容器上添加(add)或删除(drop)的内核能力
add <[]string> # 添加由列表定义的各内核能力
drop <[]string> #移除由列表定义的各内核能力 privileged <boolean> # 是否运行为特权容器
procMount <string> #设置容器的procMount类型,默认为DefaultProcMount;
readonlyRootFilesystem <boolean> # 是否将根文件系统设置为只读模式
seLinuxOptions <0bject> # SELinux的相关配置
windowsOptions <0bject> #windows容器专用的设置
##探针选项解释
livenessProbe:
exec <Object> #命令式探针
httpGet <Object> #http GET类型的探针
tcpSocket <Object> #tcp Socket类型的探针
initialDelaySeconds <integer> #容器启动时发起首次探测请求的延后时长
periodSeconds <integer> #请求周期
timeoutSeconds <integer> #超时时长
successThreshold <integer> #成功阈值意思是:成功几次才算是真正的成功,次数
failureThreshold <integer> #失败阈值意思是:失败几次才算是真正的失败,次数
##资源限制
resources:
requests:
cpu: ...
memory: ...
limits:
cpu: ...
memroy: ...
一、Pod安全上下文
1.1 解释
安全上下文是用于决定容器是如何创建和运行的约束条件,它们代表创建和运行容器时使用的运行参数。
1.2 pod上的安全级别
1.2.1 两个级别
Pod级别 可以使用命令kubectl explain pods.spec.securityContext 看到以下解释内容
容器级别 可以使用命令kubectl explain pods.spec.containers 看到以下解释内容
1.2.1.1 解释
apiVersion: v1
kind: Pod
metadata: {...}
spec:
##pod级别
securityContext: # Pod级别的安全上下文,对内部所有容器均有效
runAsUser <integer> # 以指定的用户身份运行容器进程,默认由镜像中的USER指定
runAsGroup <integer> # 以指定的用户组运行容器进程,默认使用的组随容器运行时
supplementalGroups <[]integer> #为容器中1号进程的用户添加的附加组;
fsGroup <integer> #为容器中的1号进程附加的一个专用组,其功能类似于sgid
runAsNonRoot <boolean>#是否以非root身份运行 seLinuxOptions <0bject> #SELinux的相关配置
sysctls <[]0bject> # 应用到当前Pod上的名称空间级别的sysctl参数设置列表
windows0ptions <0bject> #Windows容器专用的设置
##容器级别
containers:
name:…
image: …
securityContext: # 容器级别的安全上下文,仅生效于当前容器
runAsUser <integer> # 以指定的用户身份运行容器进程
runAsGroup <integer> # 以指定的用户组运行容器进程
runAsNonRoot <boolean> #是否以非root身份运行
allowPrivilegeEscalation <boolean> # 是否允许特权升级
capabilities <0biect> # 于当前容器上添加(add)或删除(drop)的内核能力
add <[]string> # 添加由列表定义的各内核能力
drop <[]string> #移除由列表定义的各内核能力 privileged <boolean> # 是否运行为特权容器
procMount <string> #设置容器的procMount类型,默认为DefaultProcMount;
readonlyRootFilesystem <boolean> # 是否将根文件系统设置为只读模式
seLinuxOptions <0bject> # SELinux的相关配置
windowsOptions <0bject> #windows容器专用的设置
1.2.1.2 Linux常用的capabilities内核单元
- CAP_CHOWN: 改变UID和GID的,容器中默认是开启的
- CAP_MKNOD: mknod(),创建设备文件
- CAP_NET_ADMIN: 网络管理权限
- CAP_SYS_ADMIN: 大部分内核管理权限都支持
- CAP_SYS_TIME: 系统时钟
- CAP_SYS_MODULE: 装载卸载内核模块
- CAP_NET_BIND_SERVER: 是否允许普通用户绑定1024以内的特权端口
1.2.1.3 pod级别的sysctls内核参数
目前pod内可安全设定的内核参数只有三个:kernel.shm.rmid_forced,net.ipv4.ip_local_port_range,net.ipv4.tcp_syncookies
如果想要pod可以设置更多的非安全内核参数需要创建/etc/default/kubelet文件(kubelet级别的设定,而且需要重启kubelet服务)
文件中添加以下配置:
KUBELET_EXTRA_ARGS=‘–allowed-unsafe-sysctls=net.core.somaxconn,net,ipv4.ip.unprivileged_port_start’
1.2.2 举例
1.2.2.1 设置普通用户和组
这里注意:普通用户无法使用1024以内的端口,所以这里定义了端口
apiVersion: v1
kind: Pod
metadata:
name: SecurityContext-demo
labels:
app: SecurityContext-demo
namespace: dev
spec:
containers:
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent #镜像拉取策略,IfNotPresent如果没有镜像就拉取
env:
- name: PORT
value: "8080"
securityContext:
#设置运行用户和组
runAsUser: 1001
runAsGroup: 1001
kubectl describe pods SecurityContext-demo 查看详细情况
kubect exec pod SecurityContext-demo – ps aux 查看用户ID是否发生变化
1.2.2.2 设置capabilities内核功能
apiVersion: v1
kind: Pod
metadata:
name: SecurityContext-capabilities-demo
labels:
app: SecurityContext-capabilities-demo
namespace: dev
spec:
containers:
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c"]
args: ["/sbin/iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80 && /usr/bin/python3 /usrlocal/bin/demo.py"]
securityContext:
capabilities:
add: ['NET_ADMIN']
drop: ['CHOWN'] #删除可修改UID和GID的内核参数,删除之后,就不能使用chown更改属主和属组了
kubectl describe pods SecurityContext-capabilities-demo 查看详细情况
kubect exec pod SecurityContext-capabilities-demo – iptables -L -n -t nat 查看容器内的规则
1.2.2.3 设置sysctls内核安全参数
apiVersion: v1
kind: Pod
metadata:
name: SecurityContext-sysctls-demo
labels:
app: SecurityContext-sysctls-demo
namespace: dev
spec:
securityContext:
sysctls:
- name: kernel.shm.rmid_forced
value: "0"
#以下这个参数只有在修改/etc/default/kubelet文件之后才能生效,意思是运行非特权用户使用端口从0开始,所以下边就无需设置端口
- name: net,ipv4.ip.unprivileged_port_start
value: "0"
containers:
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
securityContext:
runAsUser: 1001
runAsGroup: 1001
kubectl describe pods SecurityContext-sysctls-demo 查看详细情况
kubect exec pod SecurityContext-sysctls-demo – netstat -lnpt 查看80端口是否在监听(因为容器中指定了运行用户是普通用户,按理说普通用户无法使用1024以内的端口,但是pod级别中的sysctls参数中打开了这一选项,所以是可以看到80端口在监听的)
1.3 POD状态解释
Pending:Pod已经被创建,但还没有完成调度,可能处在:写数据到etcd,调度,pull镜像,启动容器这四个阶段中的任何一个阶段,pending伴随的事件通常会有:ADDED, Modified这两个事件的产生。
Running:该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
Succeeded:Pod中的所有的容器已经正常的执行后退出,并且不会自动重启,一般会是在部署job的时候会出现。
Failed:Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
Unkonwn:API Server无法正常获取到Pod对象的状态信息,通常是由于其无法与所在工作节点的kubelet通信所致。
pod从创建到成功或失败的事件
PodScheduled :pod正处于调度中,刚开始调度的时候,hostip还没绑定上,持续调度之后,有合适的节点就会绑定hostip,然后更新etcd数据
Initialized :pod中的所有初始化容器已经初启动完毕
Ready :pod中的容器可以提供服务了
Unschedulable:不能调度,没有合适的节点
CrashLoopBackOff: 容器退出,kubelet正在将它重启
InvalidImageName: 无法解析镜像名称
ImageInspectError: 无法校验镜像
ErrImageNeverPull: 策略禁止拉取镜像
ImagePullBackOff: 正在重试拉取
RegistryUnavailable: 连接不到镜像中心
ErrImagePull:通用的拉取镜像出错
CreateContainerConfigError: 不能创建kubelet使用的容器配置
CreateContainerError: 创建容器失败
m.internalLifecycle.PreStartContainer 执行hook报错
RunContainerError: 启动容器失败
PostStartHookError: 执行hook报错
ContainersNotInitialized: 容器没有初始化完毕
ContainersNotReady: 容器没有准备完毕
ContainerCreating:容器创建中
PodInitializing:pod 初始化中
DockerDaemonNotReady:docker还没有完全启动
NetworkPluginNotReady: 网络插件还没有完全启动
Evicte: pod被驱赶
二、Pod探针和hook
2.1 pod过程
hook表示可人为定义命令并运行
probe(探针)表示探测容器运行状态可自定义设置探测对象
- init contioners 初始化容器,在启动完成之后会自动消亡(初始化容器可以有多个,是串行启动的)
- post start hook 作用:主容器启动完成之后可运行命令,类似于/etc/rc.local文件
- startup probe 启动探针,是一次性探针,只有这个探针没问题,之后的周期性探针才会生效;未定义这个选项时,容器一启动,周期性探针就开始运行了。
- liveness probe 存活探针。检查容器启动状态是否健康(周期性探针);检测未通过时,kubelet会根据restartPolicy(重启策略)的定义来决定是否重启该容器;未定义这个选项时,kubelet只认为容器未退出,即为健康。【探针在探测时如果容器启动首次探测失败是不会被重启的,只有连续三次探测失败才会重启(这里的首次探测失败是三次中的第一次失败了,后两次没失败就不会重启)】
- readiness probe 就绪探针,检查容器是否可以被访问,是否就绪(周期性探针);检测未通过时,与该pod关联的service,会将该Pod从Service的后端可用端点列表中删除,直到再次就绪时,重新添加回来;未定义这个选项时,kubelet只认为容器未退出,即为就绪。【这个选项探测失败后容器是不会重启的,只会影响端点】
- pre stop hook 结束容器之前可运行命令
2.2 探针类型
startup probe ,liveness probe,readiness probe每种探针都支持三种探针
- ExecAction: 直接执行命令,命令成功返回,表示探测成功
- TCPSocketAction: 端口能正常打开,即成功
- HTTPGetAction: 向指定的path发送HTTP请求,2xx,3xx的响应码表示成功。
2.3 参数解释
kubectl explain pods.spec.containers.livenessProbe可以看到以下内容
apiVersion: v1
kind: Pod
metadata: {...}
spec:
containers:
- name: ...
image: ...
livenessProbe:
exec <Object> #命令式探针
httpGet <Object> #http GET类型的探针
tcpSocket <Object> #tcp Socket类型的探针
initialDelaySeconds <integer> #容器启动时发起首次探测请求的延后时长
periodSeconds <integer> #请求周期
timeoutSeconds <integer> #超时时长
successThreshold <integer> #成功阈值意思是:成功几次才算是真正的成功,次数
failureThreshold <integer> #失败阈值意思是:失败几次才算是真正的失败,次数
2.4 举例
此次是基于liveness probe(存活探针)来演示三种探针类型,其他的startup probe ,readiness probe类似
2.4.1 ExecAction执行命令
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-demo
labels:
app: liveness-exec-demo
namespace: dev
spec:
containers:
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
command: ['/bin/sh', '-c', '[ "$(curl -s 127.0.0.1/livez)" == "OK" ]']
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 5
kubectl describe pods liveness-exec-demo 查看详细信息
如果curl检测的结果不等于OK,就容器就会退出并重启容器。
验证:curl pod_ip:80/livez 返回的应该是OK
修改livez参数的值:curl -X POST -d “livez=fail” pod_ip:80/livez;修改之后curl pod_ip:80/livez 返回的应该是fail,然后就会发现pod重启了,因为这个参数的值是临时修改的,所以重启pod之后,curl pod_ip:80/livez 返回的是OK
2.4.2 TCPSocketAction探针
apiVersion: v1
kind: Pod
metadata:
name: liveness-tcpsocket-demo
labels:
app: liveness-tcpsocket-demo
namespace: dev
spec:
containers:
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
ports: #声明一个名为http的端口
- name: http
containerPort: 80
securityContext: #加上修改内核的特权是因为待会验证时,直接修改iptables规则
capabilities:
add:
- NET_ADMIN
livenessProbe:
tcpSocket:
port: http #这里的http是引用的上边的ports中http这个选项
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 5
kubectl describe pods liveness-tcpsocket-demo 查看详细信息
这里的Tcpsocket探针方法只是对80端口的探测,只要80端口不挂,就不会检测失败也就不会重启,所以这里需要设置规则,使80端口拒绝访问。
验证:修改规则:kubectl exec liveness-tcpsocket-demo – iptables -A INPUT -p tcp --dport 80 -j REJECT 这条规则表示拒绝访问80端口
之后就会发现pod重启
2.4.3 HTTPGetAction探针
apiVersion: v1
kind: Pod
metadata:
name: liveness-httpget-demo
labels:
app: liveness-httpget-demo
namespace: dev
spec:
containers:
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
ports: #声明一个名为http的端口
- name: http
containerPort: 80
livenessProbe:
httpGet:
path: '/livez'
port: http #这里的http是引用的上边的ports中http这个选项
scheme: HTTP
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 5
kubectl describe pods liveness-httpget-demo 查看详细信息
这种方法不同于exec命令探测,这里只看响应码是否是2xx或者3xx,不管内容如何
验证:curl -I pod_ip:80/livez 返回200
修改:curl -X POST -d “livez=fail” pod_ip:80/livez
验证:curl -I pod_ip:80/livez 返回5xx,之后发现pod重启
2.4.4 探针readiness probe示例
- HTTPGetAction方法
readiness probe 只会影响service后端列表,pod不会重启
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-demo
labels:
app: readiness-httpget-demo
namespace: dev
spec:
containers:
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
ports: #声明一个名为http的端口
- name: http
containerPort: 80
readinessProbe:
httpGet:
path: '/readyz'
port: http #这里的http是引用的上边的ports中http这个选项
scheme: HTTP
initialDelaySeconds: 15
timeoutSeconds: 2
periodSeconds: 5
failureThreshold: 3
restartPolicy: Always
kubectl describe pods readiness-httpget-demo 查看详细信息
curl pod_ip:80/readyz 返回OK
curl -I pod_ip:80/readyz 返回200
修改:curl -X POS -d “readyz=fail” pod_ip:80/readyz
curl pod_ip:80/readyz 返回fail
curl -I pod_ip:80/readyz 返回5xx,然后查看kubectl get pods -o wide 会发现这个pod中没有就绪的容器了,pod并不会重启
2.5 hook
hook的postStart选项和preStop也跟探针一样支持三种方法
2.5.1 示例
启动前和结束前执行的命令
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
labels:
app: lifecycle-demo
namespace: dev
spec:
containers:
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
ports: #声明一个名为http的端口
- name: http
containerPort: 80
livenessProbe:
httpGet:
path: '/livez'
port: http #这里的http是引用的上边的ports中http这个选项
scheme: HTTP
initialDelaySeconds: 15
timeoutSeconds: 2
periodSeconds: 5
failureThreshold: 3
lifecycle:
postStart:
exec:
command: ['/bin/sh','-c','iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-ports 80']
preStop:
exec:
command: ['/bin/sh','-c','while killall python3;do sleep 1; done']
restartPolicy: Always
三、pod多容器
pod中可存在多个容器,初始化容器和主容器,其中主容器又分为应用容器,sidecar容器,Adapater容器,ambanssador容器
3.1 主容器的作用
- sidecar容器
为主容器提供辅助功能,例:日志收集容器,代理容器等 - Adapater容器
提供兼容的,例prometheus监控时 - ambanssador容器
大使容器,为主容器更好的接入外部环境的,例:链接外部数据库(mysql,MongoDB等)
3.2 初始化容器示例
这里设置初始化容器的目的在于:为了防止修改内核的权限一直在主容器中可以使用,所以把修改内核的权限放到了初始化容器里,因为修改内核参数之后初始化容器就会消亡,这样就能保证pod的安全性
apiVersion: v1
kind: Pod
metadata:
name: init-container-demo
labels:
app: init-container-demo
namespace:dev
spec:
initContainers:
- name: iptables-init
image: ikbernetes/admin-box:latest #这里的初始化镜像可自己构建,反正用完之后就消失了
imagePullPolicy: IfNotPresent
command: ['/bin/sh','-c']
args: ['/sbin/iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80']
securityContext:
capabilities:
add:
- NET_ADMIN
containers:
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
3.3 sidecar容器示例
apiVersion: v1
kind: Pod
metadata:
name: sidecar-container-demo
labels:
app: sidecar-container-demo
namespace:dev
spec:
containers:
- name: proxy
image: envproxy/envoy-alpine:v1.14.1 #这是个代理容器,可以代理主容器,这里是代理demoapp的8080端口
command: ['/bin/sh','-c']
args: ['sleep 5 && envoy -c /etc/envoy/envoy.yaml'] #这里睡眠5秒是因为下边的启动完执行命令和主容器是一起运行的,如果不加下边的文件为下载完,主容器启动会报错的,所以这里主容器先睡5秒,等文件下载完之后在启动
lifecycle:
postStart:
exec:
command: ['/bin/sh','-c','wget -O /etc/envoy/envoy.yaml http://ilinux.io/envoy.yaml']
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
env:
- name: HOST
value: "127.0.0.1"
- name: PORT
value: "8080"
四、Pod容器的资源需求和限制
4.1 资源选项
resources选项可以定义在pod级别也可以定义在容器级别
requests:下阈值,表示最少需要多少资源cpu和内存
limits:上阈值,表示最多能使用多少资源
查看选项说明
kubectl explain pods.spec.containers.resources
yaml格式
apiVersion: v1
kind: Pod
metadata:
name: ...
spec:
containers:
- name: ...
image: ...
resources:
requests:
cpu: ...
memory: ...
limits:
cpu: ...
memroy: ...
4.2 示例
4.2.1 requests示例
- 部署
apiVersion: v1
kind: Pod
metadata:
name: stress-pod #压力测试pod
spec:
containers:
- name: stress
image: ikubernetes/stress-ng
command: ["/usr/bin/stress-ng", "-c 1", "-m 1", "--metrics-brief"]
resources:
requests:
cpu: "200m"
memory: "128Mi"
limits:
cpu: "400M"
memroy: "512Mi"
- 验证
查看内存和cpu
kubectl exec stress-pod -- top
4.2.2 limits示例
- 部署
用于测试内存泄漏的
apiVersion: v1
kind: Pod
metadata:
name: memleak-pod #内存泄漏
labels:
app: memleak
spec:
containers:
- name: simmemleak
image: ikubernetes/simmemleak
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "64Mi"
cpu: "1"
limits:
memory: "64Mi"
cpu: "1"
- 验证
kubectl apply -f resource-limits-demo.yaml
根据以下情况可以看到OOM,会看到会重启,而且重启的间隔时间越来越长
[root@master01 ~]# kubectl get pods -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
memleak-pod 0/1 Pending 0 0s <none> <none> <none> <none>
memleak-pod 0/1 Pending 0 0s <none> node02 <none> <none>
memleak-pod 0/1 ContainerCreating 0 0s <none> node02 <none> <none>
memleak-pod 0/1 OOMKilled 0 1s 10.244.2.3 node02 <none> <none>
memleak-pod 0/1 OOMKilled 1 2s 10.244.2.3 node02 <none> <none>
memleak-pod 0/1 CrashLoopBackOff 1 3s 10.244.2.3 node02 <none> <none>
memleak-pod 0/1 OOMKilled 2 15s 10.244.2.3 node02 <none> <none>
memleak-pod 0/1 CrashLoopBackOff 2 27s 10.244.2.3 node02 <none> <none>
memleak-pod 0/1 OOMKilled 3 41s 10.244.2.3 node02 <none> <none>
memleak-pod 0/1 CrashLoopBackOff 3 55s 10.244.2.3 node02 <none> <none>
4.3 服务质量类别
QoS Class:服务质量类别,代表了Pod的资源被优先满足的类别
- Guaranteed:Pod内的每个容器都分别设定了CPU和Memroy资源需求和资源限制,CPU的需求与限制相等,而且Memory的需求与限制也相等;
- Bustable:设置了CPU或Memory,无论设置了几个或多少,都处于这个级别
- BestEffort:未为任何一个容器设定任何需求或限制;
如果节点资源不够了,pod中是会按照以上这几个级别保证容器的运行,1优先保证,2之后,3最低级别。
五、整理yaml示例
5.1 大部分示例yaml及解释
apiVersion: v1
kind: Pod
metadata:
name: all-in-one
namespace: default
spec:
#初始化容器:1.设置iptables规则,将8080端口的请求重定向到80端口
#2.securityContext选项定义了:修改大部分内核参数的特权权限
initContainers:
- name: iptables-init
image: ikubernetes/admin-box:latest
imagePullPolicy: IfNotPresent
command: ['/bin/sh','-c']
args: ['iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80']
securityContext:
capabilities:
add:
- NET_ADMIN
containers:
#sidecar-proxy作用:主要是代理demo容器的8080端口
#livenessProbe选项:设置了检测容器状态的配置;使用的tcpSocket方法,检测80端口是否是通的
#readinessProbe选项:设置了检测容器是否就绪的配置;使用的tcpSocket方法,检测80端口是否是通的
- name: sidecar-proxy
image: envoyproxy/envoy-alpine:v1.13.1
command: ['/bin/sh','-c']
args: ['sleep 3 && envoy -c /etc/envoy/envoy.yaml']
lifecycle:
postStart:
exec:
command: ['/bin/sh','-c','wget -O /etc/envoy/envoy.yaml http://ilinux.io/envoy.yaml']
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5 #容器启动五秒之后才会周期性检测80端口的状态
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
#demo容器:1.设置了web端口为8080
#2.livenessProbe选项使用的是httpGet方法,检测的是访问ip:端口/livez路径返回是否是200,不是200就会重启
#3.readinessProbe选项使用的是httpGet方法,检测的是访问ip:端口/readyz路径返回是否是200,不是200就会重启;这里的initialDelaySeconds(容器启动之后的检测时间)写15秒,是因为要保证livenessProbe先检测
#4.securityContext选项:设置了运行用户和组
#5.resources选项:设置的是下阈值cpu和memory分别为:0.5核和64mb;上阈值cpu和memory分别为:2核和1024mb
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
env:
- name: PORT
value: '8080'
livenessProbe:
httpGet:
path: '/livez'
port: 8080
initialDelaySeconds: 5
readinessProbe:
httpGet:
path: '/readyz'
port: 8080
initialDelaySeconds: 15
securityContext:
runAsUser: 1001
runAsGroup: 1001
resources:
requests:
cpu: 0.5
memory: "64Mi"
limits:
cpu: 2
memory: "1024Mi"
#这里的securityContext选项是设置在pod级别的,表示容器设置的运行用户只能在1002和1003之间
securityContext:
supplementalGroups: [1002, 1003]
fsGroup: 2000
5.2 deployment中设置readinessProbe示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: demoapp2
spec:
replicas: 2
selector:
matchLabels:
app: demoapp-with-readiness
template:
metadata:
creationTimestamp: null
labels:
app: demoapp-with-readiness
spec:
containers:
- image: ikubernetes/demoapp:v1.0
name: demoapp
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
path: '/readyz'
port: 80
initialDelaySeconds: 15
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: services-readiness-demo
namespace: default
spec:
selector:
app: demoapp-with-readiness
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
更多推荐
所有评论(0)