k8s---pod高级管理(资源控制、重启策略与探针)

一.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规则,去重启容器

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值