Kubernetes资源清单

内容来自尚硅谷。

操作k8s其实就是操作k8s中的各种资源,这里记录一下资源相关内容。


资源清单格式

# 如果没有给定 group 名称,那么默认为 core
apiVersion: group/apiversion
# 资源类别
kind:
# 资源元数据
metadata:
  name
  namespace
  lables
  annotations # 主要目的是方便用户阅读查找
# 期望的状态(disired state)
spec:
# 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义
status:

资源清单的常用命令

  • 获取apiVersion版本信息
    kubectl api-versions
  • 获取资源的详细信息及字段设置帮助文档
    # 以pod为例
    kubectl explain pod

    输出:

    KIND: Pod
    VERSION: v1
    DESCRIPTION:
    Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts.
    FIELDS:
    apiVersion <string>
        ........
        ........

    字段配置格式:

    apiVersion <string>
    #表示字符串类型
    metadata <Object>
    #表示需要嵌套多层字段
    labels <map[string]string>
    #表示由k:v组成的映射
    finalizers <[]string>
    #表示字串列表
    ownerReferences <[]Object>
    #表示对象列表
    hostPID <boolean>
    #布尔类型
    priority <integer>
    #整型
    name <string> -required-
    #如果类型后面接 -required-,表示为必填字段

通过定义清单文件创建Pod

创建方法

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-1
    image: nginx:latest
  - name: myapp-2
    iamge: mysql:latest
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 60"

其中apiVersion kind metadata spec字段是必须的。

一种快速创建资源的方法是使用如下命令将已有资源的配置输出:

kubectl get pod xx.xx.xx -o yaml
# 使用json可以输出为json格式

或是试运行一个容器,输出配置:

kubectl run app --image=nginx --dry-run -o yaml

Init容器

用于在主容器启动前进行初始化,比如复制敏感文件等操作。
Init容器启动是串行执行的,其中任何一个的失败都会导致Pod启动失败。
file

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

检测探针-就绪检测

readinessProbe
检测不通过的话Pod不会进入Ready状态。

apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget-pod
  namespace: default
spec:
  containers:
  - name: readiness-httpget-container
    image: nginx
    imagePullPolicy: IfNotPresent
    readinessProbe:
      httpGet:
        port: 80
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3

检测探针-存活检测

livenessProbe
检测不通过的话重启Pod。

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

对于readinessProbe和livenessProbe,有三种方式进行检测:

  1. command
    命令返回0即成功。

    # ...
    livenessProbe:
      exec:
        command: ["test","-e","/tmp/live"]
    # ...
  2. httpGet
    状态码大于等于200且小于400即成功。

    # ...
    livenessProbe:
      httpGet:
        port: http
        path: /index.html
    # ...
  3. tcpSocket
    连接成功即成功。

    # ...
    livenessProbe:
      tcpSocket:
        port: 80
    # ...

启动、退出动作

lifecycle
在容器启动的前后进行操作。

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
  lifecycle:
    postStart:
      exec:
        command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
    preStop:
      exec:
        command: ["/bin/sh", "-c", "echo Hello from the postStop handler > /usr/share/message"]