Pod基本概念

Pod是Kubernetes创建和管理的最小单元,一个Pod由一个容器 或多个容器组成,这些容器共享存储、网络。

Pod特点:

  • 一个Pod可以理解为是一个应用实例,提供服务

  • Pod中容器始终部署在一个Node上

  • Pod中容器共享网络、存储资源

  • Kubernetes直接管理Pod,而不是容器

Pod存在的意义

Pod主要用法:

  • 运行单个容器:最常见的用法,在这种情况下,可以将Pod看做是单个容器的抽象封装

  • 运行多个容器:封装多个紧密耦合且需要共享资源的应用程序

如果有这些需求,你可以运行多个容器:

  • 两个应用之间发生文件交互

  • 两个应用需要通过127.0.0.1或者socket通信

  • 两个应用需要发生频繁的调用

Pod资源共享实现机制

共享网络:将业务容器网络加入到“负责网络的容器”实现网络共享

测试验证是否共享网络:

vim pod-net.yaml

apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: web
image: nginx
- name: test
image: busybox
command: ["/bin/sh","-c","sleep 360000"]

kubectl apply -f pod-net.yaml 
kubectl exec -it my-pod -c test -- sh #进入tets容器验证是否能访问nginx
wget 127.0.0.1:80
cat index.html

共享存储:容器通过数据卷共享数据

测试验证是否共享存储:

vim pod-vol.yaml

apiVersion: v1
kind: Pod
metadata:
name: my-pod2
spec:
containers:
- name: web2
image: nginx
volumeMounts:
- name: log
mountPath: /data

- name: test2
image: busybox
command: ["/bin/sh","-c","sleep 360000"]
volumeMounts:
- name: log
mountPath: /data

volumes:
- name: log
emptyDir: {}

kubectl apply -f pod-vol.yaml 
kubectl exec -it my-pod2 -c test2 -- sh #进入test容器在/data目录下创建文件
cd /data
touch 1.txt
kubectl exec -it my-pod2 -c web2 -- bash #进入web2容器/data目录下查看是否有1.txt
cd /data
ls

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 endpoints中剔除。

  • startupProbe(启动检查):

支持以下三种检查方法:

  • httpGet:发送HTTP请求,返回200-400范围状态码为成功。

  • exec:执行Shell命令返回状态码是0为成功。

  • tcpSocket:发起TCP Socket建立成功

参考链接:https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

测试验证:

vim pod-check.yaml

apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: pod-check
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
periodSeconds: 5
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 ##启动容器后多少秒健康检查
periodSeconds: 5 ##以后间隔多少秒检查一次

kubectl apply -f pod-check.yaml
kubectl expose pod pod-check --port 80 --target-port=80
kubectl get pod -w #实时验证pod的重启次数是否增加
kubectl get endpoints -w #实时验证pod是否被service剔除
kubectl describe pod pod-check #查看pod的变化信息

示例:端口探测

apiVersion: v1
kind: Pod
metadata:
name: probe-demo
namespace: demo
spec:
containers:
- name: web
image: nginx
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30 #启动容器后多少秒健康检查
periodSeconds: 10 #以后间隔多少秒检查一次
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30 #启动容器后多少秒健康检查
periodSeconds: 10 #以后间隔多少秒检查一次

注:livenessProbe与readinessProbe配置一样。

示例:执行Shell命令

livenessProbe:
exec:
command:
- cat
- /tmp/healthy

示例:HTTP请求

livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome

环境变量

变量值几种定义方式:

  • 自定义变量值

  • 变量值从Pod属性获取

  • 变量值从Secret、ConfigMap获取

示例

vim pod-var.yaml

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: ABC
value: "123456"

kubectl apply -f pod-var.yaml 
kubectl exec -it pod-envars -- sh

验证:

Init Container

Init Container:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务。

  • 支持大部分应用容器配置,但不支持健康检查

  • 优先应用容器执行

应用场景:

  • 环境检查:例如确保应用容器依赖的服务启动后再启动应用容器

  • 初始化配置:例如给应用容器准备配置文件

示例:

部署一个web网站,网站程序没有打到镜像中,而是希望从代码 仓库中动态拉取放到应用容器中。

vim pod-init.yaml

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: {}

kubectl apply -f pod-init.yaml 
kubectl get pod
kubectl describe pod init-demo
kubectl exec -it init-demo -- bash

验证:

因此,Pod中会有这几种类型的容器:

Infrastructure Container:基础容器

维护整个Pod网络空间

InitContainers:初始化容器

先于业务容器开始执行

Containers:业务容器

并行启动