一.pod基本概念
pod是kubernetes创建和管理的最小单元。
一个pod由单个或多个容器组成,这些容器共享存储和网络
pod的特点:
- 一个pod可以理解为一个应用实例,提供服务
- pod中的容器部署在Node上
- pod中的容器共享网络和存储资源
- kubernetes直接管理pod,而不是容器
二.pod存在的意义
pod主要用法
- 运行单个容器:最常见的应用场景。在这行情况下,可以把pod看做单个容器的抽象封装
- 运行多个容器:封装多个紧密耦合且需要共享资源的应用程序
三.pod资源实现共享机制
pause容器:
pause容器全称infrastucture container(又叫infra)基础容器
每个pod里运行着一个特殊的被称为pause的容器,其他容器则为业务容器。这些业务容器共享pause容器的网络栈和Volume挂在卷,因此他们之间通信和数据交换更为高效
在设计业务架构时,可以充分利用这一特性将一组密切相关的服务进程放入同一个pod中。同一个pod里的容器之间仅需localhost就能互相通信
四.pod日常管理
创建Pod: kubectl apply -f pod.yaml 或者使用命令 kubectl run nginx --image=nginx 查看Pod: kubectl get pods kubectl describe pod <Pod名称> 查看日志: kubectl logs <Pod名称> [-c CONTAINER] kubectl logs <Pod名称> [-c CONTAINER] -f 进入容器终端: kubectl exec <Pod名称> [-c CONTAINER] -- bash 删除Pod: kubectl delete <Pod名称>
五、重启策略和健康检查,实现应用自修复
重启策略:
- Always:当容器终止退出后,总是重启容器。默认策略
- OnFailure:当容器异常退出(退出状态码非0)时,才会重启
- Never:当容器终止退出后,从不重启容器
健康检查:
livenessProbe(存活检查):如果检查失败,将杀死容器,根据pod的restartPolicy来操作
readinessProbe(就绪检查):如果检查失败,kubernetes会把pod从service endpoint中剔除(不分发流量给它)
startupProbe(启动检查)
三种检查方法:
httpGET:发送http get请求。返回200-400范围的状态码为成功
exec:执行shell命令返回状态码是0为成功(echo $?)
tcpSocket:发起tcp socket建立成功
#exec存活检查示例: apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-exec spec: containers: - name: liveness image: busybox args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 # 启动容器5秒后开始检查 periodSeconds: 5 # 间隔5秒检查一次 # describe查看event事件验证: Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 5m48s default-scheduler Successfully assigned default/liveness-exec to k8s-node1 Normal Pulled 5m31s kubelet, k8s-node1 Successfully pulled image "busybox" in 14.880201986s Normal Pulled 4m6s kubelet, k8s-node1 Successfully pulled image "busybox" in 10.527461536s Normal Created 2m34s (x3 over 5m31s) kubelet, k8s-node1 Created container liveness Normal Pulled 2m34s kubelet, k8s-node1 Successfully pulled image "busybox" in 18.074284946s Normal Started 2m33s (x3 over 5m31s) kubelet, k8s-node1 Started container liveness Normal Killing 112s (x3 over 4m47s) kubelet, k8s-node1 Container liveness failed liveness probe, will be restarted Normal Pulling 82s (x4 over 5m46s) kubelet, k8s-node1 Pulling image "busybox" Warning Unhealthy 37s (x10 over 4m57s) kubelet, k8s-node1 Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
参考文档:https://v1-17.docs.kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
六.向pod中注入环境变量
# 变量的3种定义方式:
- 自定义变量值
- 变量值从pod属性中获取
- 变量值从Secret、ConfigMap中获取
apiVersion: v1 kind: Pod metadata: name: pod-envars spec: containers: - name: test image: busybox command: [ "sh", "-c", "sleep 36000"] env: - name: MY_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: MY_POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: MY_POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: nginx value: "/usr/local/nginx/bin" # 自定义
验证:
[root@k8s-master yaml]# kubectl exec -it pod-envars -- sh
/ # echo $MY_NODE_NAME
k8s-node1
/ # echo $MY_POD_NAME
pod-envars
/ # echo $MY_POD_NAMESPACE
default
/ # echo $MY_POD_IP
10.244.36.90
/ # echo $nginx
/usr/local/nginx/bin
七.init container
init container:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务
- 支持大部分应用容器的配置,但不支持健康检查
- 优先应用容器执行
应用场景:
环境检查:确保应用容器以来的服务启动之后再启动应用容器(nginx需要等待mysql启动后,才能启动)
初始化配置:给应用容器准备配置文件(从配置中心拉取)
示例:启动一个web服务器前,从指定位置拉取最新代码(网站代码没有打包到镜像中),wget模拟
apiVersion: v1 kind: Pod metadata: name: init-demo spec: initContainers: - name: download image: busybox command: - wget - "-O" - "/opt/index.html" - http://www.ctnrs.com volumeMounts: - name: wwwroot mountPath: "/opt" containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html volumes: - name: wwwroot emptyDir: {}
总结
pod中会有这几种类型的容器
infra container:基础容器 维护整个pod网络空间
init container:初始化容器 先于业务容器运行
containers:业务容器