zoukankan      html  css  js  c++  java
  • K8S-资源配置清单详解

    服务健康检查

    检测容器服务是否健康的手段,若不健康,会根据设置的重启策略(restartPolicy)进行操作,两种检测机制可以分别单独设置,若不设置,默认认为Pod是健康的。
    两种机制:

    • LivenessProbe探针
      存活性探测:用于判断容器是否存活,即Pod是否为running状态,如果LivenessProbe探针探测到容器不健康,则kubelet将kill掉容器,并根据容器的重启策略是否重启,如果一个容器不包含LivenessProbe探针,则Kubelet认为容器的LivenessProbe探针的返回值永远成功。
     containers:
      - name: myblog
        image: 192.168.136.10:5000/myblog:v1
        livenessProbe:
          httpGet:
            path: /blog/index/
            port: 8002
            scheme: HTTP
          initialDelaySeconds: 10  # 容器启动后第一次执行探测是需要等待多少秒
          periodSeconds: 10 	# 执行探测的频率
          timeoutSeconds: 2		# 探测超时时间
    
    
    • ReadinessProbe探针
      可用性探测:用于判断容器是否正常提供服务,即容器的Ready是否为True,是否可以接收请求,如果ReadinessProbe探测失败,则容器的Ready将为False, Endpoint Controller 控制器将此Pod的Endpoint从对应的service的Endpoint列表中移除,不再将任何请求调度此Pod上,直到下次探测成功。(剔除此pod不参与接收请求不会将流量转发给此Pod)。
      containers:
      - name: myblog
        image: 192.168.136.10:5000/myblog:v1
        readinessProbe: 
          httpGet: 
            path: /blog/index/
            port: 8002
            scheme: HTTP
          initialDelaySeconds: 10 
          timeoutSeconds: 2
          periodSeconds: 10
    

    访问分为三种类型:

    • exec:通过执行命令来检查服务是否正常,返回值为0则表示容器健康
    • httpGet方式:通过发送http请求检查服务是否正常,返回200-399状态码则表明容器健康
    • tcpSocket:通过容器的IP和Port执行TCP检查,如果能够建立TCP连接,则表明容器健康

    上一个实例:

      containers:
      - name: myblog
        image: 192.168.136.10:5000/myblog:v1
        env:
        - name: MYSQL_HOST   #  指定root用户的用户名
          value: "127.0.0.1"
        - name: MYSQL_PASSWD
          value: "123456"
        ports:
        - containerPort: 8002
        livenessProbe:
          httpGet:
            path: /blog/index/
            port: 8002
            scheme: HTTP
          initialDelaySeconds: 10  # 容器启动后第一次执行探测是需要等待多少秒
          periodSeconds: 10 	# 执行探测的频率
          timeoutSeconds: 2		# 探测超时时间
        readinessProbe: 
          httpGet: 
            path: /blog/index/
            port: 8002
            scheme: HTTP
          initialDelaySeconds: 10 
          timeoutSeconds: 2
          periodSeconds: 10
    

    参数详解:

    • initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒。
    • periodSeconds:执行探测的频率。默认是10秒,最小1秒。
    • timeoutSeconds:探测超时时间。默认1秒,最小1秒。
    • successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1。
    • failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3,最小值是1。

    K8S将在Pod开始启动10s(initialDelaySeconds)后利用HTTP访问8002端口的/blog/index/,如果超过2s或者返回码不在200~399内,则健康检查失败

    容器的重启策略

    Pod的重启策略(RestartPolicy)应用于Pod内的所有容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet将根据RestartPolicy的设置来进行相应的操作。
    Pod的重启策略包括Always、OnFailure和Never,默认值为Always。

    • Always:当容器进程退出后,由kubelet自动重启该容器;
    • OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器;
    • Never:不论容器运行状态如何,kubelet都不会重启该容器。
    1. 使用默认的重启策略,即 restartPolicy: Always ,无论容器是否是正常退出,都会自动重启容器
    2. 使用OnFailure的策略时
      • 如果把exit 1,去掉,即让容器的进程正常退出的话,则不会重启
      • 只有非正常退出状态才会重启
    3. 使用Never时,退出了就不再重启

    我们一般都是选择默认,只在个别情况下选择其他
    实例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-restart-policy
    spec:
      restartPolicy: Always
      containers:
      - name: busybox
        image: busybox
        args:
        - /bin/sh
        - -c
        - sleep 10
    

    镜像拉取策略

    设置镜像的拉取策略,默认为IfNotPresent

    • Always,总是拉取镜像,即使本地有镜像也从仓库拉取
    • IfNotPresent ,本地有则使用本地镜像,本地没有则去仓库拉取
    • Never,只使用本地镜像,本地没有则报错
    spec:
      containers:
      - name: test-one
        image: harbor.xxx.com/xxx/test:v1.1
        imagePullPolicy: IfNotPresent
    
    

    Pod资源限制

    为了保证充分利用集群资源,且确保重要容器在运行周期内能够分配到足够的资源稳定运行,因此平台需要具备

    Pod的资源限制的能力。 对于一个pod来说,资源最基础的2个的指标就是:CPU和内存。

    Kubernetes提供了个采用requests和limits 两种类型参数对资源进行预分配和使用限制。

      containers:
        ...
        resources:
          requests:
            memory: 100Mi
            cpu: 50m
          limits:
            memory: 500Mi
            cpu: 100m
    
    

    requests:

    • 容器使用的最小资源需求,作用于schedule阶段,作为容器调度时资源分配的判断依赖
    • 只有当前节点上可分配的资源量 >= request 时才允许将容器调度到该节点
    • request参数不限制容器的最大可使用资源
    • requests.cpu被转成docker的--cpu-shares参数,与cgroup cpu.shares功能相同 (无论宿主机有多少个cpu或者内核,--cpu-shares选项都会按照比例分配cpu资源)
    • requests.memory没有对应的docker参数,仅作为k8s调度依据

    limits:

    • 容器能使用资源的最大值
    • 设置为0表示对使用的资源不做限制, 可无限的使用
    • 当pod 内存超过limit时,会被oom
    • 当cpu超过limit时,不会被kill,但是会限制不超过limit值
    • limits.cpu会被转换成docker的–cpu-quota参数。与cgroup cpu.cfs_quota_us功能相同
    • limits.memory会被转换成docker的–memory参数。用来限制容器使用的最大内存
      对于 CPU,我们知道计算机里 CPU 的资源是按“时间片”的方式来进行分配的,系统里的每一个操作都需要 CPU 的处理,所以,哪个任务要是申请的 CPU 时间片越多,那么它得到的 CPU 资源就越多。

    来一段比较完善的yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: mysql
      namespace: luffy
      labels:
        component: mysql
    spec:
      hostNetwork: true	# 声明pod的网络模式为host模式,效果同docker run --net=host
      volumes: 
      - name: mysql-data
        hostPath: 
          path: /opt/mysql/data
      nodeSelector:   # 使用节点选择器将Pod调度到指定label的节点
        component: mysql
      containers:
      - name: mysql
        image: 192.168.136.10:5000/mysql:5.7-utf8
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
        - name: MYSQL_DATABASE
          value: "myblog"
        resources:
          requests:
            memory: 100Mi
            cpu: 50m
          limits:
            memory: 500Mi
            cpu: 100m
        readinessProbe:
          tcpSocket:
            port: 3306
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          tcpSocket:
            port: 3306
          initialDelaySeconds: 15
          periodSeconds: 20
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
    
    
  • 相关阅读:
    从0开始的Python学习013编写一个Python脚本
    Spring Cloud Eureka基本概述
    RocketMQ入门案例
    Quartz使用记录总结
    Spring Boot 1.5升级2.1 主要问题汇总
    Eureka客户端注册多网卡下IP选择问题
    Spring Security之动态配置资源权限
    代码规范问题
    Spring Security + OAuth系统环境搭建(一)
    Java并发编程之AQS
  • 原文地址:https://www.cnblogs.com/dinghc/p/14384726.html
Copyright © 2011-2022 走看看