Kubernetes-Pod控制器

发布于 2021-08-04  150 次阅读


学会灵活运用 kubectl

kubectl explain RESOURCE [options]
Use "kubectl api-resources" for a complete list of supported resources. #列出可用的资源清单

Pod资源

  • 编写Pod的资源清单:pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  - name: busybox
    image: busybox
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600"

Pod控制器

帮助:kubectl explain pod

清单:

一级:apiVersion,kind,metadata,spec,status

下面将讲述常用的例子

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    - name: https
      containerPort: 443
  - name: busybox
    image: busybox
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600"

pods.spec.containers

args字段=docker镜像中的CMD,若未定义,则docker镜像中的CMD作为参数传给args


command字段=docker镜像中的entrypoint,若未定义,则docker镜像中的entrypoint作为参数传给args


标签

标签过滤器

kubectl get pods -l

例:

kubectl get pods -l app (带有app标签的显示出来)

给pod打标签

kubectl label pods pod-demo release=canary

标签选择器

1.等值关系: = , ==, !=

例: kubectl get pods -l release=stable,app=myapp (将标签带有stable和myapp的显示出来)

2. 集合关系:

KEY in (VALUE1,VALUE2 ...)
KEY noin (VALUE1,VALUE2...)
KEY
!KEY
例:kubectl get pods -l "release in (canary,beta,alpha)"
kubectl get pods -l "release notin (canary,beta,alpha)"

许多资源支持内嵌的字段定义其使用的标签选择器:

      matchLabels: 直接给定键值
      matchExpressions: 基于给定的表达式来定义使用标签选择器,{key:"KEY",operator:"OPERATOR",values:[VAL1]....}
          操作符:
             In,NotIn: values字段的值必须非空列表
             Exists,NotExists: values字段的值必须为空列表

节点标签选择器

nodeSelector <map[string]string>

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports: 
    - name: http
      containerPort: 80
    - name: https
      containerPort: 443
  - name: busybox
    image: busybox
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600"
  nodeSelector:
    disktype: ssd

创建在带有node标签有disktype=ssd上

nodeName <string> #运行在指定节点

annotations:

与label不同的地方在于,它不能用于挑选资源对象,仅用于为对象提供"元数据"。

Pod容器生命周期

Status状态

pending

Pod已被K8S系统接受,但有一个或多个容器镜像尚未创建。等待时间包括调度Pod的时间和下载时间

Running

该Pod已经绑定到了一个节点上,Pod中所有的容器都创建。至少有一个容器正在运行,或者正处于启动或

重启状态

Succeeded

Pod中所有的容器都被成功终止,并且不会再重启

Failed

Pod中的所有容器都被成功终止,并且至少有一个容器是因为失败终止。也就是,容器非0状态退出

或被系统终止

unknown

因为某些原因无法取得Pod的状态,通常是因为与Pod所在主机通信失败

创建Pod:

Pod生命周期中的重要行为:

初始化容器

重启策略

restartPolicy:

Always, OnFailure,Never,default to always

探测

容器检测:

Readness:就绪检测

liveness:生存检测

lifecycle:生命周期

探针

由kubelet对容器执行的定期诊断。要执行诊断,kubelet调用由容器实现的Handler。有三种类型的处理程序:

ExecAction:在容器内执行指定命令。如果命令退出时返回码为0则认为诊断成功

TCPSocketAction:对指定端口上的容器的IP地址进行TCP检查。如果端口打开,则诊断被认为是成功的。

HTTPGetAction:对指定的端口和路径上的容器的IP地址执行HTTPGet请求。如果响应的状态码大于等于200

且小于400,则诊断被认为是成功的

每次探测都将获得以下三种结果之一:

成功

失败

未知

例子: kubectl create -f liveness-exec.yaml

---
apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec-pod
  namespace: default
spec:
  containers:
  - name: liveness-exec-container
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","touch /tmp/healthy;sleep 30;rm /tmp/healthy -f;sleep 3600"]
    livenessProbe:
      exec:
        command: ["test","-e","/tmp/healthy"]
      initialDelaySeconds: 1
      periodSeconds: 3