一.pod资源管理:
Pod和Container的资源请求和限制:
●CPU和内存的上限设定:
- spec.containers[].resources.limits.cpu //cpu上限
- spec.containers[].resources.limits.memory //内存上限
创建资源(初始化资源): - spec.containers[].resources.requests.cpu //创建时分配的基本CPU资源
- spec.containers[].resources.requests.memory //创建时分配的基本内存资源
- 两者的关系为初始化资源要小于等于上限资源,才能保证资源能够支持高并发
示例:以yaml文件格式创建资源
[root@master dev]# cd /root/demo/
[root@master demo]# vim pod2.yaml
apiVersion: v1
kind: Pod ##pod资源
metadata:
name: frontend
spec:
containers:
- name: db
image: mysql ##镜像为mysql
env: ##设置环境变量
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources: ##资源配置
requests: ##请求资源
memory: "64Mi" ##占用内存资源为64M
cpu: "250m" ##1秒中一个cpu核心资源分配为25%资源
limits: ##最大资源上限
memory: "128Mi" ##占用最大内存资源为128M
cpu: "500m" ##cpu核心资源分配上限为50%资源
- name: wp
image: wordpress
resources:
requests:
memory: "64Mi" ##这边也是一样的,初始化资源要小于创建资源
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
[root@master demo]# kubectl apply -f pod2.yaml ##基于yaml文件创建pod资源
pod/frontend created
[root@master demo]# kubectl get pods ##查看pod资源
NAME READY STATUS RESTARTS AGE
frontend 2/2 Running 0 70s
[root@master demo]# kubectl describe pod frontend ##查看创建资源的具体信息
[root@master demo]# kubectl describe nodes 192.168.148.139 ##查看创建节点的具体信息
[root@master demo]# kubectl get ns ##查看命名空间
NAME STATUS AGE
default Active 5d9h
kube-public Active 5d9h
kube-system Active 5d9h
二.重启策略
●当pod在遇到故障后重启的动作
- Always:当容器终止退出后,总是重启容器,默认策略
- OnFailure:当容器异常退出(退出状态码非0值)时,重启容器
- Never:当容器终止退出,从不重启容器
举例:
1.创建yaml文件格式资源,默认重启策略为always
[root@master demo]# vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: busybox ##linux内核最小化
image: busybox
args: ##参数
- /bin/sh ##shell环境
- -c ##执行-c
- sleep 8; exit 3 ##休眠8s后异常退出
[root@master demo]# kubectl get pods -w ##查看pods创建的信息
NAME READY STATUS RESTARTS AGE
foo 0/1 ContainerCreating 0 23s ##创建状态
foo 1/1 Running 0 52s ##创建完成后running状态
foo 0/1 Error 0 61s ##休眠9s(8s左右)后异常退出,触发always重启策略
foo 1/1 Running 1 79s ##容器创建完成后,运行
foo 0/1 Error 1 88s ##创建好后,再次休眠9s后异常退出,触发重启策略
[root@master ~]# kubectl get pods ##查看重启次数
2.创建yaml文件格式资源,默认重启策略为never
[root@master demo]# vim pod4.yaml
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- sleep 8 ##休眠8秒
restartPolicy: Never ##设置重启策略为never:当容器终止退出,从不重启容器
[root@master demo]# kubectl delete -f pod3.yaml ##删除po3的资源(资源名会重名)
pod "foo" deleted
[root@master demo]# kubectl create -f pod4.yaml ##创建po4的资源
pod/foo created
[root@master demo]# kubectl get pods -w ##查看创建过程详细信息
NAME READY STATUS RESTARTS AGE
foo 0/1 ContainerCreating 0 12s ##创建状态
foo 1/1 Running 0 21s ##资源运行状态
foo 0/1 Completed 0 29s ##进入休眠后,容器终止退出,不会重启容器
三.健康检查:又称为探针(Probe)
●定义的规则:
(注意:)规则可以同时定义
- livenessProbe 如果检查失败,将杀死容器,根据Pod的restartPolicy(重启策略)来操作,保证为running状态。
- ReadinessProbe 如果检查失败,kubernetes会把Pod从service endpoints(pod副本集)中移除(适用于无状态化的服务);但是会触发副本集中定义资源的数量,副本集会重新创建新的资源到副本集的数量。
●Probe支持三种检查方法:
- httpGet 发送http请求,返回200-400范围状态码为成功,如果返回的状态码不在这个范围内就会去匹配上面两个规则
- exec 执行Shell命令返回状态码是0为成功,如果返回的状态码为非0值就会去匹配上面两个规则
- tcpSocket 发起TCP Socket建立成功,如果tcp三次握手不成功就会触发规则
●对应的官方文档地址:
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
示例1.:exec方式
[root@master demo]# vim pod5.yaml ##创建pod5资源文件,这边没设置重启策略,默认为always
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness ##标签test为测试容器
name: liveness-exec
spec:
containers:
- name: liveness ##容器名称
image: busybox ##下载的镜像为busyox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 10; rm -rf /tmp/healthy;sleep 30 ##创建一个文件,且休眠10s,然后删除文件,在休眠30s
livenessProbe: ##探针
exec: ##执行exec探针方式
command: ##command命令
- cat
- /tmp/healthy ##执行查看文件的命令,查看文件是否存在
initialDelaySeconds: 5 ##告诉kubelet在执行第一个探测之前应等待5秒钟(依赖于探测命令执行的时间长短,要是命令执行时间较长就需要将等待时间放长)
periodSeconds: 5 ##指定kubelet每5s执行一次活动性探针
●解释:Exec当中用cat命令去查看创建的文件,每5s执行一次活动性探针,要是文件存在,命令执行成功返回状态值为0,kubelet就认为该容器处于活动状态且健康;休眠10s后,执行rm -rf命令,文件会被删除,在执行探针查看文件是否存在时,发现此时文件不存在,返回状态码就为非0值;这样就会去匹配两个规则,如果匹配的规则是livenessProbe,就会去查看重启策略,假如重启策略是always就会重启容器,是never就不会去重启容器;匹配的规则是ReadinessProbe,就会将Pod从service endpoints(pod副本集)中移除
[root@master demo]# kubectl create -f pod5.yam ##创建资源
pod/liveness-exec created
[root@master demo]# kubectl get pods ##查看资源信息发现重启了一次
NAME READY STATUS RESTARTS AGE
liveness-exec 1/1 Running 1 75s ##重启过,说明探针生效了
示例2.:httpget方式
[root@master demo]# vim pod6.yaml ##创建httpget的yaml文件
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http ##
spec:
containers:
- name: nginx
image: nginx ##镜像为nginx
#args:
#- /server
livenessProbe:
httpGet:
path: /healthz
port: 80 ##端口为80端口
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3 ##告诉kubelet在执行第一个探测之前应等待3秒钟
periodSeconds: 3 ##指定kubelet每3s执行一次活动性探针
●解释:用http请求访问站点目录,kubelet应该每3秒执行一次活动性探测,访问80端口,要是能正常访问80端口,返回200-400范围状态码,kubelet就认为该容器处于活动状态且健康;在执行探针查看端口是否开启时,如果端口宕掉了,不能正常访问80端口,返回的状态码不在200-400范围内,就会去匹配两个规则,如果匹配的规则是livenessProbe,就会去查看重启策略,假如重启策略是always就会重启容器,是never就不会去重启容器;匹配的规则是ReadinessProbe,就会将Pod从service endpoints(pod副本集)中移除
[root@master demo]# kubectl create -f pod6.yaml ##创建pod6资源
pod/liveness-http created
[root@master demo]# kubectl get pods ##查看pod资源信息
NAME READY STATUS RESTARTS AGE
liveness-http 0/1 CrashLoopBackOff 8 21m ##重启次数为8次
示例3:tcpSocket方式
[root@master demo]# vim pod5.yaml ##编写tcpSocket文件
apiVersion: v1
kind: Pod
metadata:
name: liveness-tcp
labels:
app: liveness-tcp
spec:
containers:
- name: liveness-tcp
image: nginx ##镜像为nginx
ports:
- containerPort: 80
readinessProbe: ##readinessProbe规则
tcpSocket:
port: 80 ##端口为80端口
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe: ##livenessProbe规则
tcpSocket:
port: 80
initialDelaySeconds: 15
periodSeconds: 20
##通过配置,kubelet 会尝试在指定端口和容器建立套接字链接。如果可以建立连接,这个容器就被看作是健康的,否则就被看作是有问题的。
[root@master demo]# kubectl create -f pod5.yaml ##创建pod5资源
pod/liveness-tcp created
[root@master demo]# kubectl get pods ##查看资源
NAME READY STATUS RESTARTS AGE
liveness-tcp 1/1 Running 0 115s
●解释:这边用了两个探针
第一个探针:开启前5s种探测80端口,如果8080端口访问不到就会匹配ReadinessProbe规则,将Pod从service endpoints(pod副本集)中移除
第二个探针:如果不能从副本集中移除,就会触发第二个探针,匹配livenessProbe规则,去重启容器