k8s-pod

k8s-pod学习

0.pod概念

1)PodPod是一个容器组,是k8s中最小的可部署的单元。一个Pod其中包含了最少一个应用程序容器,存储资源,一个唯一的网络IP地址,以及一些确定容器该如何运行的配置。一般一个Pod里面运行一个容器即可,k8s通过Pod来管理容器。如果一个Pod里面要运行几个容器,那么要注意容器与容器之间一定是紧耦合的。

1.pod配置文件

1)先创建一个yaml文件用来写配置,这里用配置nginx来举例。

#Step1 先创建一个nginx-demo.yaml文件
touch nginx-demo.yaml

#Step2 向nginx-demo.yamal文件中写入配置
apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-demo # Pod 的名称
  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
  namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    env: # 环境变量
     - name: JVM_OPTS # 环境变量名称
      value: '-Xms128m -Xmx128m' # 环境变量的值
    resources:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
  
  #Step3 进行文件的执行
   kubectl create -f nginx-demo.yaml

2)不出意外,nginx服务已经起来了。

# 查看Pod
kubectl get po
# 查看Pod的详细信息,在这就可以看到nginx的端口地址
kubectl get po -o wide

3)当nginx服务运行结束,那么nginx就成为了completed状态,可以使用以下命令删除已经运行结束的pod

kubectl delete pod <podname>

4)pod配置文件,参数解析,如果看不懂上文中yaml文件的配置,可以查看以下表格。

参数名类型字段说明
apiVersionStringK8S APl 的版本,可以用 kubectl api versions 命令查询
kindStringyam 文件定义的资源类型和角色
metadataObject元数据对象,下面是它的属性
metadata.nameString元数据对象的名字,比如 pod 的名字
metadata.namespaceString元数据对象的命名空间
SpecObject详细定义对象
spec.containers[]list定义 Spec 对象的容器列表
spec.containers[].nameString为列表中的某个容器定义名称
spec.containers[].imageString为列表中的某个容器定义需要的镜像名称
spec.containers[].imagePullPolicystring定义镜像拉取策略,有 AlwaysNeverIfNotPresent 三个值可选
- Always(默认):意思是每次都尝试重新拉取镜像
- Never:表示仅适用本地镜像
- IfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像。
spec.containers[].command[]list指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。
spec.containers[].args[]list指定容器启动命令参数,因为是数组可以指定多个。
spec.containers[].workingDirstring指定容器的工作目录
spec.containers[].volumeMounts[]list指定容器内部的存储卷配置
spec.containers[].volumeMounts[].namestring指定可以被容器挂载的存储卷的名称
spec.containers[].volumeMounts[].mountPathstring指定可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnlystring设置存储卷路径的读写模式,ture 或者 false,默认是读写模式
spec.containers[].ports[]list指定容器需要用到的端口列表
spec.containers[].ports[].namestring指定端口的名称
spec.containers[].ports[].containerPortstring指定容器需要监听的端口号
spec.containers[].ports[].hostPortstring指定容器所在主机需要监听的端口号,默认跟上面 containerPort 相同,注意设置了 hostPort 同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突)
spec.containers[].ports[].protocolstring指定端口协议,支持 TCPUDP,默认值为 TCP
spec.containers[].env[]list指定容器运行前需设置的环境变量列表
spec.containers[].env[].namestring指定环境变量名称
spec.containers[].env[].valuestring指定环境变量值
spec.containers[].resourcesObject指定资源限制和资源请求的值(这里开始就是设置容器的资源上限)
spec.containers[].resources.limitsObject指定设置容器运行时资源的运行上限
spec.containers[].resources.limits.cpustring指定 CPU 的限制,单位为 Core 数,将用于 docker run –cpu-shares 参数
spec.containers[].resources.limits.memorystring指定 mem 内存的限制,单位为 MIB、GiB
spec.containers[].resources.requestsObject指定容器启动和调度时的限制设置
spec.containers[].resources.requests.cpustringCPU请求,单位为core数,容器启动时初始化可用数量
spec.containers[].resources.requests.memorystring内存请求,单位为MIB、GiB,容器启动的初始化可用数量
spec.restartPolicystring定义 pod 的重启策略,可选值为 Always、OnFailure、Never,默认值为 Alway
- Always:pod一旦终止运行,则无论容器是如何终止的,kubelet 服务都将重启它。
- OnFailure:只有 pod 以非零退出码终止时,kubelet 才会重启该容器。如果容器正常结束(退出码为0),则 kubectl 将不会重启它。
- Never:Pod终止后,kubelet 将退出码报告给 master,不会重启该 pod
spec.nodeSelectorObject定义 Node 的 label 过滤标签,以 key:value 格式指定
spec.imagePullSecretsObject定义 pull 镜像时使用 secret 名称,以 name:secretkey 格式指定
spec.hostNetworkBoolean定义是否使用主机网络模式,默认值为 false。设置 true 表示使用宿主机网络,不使用 docker 网桥,同时设置了 true将无法在同一台宿主机上启动第二个副本

2.探针

探针就是容器内应用的监测机制,根据不同的探针来判断容器应用当前的状态。

探针有3种类型,分别为StartupProbeLivenessProbeReadinessProbe

1)StartupProbe探针

  • 用来判断程序是否已经启动了。

  • 当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续。

  • 由于有时候不能准确预估应用一定是多长时间启动成功,因此配置另外两种方式不方便配置初始化时长来检测,而配置了 statupProbe 后,只有在应用启动成功了,才会执行另外两种探针,可以更加方便的结合使用另外两种探针使用。

  • startupProbe:
      httpGet: # 探测方式为HTTPGetAction
        path: /api/startup
        port: 80
    

2)LivenessProbe探针

  • 用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。

  • livenessProbe:
      failureThreshold: 5
      httpGet:	# 探测方式为HTTPGetAction
        path: /health
        port: 8080
        scheme: HTTP
      initialDelaySeconds: 60	# 初始化时间	一般使用StartupProbe,因为我们无法确定一个程序多久能跑完
      periodSeconds: 10	 # 监测间隔时间
      successThreshold: 1	 # 检查 1 次成功就表示成功
      failureThreshold: 2 	# 监测失败 2 次就表示失败
      timeoutSeconds: 5	# 超时时间
    

3)ReadinessProbe探针

  • 用于探测容器内的程序是否健康,它的返回值如果返回 success,那么就认为该容器已经完全启动,并且该容器是可以接收外部流量的。

  • readinessProbe:
      failureThreshold: 3 # 错误次数
      httpGet: # 探测方式为HTTPGetAction
        path: /ready
        port: 8181
        scheme: HTTP
      periodSeconds: 10 # 间隔时间
      successThreshold: 1 # 检查 1 次成功就表示成功
      timeoutSeconds: 1 # 超时时间
    

探测方式也有3种类型分别为ExecActionTCPSocketActionHTTPGetAction

1)ExecAction探测方式

  • 在容器内部执行一个命令,如果返回值为 0,则任务容器时健康的。

  • livenessProbe:
      exec:
        command:
          - cat
          - /health
    

2)TCPSocketAction探测方式

  • 通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康。

  • livenessProbe:
      tcpSocket:
        port: 80
    

3)HTTPGetAction探测方式

  • 生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康。

  • livenessProbe:
      failureThreshold: 5
      httpGet:
        path: /health
        port: 8080
        scheme: HTTP
        httpHeaders:
          - name: xxx
            value: xxx
    

3.探针的使用

1)StartupProbe探针的使用。依旧以上文中编写nginx的为例,只需要在nginx的配置中加入StartupProbe探针的配置即可,以下为3种不同方式探测方式。

# method1 http探测方式

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    #将探针配置加在spec中
    startupProbe: #应用启动探针配置
      httpGet:  #探测方式基于HTTP请求
        path: /index.html
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间
# method2 tcp探测方式

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    #将探针配置加在spec中
    startupProbe: #应用启动探针配置
      tcpSocket:  #探测方式基于TCP请求
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间
# method3 tcp探测方式

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    #将探针配置加在spec中
    startupProbe: #应用启动探针配置
  	  exec:
      command:
         - cat
         - /health
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间

2)LivenessProbe探针的使用。依旧以上文中编写nginx的为例,只需要在nginx的配置中加入LiveNessProbe探针的配置即可,这里只介绍http的探测方式。其他的2种方式和配置StartupProbe探针大同小异。

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    startupProbe: #应用启动探针配置
      httpGet:  #探测方式基于HTTP请求
        path: /index.html
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间
	
	# 这里当nginx程序宕机了的话会重新启动
	# 这里肯定会先启动startupProbe探针,当startupProbe探针启动成功则启动livenessProbe探针。
	# 每次启动去访问/index.html接口,看niginx是否正在运行,如果连续启动3次失败,则失败。
	
    livenessProbe: #应用存活探针配置
      httpGet:  #探测方式基于HTTP请求
        path: /index.html
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间
    command: # 指定容器启动时执行的命令

3)ReadinessProbe探针的使用。依旧以上文中编写nginx的为例,只需要在nginx的配置中加入ReadiNessProbe探针的配置即可,这里只介绍http的探测方式。其他的2种方式和配置StartupProbe探针大同小异。

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    startupProbe: #应用启动探针配置
      httpGet:  #探测方式基于HTTP请求
        path: /index.html
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间
      
	# 这里当nginx程序宕机了的话会重新启动
	# 这里肯定会先启动startupProbe探针,当startupProbe探针启动成功则启动livenessProbe探针。
	# 每次启动去访问/index.html接口,看niginx是否可以接收外部访问,如果连续启动3次失败,则失败。
	
    readinessProbe: #应用就绪探针配置
      httpGet:  #探测方式基于HTTP请求
        path: /index.html
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间

4.pod的生命周期

pod的生命周期如下图所示:

  • 首先经过容器的初始化阶段,当初始化结束后会启动postStart回调函数,但是一般来说不会使用到postStart回调函数,因为该函数的主要作用是做初始化的一些操作。
  • 然后就会启动配置的Startup探针,Liveness探针,以及Readiness探针,并加载容器。
  • 最后当pod使用结束时会启动preStop回调函数,该回调函数主要做pod结束时的销毁,数据删除,注册中心下线等一系列操作。
    在这里插入图片描述

1) postStartpreStop的使用。以最初版本的nginx为例,其中主要加入terminationGracePeriodSecondspostStart、和preStop配置。

spec: # 期望 Pod 按照这里面的描述进行创建
  terminationGracePeriodSeconds: 50   #当pod被删除时,给pod50s的处理时间
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    lifecycle: #生命周期的配置
      postStart:  #生命周期启动阶段会做的事情,Pod初始化好后会往poststart.html文件中写入post star
        exec:
          command:
          - sh
          - -c
          - "echo '<h1>post start<h1>' > /usr/share/nginx/html/poststart.html"
      preStop:  #生命周期结束阶段会做的事情,Pod初始化好后会往prestop.html文件中写入post star
        exec:
          command:
          - sh
          - -c
          - sleep 9

2)如下图所示,可以看到初始化pod结束后,可以查到poststart.html中的post start。并且当删除pod时会sleep9秒。

在这里插入图片描述
在这里插入图片描述

要将正在 k8s-node1 节点上运行的名为 apache-podpod 扩容到 k8s-node2 节点,并同时在这两个节点上运行 pod,请按照以下步骤操作: 1. 创建一个 deployment,指定 pod 的副本数为 2,并使用 nodeSelector 将这两个 pod 分别调度到 k8s-node1 和 k8s-node2 节点上。可以使用以下 YAML 文件创建 deployment: ``` apiVersion: apps/v1 kind: Deployment metadata: name: apache-pod spec: replicas: 2 selector: matchLabels: app: apache-pod template: metadata: labels: app: apache-pod spec: nodeSelector: kubernetes.io/hostname: k8s-node1 containers: - name: apache-container image: httpd:latest ports: - containerPort: 80 ``` 在这个 YAML 文件中,我们使用 nodeSelector 将第一个 pod 调度到 k8s-node1 节点上,第二个 pod 调度到 k8s-node2 节点上。注意,我们在 template.spec.containers 中指定了容器的镜像和端口号,这里使用的是 httpd 镜像,端口号是 80。 2. 使用 kubectl apply 命令应用这个 YAML 文件: ``` kubectl apply -f deployment.yaml ``` 3. 使用 kubectl get pods 命令检查 pod 状态,确认这两个 pod 都在运行: ``` kubectl get pods -o wide ``` 在输出中,你会看到两个 apache-pod 的副本都在运行,其中一个在 k8s-node1 节点上,另一个在 k8s-node2 节点上。 需要注意的是,使用 nodeSelector 指定 pod 调度到特定节点上可能会降低集群的灵活性,因为这样做会使节点的资源分配不均衡。如果你的集群中有多个节点,最好使用 Kubernetes 的调度器来自动地将 pod 调度到空闲节点上。你可以使用 nodeAffinity 和 podAntiAffinity 等特性来控制 pod 的调度行为。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值