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键。
- 同级元素左对齐即可,同级元素一起缩进的空格数不影响层级
-
支持数据结构
对象,即键值对
name : hjw
age : 18
# 或者
people : { name : hjw , age : 18}
数组 ```yaml people
- man
women
或者
peopleType: [man , women] ```
纯量(sccalars):单个不可分的值
# 字符串 布尔值 整数 浮点数 Null 时间 日期
# !! 两个
number: 1209
isGood: true
# null 使用~或者不写表示
isNullDisplay : ~
# 或者
isNullDisplay :
特别注意用法
# TODO 字符例子
常用字段解释说明
必须使用的属性
主要对象
额外的参数选项
使用kubectl查看资源
查看所有资源类型
kubectl api-resources
查看资源详情
kubectl explain 资源属性
kubectl explain 资源属性.资源子属性
kubectl explain 资源属性.资源子属性.资源孙辈属性
容器生命周期
步骤:
- kubelet 接收调度指令,准备容器初始化
- 启动pause容器,完成Pod网络和数据卷初始化
- 顺序执行创建(零个或者一个或者多个)init C容器,完成初始化之后init C 死亡。
- init 初始未完成,Pod不会变成Ready状态,init容器端口不会在Service聚集,即不会对外提供服务, 此时Pod处于Pending状态,initializing 为true.
- 开始创建一个或者多个Main容器
pod状态:
- start
允许main容器在刚运行的时候做一件事/指令/脚本
- readiness
就绪探测;允许延迟readness 检测,readness检测成功之后,Pod 运行状态才会变成runing
- liveness
伴随主容器生命周期,当liveness 检测主容器不可用之后,可执行删除,重启等操作
- stop
init 容器
init 容器特性
- init container 总是运行到成功为止
- 每个Init Container 启动成功,下一个init才能继续启动。
Kubernetes 的 restartPolicy 默认是alawys ,即init 如果启动不成功会尝试不断重启Pod ;当restartPolicy 设置为Never,则不会尝试重启。
特性扩展作用
探针
使用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 ,来判断容器是否准备好
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: /index1.html
initialDelaySeconds: 1
periodSeconds: 3
创建pod
kubectl create -f readinessProbe-httpGet.yaml
查看详情
kubectl describe pod readiness-httpget-pod
修改文件
进入容器内部添加所需的index1.htmlkubectl exec readiness-httpget-pod -it -- /bin/sh
状态改变
kubectl get pod
执行命令尝试存活探针
基于busybox .创建pod.60秒之后删除文件live。存活检测执行命令,检测live是否存在。预期结果,当live文件被删除,pod重启。
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:
containers:
- name: liveness-exec
image: busybox
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
创建Pod
- 持续观察Pod状态变化(一分钟左右,pod重启,因为文件不存在,存活校验失败)
kubectl get pod -w
tcp尝试存活检测
apiVersion: v1
kind: Pod
metadata:
name: liveness-tcp-pod
namespace: default
spec:
containers:
- name: liveness-tcp
image: nginx
imagePullPolicy: IfNotPresent
livenessProbe:
initialDelaySeconds: 1
tcpsocket:
port: 8090
periodSeconds: 3
启动,退出动作
对于nginx的Pod .开始之前输出语句,结束之前输出语句