深入了解Pod(一)

一、pod的配置文件

Pod配置文件的属性说明

属性名称

取值类型

是否必须

取值说明

version

String


 

版本号 ,例如V1

kind

String


 

Pod

metadata

Object


 

元数据

metadata.name
 

String

Pod名称

metadata.namespace

String


 

所属命名空间,默认为default

metadata.labels[]


List


 


自定义标签列表

metadata.annotation[]

List

自定义注解列表

Spec

Object

Pod中容器的详细定义

spec.containers[]

List

Pod中的容器列表

spec.containers[].name

String

容器的名称

spec.containers[].image

String

容器的镜像名称

spec.containers[].imagePullPolicy

String

镜像拉取策略

Always:每次都拉取最新镜像

IfNotPresent:如果本地有该镜则使用本地镜像,如果没有则拉取镜像

Never:只使用本地镜像,当本地没有镜像时,Pod启动会报错

spec.containers[].command[]

List

容器的启动命令列表,如不指定则使用镜像打包时的命令

spec.containers[].args[]

List

容器启动时的命令 参数列表

spec.containers[].workingDir

String

容器的工作目录

spec.containers[].volumeMounts[]

List

挂载到容器内部的存储卷配置

spec.containers[].volumeMounts[].name

String

引用Pod共享存储卷的名称

spec.containers[].volumeMounts[].mountPath

String

存储卷在容器内挂载的绝对路径,应少于512个字符

spec.containers[].volumeMounts[].readOnly

Boolean

是否为读写模式,默认为读写模式

spec.containers[].ports[]

List

容器需要暴露的端口号列表

spec.containers[].ports[].name

String

端口名称

spec.containers[].ports[].containerPort

int

容器需要监听的端口号

spec.containers[].ports[].hostPort

int

容器所在主机需要监听的端口号,默认与containerPort相同

spec.containers[].ports[].protocol

String

端口协议,支持TCP、UDP默认为TCP

spec.containers[].env[]

List

容器运行前需设置的环境变量列表

spec.containers[].env[].name

String

环境变量的名称

spec.containers[].env[].value

String

环境变量的值

spec.containers[].resources

Object

资源限制和资源请求的配置

spec.containers[].resources.limits

Object

资源上限限制的配置

spec.containers[].resources.limits.cpu

String

CPU限制

spec.containers[].resources.limits.memory

String

内存限制,单位为MiB、GiB

spec.containers[].resources.request

Object

资源最小配置的限制

spec.containers[].resources.request.cpu

String

CPU限制容器启动所需的最小CPU核数

spec.containers[].resources.request.memory

String

容器启动所需的内存,单位为MiB、GiB

spec.restartPolicy

String

Pod重启策略

Always: Pod一旦终止运行,则无论容器是如何终止i,kubectl都会重启。

OnFailure:容器不是正常结束(退出码不为0)Kubectl会重启它。

Never:kubectl将退出码上报Master,不会再重启该Pod

spec.nodeSelector

Object

标签选择器,Pod根据标签调度

spec.imagePullSecrets

Objectt

镜像私有仓库的密码 以name:secretkey格式指定

注:这并不是Pod的所有属性,还有一些属性没有一一列举

apiVersion: v1
kind: Namespace
metadata:
  name: wssnail-test  #指定namespace名称
  
---
apiVersion: v1 #版本
kind: Pod #类型为pod
metadata: #元数据
  name: my-nginx-pod   #指定pod名称,不会随机生成
  namespace: 'wssnail-test'   #指定namespace名称
  labels: #定义标签
    version: 1.0.0 #标签的值。可以有多个值
    env: test
spec:
  containers: #pod中容器描述
    - name: my-nginx-contaniner #指定容器名称
      image: nginx:1.21.4 #指定镜像
      imagePullPolicy: IfNotPresent  #always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      workingDir: /usr/share/nginx/html  #容器启动后的工作目录
      ports:
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #网络协议 UDP、TCP
      resources: #所需资源
        limits: #最大分配资源
          memory: "200Mi"
          cpu: "700m"
        requests: #所需最少资源
          memory: "200Mi"
          cpu: "100m"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启

二、Pod探针

        Pod的探针技术目的是为了检测Pod的健康状态,有三类探针分别是StartupProbe、LivenessProbe和ReadinessProbe。

        StartupProbe探针(启动探针):启动探针的目的是为了检测容器启动的时候是否健康,能否启动起来。例如一个Springboot 项目启动时候需要依赖mysql,那么Mysql就必须先于Springboot启动,这时启动探针就可以通过指令检查Mysql是否启动成功。

LivenessProbe探针(存活探针):用于判断容器是否存活(Running状态),如果LivenessProbe探针检测到容器不健康,Kubelet将干掉这个容器,然后该容器根据重启策略作相应的处理,如果不配置这个探针,那么kubelet就认为这个探针返回值永远是Success。

ReadinessProbe(就绪探针):这个探针用于检测容器是否可用(Ready状态),只有就绪状态的Pod才会接收请求。

以上三种方式的探针均有三种方式检测即 HttpGetAction、TCPSocketAction和命令行ExecAction的方式实现

1、StartupProbe启动探针

基于HttpGetAction方式
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      #配置启动探针
      startupProbe: #启动探针
        httpGet: #基于http的探测
          port: 80 #端口
          path: /api #请求路径,这里我故意写了一个不存在的路径,目的是为了检测启动探针报错,启动失败
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  
#创建资源
 kubectl create -f my-nginx-pod.yaml 
#查看资源
kubectl get pods -n wssnail-nginx

 

 查看资源描述

kubectl describe pod my-nginx-pod -n wssnail-nginx

 可以看到容器请求返回状态码为404,此时检测容器不健康。基于Http方式检测的探针状态码返回值大于等于200且小于400之间认为是健康的否则认为是不健康的。

当我们把配置文件修改为以下内容

apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      #配置启动探针
      startupProbe: #启动探针
        httpGet: #基于http的探测
          port: 80 #端口
          path: /index.html #请求路径,修改为正确路径
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  

#创建资源
 kubectl create -f my-nginx-pod.yaml 

#查看资源
kubectl get pods -n wssnail-nginx

#容器描述
kubectl describe pod my-nginx-pod -n wssnail-nginx

 

 基于TCPSocketAction方式
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      #配置启动探针
      startupProbe: #启动探针
#        httpGet: #基于http的探测
#          port: 80 #端口
#          path: /api #请求路径,这里我故意写了一个不存在的路径,目的是为了检测启动探针报错,启动失败
        tcpSocket:
          port: 80
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  

 然后同样查看命令发现pod正确被创建

#创建资源
 kubectl create -f my-nginx-pod.yaml 

#查看资源
kubectl get pods -n wssnail-nginx

#容器描述
kubectl describe pod my-nginx-pod -n wssnail-nginx
 基于命令行ExecAction
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      #配置启动探针
      startupProbe: #启动探针
#        httpGet: #基于http的探测
#          port: 80 #端口
#          path: /api #请求路径,这里我故意写了一个不存在的路径,目的是为了检测启动探针报错,启动失败
#        tcpSocket:
#          port: 80
        exec:
          command:
            - sh
            - -c
            - "sleep 3; echo success"
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  

2、LivenessProbe 存活探针

基于HttpGetAction方式
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      #配置启动探针
      startupProbe: #启动探针
        exec:
          command:
            - sh
            - -c
            - "sleep 3; echo success"
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      livenessProbe: #存活探针
        httpGet: #基于http方式
          port: 80 #端口
          path: /api #访问路径
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  

#创建资源
kubectl create -f my-nginx-pod-liveness.yaml 

#查看资源
kubectl get po -n wssnail-nginx 

#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx

 

 修改配置文件如下

apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      #配置启动探针
      startupProbe: #启动探针
        exec:
          command:
            - sh
            - -c
            - "sleep 3; echo success"
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      livenessProbe: #存活探针
        httpGet: #基于http方式
          port: 80 #端口
          path: /index.html #访问路径
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  

#创建资源
kubectl create -f my-nginx-pod-liveness.yaml 

#查看资源
kubectl get po -n wssnail-nginx 

#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx

基于TCPScocketAction方式
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      #配置启动探针
      startupProbe: #启动探针
        exec:
          command:
            - sh
            - -c
            - "sleep 3; echo success"
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      livenessProbe: #存活探针
#        httpGet: #基于http方式
#          port: 80 #端口
#          path: /index.html #访问路径
        tcpSocket:
          port: 80
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  
#创建资源
kubectl create -f my-nginx-pod-liveness.yaml 

#查看资源
kubectl get po -n wssnail-nginx 

#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx

基于命令行ExecAction
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      #配置启动探针
      startupProbe: #启动探针
        exec:
          command:
            - sh
            - -c
            - "sleep 3; echo success"
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      livenessProbe: #存活探针
#        httpGet: #基于http方式
#          port: 80 #端口
#          path: /index.html #访问路径
#        tcpSocket:
#          port: 80
       exec:
         command:
           - sh
           - -c
           - "echo 'started' > start_file"  #输出内容到文件
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  

#创建资源
kubectl create -f my-nginx-pod-liveness.yaml

#查看资源
 kubectl get po -n wssnail-nginx

#查看描述
kubectl describe po -n wssnail-nginx

#进入容器查看文件是否创建成功
 kubectl exec -it my-nginx-pod -n wssnail-nginx -- /bin/bash

#列出文件列表
ls

#查看文件
cat start_file

或者将文件复制到宿主机查看

#将文件从容器复制到宿主机
kubectl cp <namespace>/pod名称:<绝对路径> <宿主机路径>
kubectl cp wssnail-nginx/my-nginx-pod:/usr/share/nginx/html/start_file /root/start

3、ReadinessProbe 就绪探针

基于HttpGetAction
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      #配置启动探针
      startupProbe: #启动探针
        exec:
          command:
            - sh
            - -c
            - "sleep 3; echo success"
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      livenessProbe: #存活探针
        httpGet: #基于http方式
          port: 80 #端口
          path: /index.html #访问路径
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
#        tcpSocket:
#          port: 80
#       exec:
#         command:
#           - sh
#           - -c
#           - "echo 'started' > start_file"  #输出内容到文件
      readinessProbe:
        httpGet:
          port: 80
          path: /start.html
        initialDelaySeconds: 0 #启动容器进行健康检查的等待时间
        failureThreshold: 5 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  

#创建资源
kubectl create -f my-nginx-pod-readiness.yaml

#查看
kubectl get po -n wssnail-nginx

#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx 

 

 接下来我们创建一个start.html,然后复制到容器内

#创建文件
echo 'success' > start.html

#复制文件到容器内
kubectl cp start.html wssnail-nginx/my-nginx-pod:/usr/share/nginx/html
基于TCPScocketAction方式
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      #配置启动探针
      startupProbe: #启动探针
        exec:
          command:
            - sh
            - -c
            - "sleep 3; echo success"
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      livenessProbe: #存活探针
        httpGet: #基于http方式
          port: 80 #端口
          path: /index.html #访问路径
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
#        tcpSocket:
#          port: 80
#       exec:
#         command:
#           - sh
#           - -c
#           - "echo 'started' > start_file"  #输出内容到文件
      readinessProbe: #就绪探针
#        httpGet:
#          port: 80
#          path: /start.html
        tcpSocket:
          port: 80
        initialDelaySeconds: 0 #启动容器进行健康检查的等待时间
        failureThreshold: 5 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  
#创建资源
kubectl create -f my-nginx-pod-readiness.yaml 

#查看资源
kubectl get po -n wssnail-nginx

#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx
基于命令行ExecAction
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      #配置启动探针
      startupProbe: #启动探针
        exec:
          command:
            - sh
            - -c
            - "sleep 3; echo success"
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      livenessProbe: #存活探针
        httpGet: #基于http方式
          port: 80 #端口
          path: /index.html #访问路径
        initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
        failureThreshold: 3 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
#        tcpSocket:
#          port: 80
#       exec:
#         command:
#           - sh
#           - -c
#           - "echo 'started' > start_file"  #输出内容到文件
      readinessProbe: #就绪探针
#        httpGet:
#          port: 80
#          path: /start.html
#        tcpSocket:
#          port: 80
        exec:
          command:
            - sh
            - -c
            - "echo 'success'"
        initialDelaySeconds: 0 #启动容器进行健康检查的等待时间
        failureThreshold: 5 #失败多少次才算失败
        periodSeconds: 10 # 间隔时间 单位为秒
        successThreshold: 1 #成功几次算成功
        timeoutSeconds: 5 #请求超时时间 单位秒
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  

#创建资源
kubectl create -f my-nginx-pod-readiness.yaml 

#查看资源
kubectl get po -n wssnail-nginx

#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx

三、Pod生命周期

pod生命周期

在pod的生命周期中我们可以利用容器初始化和preStop做一些处理,类似spring的初始化和销毁时可以做一些处理。

Pod状态描述

状态值描述
PendingApi Server已经创建Pod,但在Pod内部还有至少一个镜像没有创建,包括正在下载的镜像
RunningPod 内所有的容器均已创建,且至少有一个容器处于运行状态、正在启动或者重启状态
SucceededPod内所有的容器均成功执行后退出,且不会再重启
FailedPod内所有的容易均已退出,但至少有一个容器退出为失败状态
Unknow由于某种原因无法获取Pod信息,例如网络通信不畅导致
Prestop的使用
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata:  #元数据
  name: my-nginx-pod  #名称
  namespace: 'wssnail-nginx' # 该pod所属的命名空间
  labels:  #标签
    purpose: test-startup-probe  # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec:  #容器的描述
  terminationGracePeriodSeconds: 30  #容器销毁时在该时间之后进行删除操作
  containers:
    - name: my-nginx-container #容器名称
      image: nginx:1.21.4 #镜像
      imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
      lifecycle:  #生命周期配置
        postStart: #生命周期启动阶段,该命令不一定比容器的command命令早执行,
         exec:
           command:
             - sh
             - -c
             -  "echo '<h1>preStart<h1>' > /usr/share/nginx/html/preStop.html"
#         httpGet:
#           path: /index.html
#           port: 80
#         tcpSocket:  #该方法已过期
#           port: 80
#         sleep:
#           seconds: 10
        preStop: #容器在停止时处理的事情
          exec:
            command:
              - sh
              - -c
              - "sleep 45; echo 'sleep over' >> /usr/share/nginx/html/preStop.html"  #理论上能访问到该内容
#         httpGet:
#           path: /index.html
#           port: 80
#         tcpSocket:  #该方法已过期
#           port: 80
#         sleep:
#           seconds: 10
      workingDir: /usr/share/nginx/html #容器内工作目录
      ports: #端口
        - name: my-port #端口名称
          containerPort: 80 #端口
          protocol: TCP #协议 TCP 、UDP
      resources: #所需资源
        requests: #所需最小资源限制
          cpu: "200m"
          memory: "128Mi"
        limits: #分配的最大资源限制
          cpu: "500m"
          memory: "256Mi"
  restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
  
#查看信息
kubectl get pod -n wssnail-ngin -o wide

#访问
curl 10.244.1.4/preStop.html 

四、资源调度

1、自动调度

apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-deploy #命名空间名称
---
apiVersion: apps/v1  #版本
kind: Deployment  #类型为Deployment
metadata: #元数据
  labels:  #标签
    app: my-nginx
  name: my-nginx-deploy
  namespace: wssnail-deploy
spec: #描述
  replicas: 3 #副本数量
  revisionHistoryLimit: 10  #历史版本限制,用来回退,如果设置为0则没有回退
  selector: #选择器
    matchLabels:
      app: my-nginx
  strategy:
    rollingUpdate:  #滚动更新策略
      maxSurge: 25%  #控制滚动更新过程中副本总数的超过期望值的上限。maxSurge 可以是具体的整数,也可以是百分百,向上取整。maxSurge 默认值为 25%,比如期望值是10,那么最大的副本数就是10+10*25%(向上取整)=13
      maxUnavailable: 1  #不可用的副本相占期望值的最大比例。 maxUnavailable 可以是具体的整数,也可以是百分百,向下取整。maxUnavailable 默认值为 25%。比如期望值是10,那么副本数至少要为10-10*25%(向下取整)=8才认为是健康。
    type: RollingUpdate  #滚动更新
  template:
    metadata:
      labels:
        app: my-nginx
    spec: #容器描述
      containers:
        - name: nginx-container
          image: nginx:1.21.4
          imagePullPolicy: IfNotPresent
          livenessProbe:
            failureThreshold: 5
            httpGet:
              path: /index.html
              port: 80
              scheme: HTTP
            initialDelaySeconds: 60
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 5
          ports:
            - containerPort: 80
              name: nginx-port
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /index.html
              port: 80
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          resources:
            limits:
              memory: 170Mi
            requests:
              cpu: 100m
              memory: 70Mi

 

#创建资源
kubectl create -f my-nginx-deploy.yaml 

#查看ReplicaSet
kubectl get replicaset -n wssnail-deploy

kubectl get  rs -n wssnail-deploy 


#查看pod
kubectl get pod -n wssnail-deploy -o wide

 

 从上可以看出3个Nginx Pod是由系统自动完成调度的。他们各自运行在那个节点上是由Scheduler经过一系列的算法计算出来的。

2、标签和选择器

给pod添加标签和修改标签
#显示标签
kubectl get pod -n wssnail-deploy --show-labels

#添加标签
kubectl label po my-nginx-deploy-c67dd47d5-54vsw  -n wssnail-deploy version=1.21.4 

#修改标签
kubectl label po my-nginx-deploy-c67dd47d5-54vsw  -n wssnail-deploy version=v2 --overwrite

 

 通过修改配置文件的方式修改label

#修改配置文件的方式修改标签
kubectl edit po my-nginx-deploy-c67dd47d5-54vsw -n wssnail-deploy

#查看
kubectl get pod -n wssnail-deploy --show-labels

 

 

 根据标签查询pod
#查询标签中app=my-nginx的pod
kubectl get pod -n wssnail-deploy -A -l app=my-nginx --show-labels

#查询标签中app=my-nginx并且version=v2的pod
kubectl get pod -n wssnail-deploy -A -l app=my-nginx,version=v2 --show-labels

#查询标签中app=my-nginx并且version=v2并且 env在(test,prd,prod)中的pod
kubectl get pod -n wssnail-deploy -A -l 'app=my-nginx,version=v2, env in(test,prd,prod)' --show-labels

# 查询标签中app不等于my-nginx并且version=v2并且 env在(test,prd,prod)中的pod
kubectl get pod -n wssnail-deploy -A -l 'app!=my-nginx,version=v2, env in(test,prd,prod)' --show-labels

 

NodeSelector的使用
#给节点打标签
kubectl label node node1 role=micro_service
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-deploy #命名空间名称
---
apiVersion: apps/v1  #版本
kind: Deployment  #类型为Deployment
metadata: #元数据
  labels:  #标签
    app: my-nginx
  name: my-nginx-deploy
  namespace: wssnail-deploy
spec: #描述
  replicas: 3 #副本数量
  revisionHistoryLimit: 10  #历史版本限制,用来回退,如果设置为0则没有回退
  selector: #选择器
    matchLabels:
      app: my-nginx
  strategy:
    rollingUpdate:  #滚动更新策略
      maxSurge: 25%  #控制滚动更新过程中副本总数的超过期望值的上限。maxSurge 可以是具体的整数,也可以是百分百,向上取整。maxSurge 默认值为 25%,比如期望值是10,那么最大的副本数就是10+10*25%(向上取整)=13
      maxUnavailable: 1  #不可用的副本相占期望值的最大比例。 maxUnavailable 可以是具体的整数,也可以是百分百,向下取整。maxUnavailable 默认值为 25%。比如期望值是10,那么副本数至少要为10-10*25%(向下取整)=8才认为是健康。
    type: RollingUpdate  #滚动更新
  template:
    metadata:
      labels:
        app: my-nginx
    spec: #容器描述
      nodeSelector: #节点选择
        role: micro_service  #通过添加标签控制到那个节点上
      containers:
        - name: nginx-container
          image: nginx:1.21.4
          imagePullPolicy: IfNotPresent
          livenessProbe:
            failureThreshold: 5
            httpGet:
              path: /index.html
              port: 80
              scheme: HTTP
            initialDelaySeconds: 60
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 5
          ports:
            - containerPort: 80
              name: nginx-port
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /index.html
              port: 80
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          resources:
            limits:
              memory: 170Mi
            requests:
              cpu: 100m
              memory: 70Mi

 

#创建资源
kubectl create -f my-nginx-deploy.yaml

#查看pod
kubectl get po -n wssnail-deploy -o wide

 可以看出所有的pod都调度到了node1节点。

3、deployment

滚动更新
apiVersion: v1  #版本号
kind: Namespace #类型为namespace
metadata: #元数据
  name: wssnail-deploy #命名空间名称
---
apiVersion: apps/v1  #版本
kind: Deployment  #类型为Deployment
metadata: #元数据
  labels:  #标签
    app: my-nginx
  name: my-nginx-deploy
  namespace: wssnail-deploy  #命名空间
spec: #描述
  replicas: 1 #副本数量
  revisionHistoryLimit: 10  #历史版本限制,用来回退,如果设置为0则没有回退
  selector: #选择器
    matchLabels: #按招标前匹配
      app: my-nginx #标签的值
  strategy:  #更新策略
    rollingUpdate:  #滚动更新策略
      maxSurge: 25%  #控制滚动更新过程中副本总数的超过期望值的上限。maxSurge 可以是具体的整数,也可以是百分百,向上取整。maxSurge 默认值为 25%,比如期望值是10,那么最大的副本数就是10+10*25%(向上取整)=13
      maxUnavailable: 1  #不可用的副本相占期望值的最大比例。 maxUnavailable 可以是具体的整数,也可以是百分百,向下取整。maxUnavailable 默认值为 25%。比如期望值是10,那么副本数至少要为10-10*25%(向下取整)=8才认为是健康。
    type: RollingUpdate  #滚动更新  可选值 Recreate 、RollingUpdate 默认为RollingUpdate
  template:  #模板信息
    metadata: #元数据
      labels: #模板标签
        app: my-nginx #标签的值
    spec: #容器描述
      terminationGracePeriodSeconds: 30 #宽限时间
      containers: #容器
        - name: nginx-container  #容器名称
          image: nginx:1.21.4  #镜像
          imagePullPolicy: IfNotPresent #拉取策略
#创建资源
kubectl create -f my-nginx-rollout-deploy.yaml

#查看deployment
kubectl get deploy -n wssnail-deploy

#查看replicaSet
kubectl get rs -n wssnail-deploy

#查看pod
kubectl get po -n wssnail-deploy


#编辑deploy配置文件,将副本数改成3
kubectl edit deploy my-nginx-deploy -n wssnail-deploy

 注意名称和个数

#修改镜像版本 nginx-container 为容器名称,--record参数已过期,加上这个参数在查询版本历史的时候显示修改的内容

kubectl set image deployment/my-nginx-deploy nginx-container=nginx:1.22.0 -n wssnail-deploy 

kubectl set image deployment/my-nginx-deploy nginx-container=nginx:1.21.4 -n wssnail-deploy --record 

#查看修改状态
kubectl rollout status deploy my-nginx-deploy -n wssnail-deploy

 查看滚动更近过程

#查看描述 
kubectl describe deploy my-nginx-deploy -n wssnail-deploy

结论:可以看到滚动更新的效果大概是是先启动新的然后再干掉老的 

回滚版本
#查看版本列表
kubectl rollout history deployment/my-nginx-deploy -n wssnail-deploy

#查看某个版本的修改内容
kubectl rollout history deployment/my-nginx-deploy -n wssnail-deploy --revision=2

#回滚到指定版本

kubectl rollout undo deployment/my-nginx-deploy -n wssnail-deploy --to-revision=3

 

扩容与缩容
#扩容,增加副本数
kubectl scale --replicas=6 deploy my-nginx-deploy -n wssnail-deploy

#缩容 减少副本数
kubectl scale --replicas=3 deploy my-nginx-deploy -n wssnail-deploy

 注意:扩容和缩容replicaSet的记录条数不会发生改变。

更新暂停与恢复
#暂停,这里暂停只是暂停template下内容的更新,其他内容修改时还是会更新
kubectl rollout pause deploy my-nginx-deploy -n wssnail-deploy

#恢复
kubectl rollout resume deploy my-nginx-deploy -n wssnail-deploy  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熟透的蜗牛

永远满怀热爱,永远热泪盈眶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值