k8s 中的资源

名称空间级别

工作负载型资源:Pod, ReplicaSet, Deployment, statefulSet,DaemonSet, Job, CronJob (ReplicationController v1.11版本废弃)
服务发现以及负载均衡性资源:Service,Ingress
配置与存储型资源:Volume(存储卷),CSI(容器存储接口,可扩展第三方存储卷)
特殊型存储卷:configMap(当配置中心来使用的资源类型),Secret(保存敏感数据),DownWardAPI(将外部信息输出容器)

集群级别

Namespace , Node, Role , ClusterRole ,RoleBinding ,ClusterRoleBinding

元数据型级别

HPA,PodTemplate,LimitRange

资源清单

yaml

yaml基本语法

  • 缩进只能使用空格,不适用Tab键。
  • 同级元素左对齐即可,同级元素一起缩进的空格数不影响层级
  • “#”标志 注释

    支持数据结构

  • 对象,即键值对

    1. name : hjw
    2. age : 18
    3. # 或者
    4. people : { name : hjw , age : 18}
  • 数组 ```yaml people

  • man
  • women

    或者

    peopleType: [man , women] ```

  • 纯量(sccalars):单个不可分的值

    1. # 字符串 布尔值 整数 浮点数 Null 时间 日期
    2. # !! 两个
    3. number: 1209
    4. isGood: true
    5. # null 使用~或者不写表示
    6. isNullDisplay : ~
    7. # 或者
    8. isNullDisplay :
  • 特别注意用法

    1. # TODO 字符例子

常用字段解释说明

必须使用的属性

image.png

主要对象

image.png
image.png
image.png

额外的参数选项

image.png

使用kubectl查看资源

  • 查看所有资源类型

    1. kubectl api-resources
  • 查看资源详情

    1. kubectl explain 资源属性
    2. kubectl explain 资源属性.资源子属性
    3. kubectl explain 资源属性.资源子属性.资源孙辈属性

    容器生命周期

    image.png 步骤:

  1. kubelet 接收调度指令,准备容器初始化
  2. 启动pause容器,完成Pod网络和数据卷初始化
  3. 顺序执行创建(零个或者一个或者多个)init C容器,完成初始化之后init C 死亡。
  4. init 初始未完成,Pod不会变成Ready状态,init容器端口不会在Service聚集,即不会对外提供服务, 此时Pod处于Pending状态,initializing 为true.
  5. 开始创建一个或者多个Main容器

pod状态:

  • start

允许main容器在刚运行的时候做一件事/指令/脚本

  • readiness

就绪探测;允许延迟readness 检测,readness检测成功之后,Pod 运行状态才会变成runing

  • liveness

伴随主容器生命周期,当liveness 检测主容器不可用之后,可执行删除,重启等操作

  • stop

允许main容器在结束的时候做一件事/指令/脚本

init 容器

init 容器特性

  • init container 总是运行到成功为止
  • 每个Init Container 启动成功,下一个init才能继续启动。

Kubernetes 的 restartPolicy 默认是alawys ,即init 如果启动不成功会尝试不断重启Pod ;当restartPolicy 设置为Never,则不会尝试重启。
特性扩展作用
image.png

探针

使用init 并不能伴随主程序持续进行就绪探测操作,毕竟init初始完毕,init就死亡了。
概念:由kubelet调用由容器实现的Handler容器定期执行诊断
三种类型处理程序:

类型 执行内容 执行结果
ExecAction 在容器内执行命令,命令退出返回状态码为0,则诊断成功 成功:通过诊断
失败:未通过诊断
未知:诊断失败,不采取行动
TCPSocketAction 对指定端口上的容器ip地址进行TCP检查,端口打开则成功 成功:通过诊断
失败:未通过诊断
未知:诊断失败,不采取行动
HTTPGetAction 对指定端口上的容器ip地址进行HTTP Get检查.返回值状态码200<=code<400 诊断成功 成功:通过诊断
失败:未通过诊断
未知:诊断失败,不采取行动

探测方式

  • livenessProbe

标志容器是否在运行,如果容器不提供存活探针,则默认状态为Success,如果存活探针探测失败,kubelet会杀死容器,根据重启策略执行是否重启。

  • readinessProbe

标志容器是否准备好提供服务。如果容器不提供就绪探针,则默认状态为Success。初始延迟之前的就绪状态为Failure.如果检测失败,端点控制器将从与此Pod的Service 端点中删除ip地址,即不在对外提供服务。

启动&退出动作

在容器启动前,以及容器退出后,添加一个“钩子”;

Status 有哪些情况

Status 含义
挂起(pending) Pod已被K8s接受,但有容器尚未创建,等待时间包括调度,镜像拉去时间
运行中(runnning) Pod已经背绑定到节点之上,Pod中所有容器均已被创建,至少一个运行,或者处于启动。重启状态。
成功(Succeeded) pod 中容器成功终止,不会再重启,多见Job
失败(Failed) Pod中容器都终止,且至少一个容器以非0状态或者系统终止
未知(Unknown) 无法获取Pod状态

目标

1 测试一个pod中容器共用Pause网络栈。

2 使用init Container 模拟延迟启动容器服务。

3 就绪探测&& 存活探测

get 请求尝试就绪检测

使用nginx 做容器镜像,就绪探测 http 请求访问nginx下index1.html ,来判断容器是否准备好

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: readiness-httpget-pod
  5. namespace: default
  6. spec:
  7. containers:
  8. - name: readiness-httpget-container
  9. image: nginx
  10. imagePullPolicy: IfNotPresent
  11. readinessProbe: ## 就绪探针
  12. httpGet:
  13. port: 80
  14. path: /index1.html
  15. initialDelaySeconds: 1
  16. periodSeconds: 3
  • 创建pod

    1. kubectl create -f readinessProbe-httpGet.yaml

    image.png

  • 查看详情

    1. kubectl describe pod readiness-httpget-pod

    image.png

  • 修改文件
    进入容器内部添加所需的index1.html

    1. kubectl exec readiness-httpget-pod -it -- /bin/sh
  • 状态改变

    1. kubectl get pod

    image.png

    执行命令尝试存活探针

    基于busybox .创建pod.60秒之后删除文件live。存活检测执行命令,检测live是否存在。预期结果,当live文件被删除,pod重启。

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: liveness-exec-pod
    5. namespace: default
    6. spec:
    7. containers:
    8. - name: liveness-exec
    9. image: busybox
    10. imagePullPolicy: IfNotPresent
    11. command: ["/bin/sh","-c","touch /tmp/live; sleep 60 ;rm -rf /tmp/live;sleep 3600"]
    12. livenessProbe:
    13. exec:
    14. command: ["test","e","/tmp/live"]
    15. initialDelaySeconds: 1
    16. periodSeconds: 3
  • 创建Pod

image.png

  • 持续观察Pod状态变化(一分钟左右,pod重启,因为文件不存在,存活校验失败)
    1. kubectl get pod -w
    image.png

    tcp尝试存活检测

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: liveness-tcp-pod
    5. namespace: default
    6. spec:
    7. containers:
    8. - name: liveness-tcp
    9. image: nginx
    10. imagePullPolicy: IfNotPresent
    11. livenessProbe:
    12. initialDelaySeconds: 1
    13. tcpsocket:
    14. port: 8090
    15. periodSeconds: 3

    启动,退出动作

    对于nginx的Pod .开始之前输出语句,结束之前输出语句