pod
pod是一个或一组容器
每个pod里的父容器pause容器可以回收僵尸进程、可以使pod里的其他容器共享网络、
存储、PID、IPC等;
符合pod规定的CRI标准的容器,都可以被k8s管理
使用yaml创建pod
1、命令行方式创建一个nginx pod,版本号1.15.12
kubectl run nginx-run --image=nginx:1.15.12
查看pod状态
kubectl get po
NAME READY STATUS RESTARTS AGE
nginx 0/1 ContainerCreating 0 20s
查看pod IP地址
注:每创建一个pod, Endpoints Controller 将在所有的 Service 的 Endpoints
中添加此容器所在 Pod 的 IP 地址,用来访问该pod。
kubectl get po -owide
2、yaml配置文件方式创建pod
注:yaml文本格式是以空格表示层级的
生成pod.yaml文件
kubectl run nginx --image=nginx:1.15.12 -oyaml --dry-run > nginx.yaml
nginx.yaml
vim nginx.yaml
apiVersion: v1 # 必选,API 的版本号
kind: Pod # 必选,类型 Pod、Deployment、Statefulset、Service
metadata: # 必选,元数据
name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
spec: # 必选,用于定义 Pod 的详细信息
containers: # 必选,容器列表
- name: nginx # 必选,符合 RFC 1035 规范的容器名称
image: nginx:1.15.12 # 必选,容器所用的镜像的地址
ports: # 可选,容器需要暴露的端口号列表
- containerPort: 80 # 端口号
创建pod
kubectl create -f nginx.yaml
pod/nginx created
查看pod版本号
kubectl api-resources | grep pod
探针
种类 | 说明 |
---|---|
startupProbe | Kubernetes1.16 新加的探测方式,用于判断容器内的应用程序是否已经启动。如果配置了 startupProbe,就会先禁用其他探测,直到它成功为止。如果探测失败,Kubelet会杀死容器,之后根据重启策略进行处理,如果探测成功,或没有配置 startupProbe,则状态为成功,之后就不再探测。 |
livenessProbe | 用于探测容器是否在运行,如果探测失败,kubelet 会“杀死”容器并根据重启策略进行相应的处理。如果未指定该探针,将默认为 Success |
readinessProbe | 一般用于探测容器内的程序是否健康,即判断容器是否为就绪(Ready)状态。如果是,则可以处理请求,反之 Endpoints Controller 将从所有的 Service 的 Endpoints中删除此容器所在 Pod 的 IP 地址。如果未指定,将默认为 Success |
探针的实现方式
实现方式 | 说明 |
---|---|
ExecAction | 在容器内执行一个指定的命令,如果命令返回值为 0,则认为容器健康 |
TCPSocketAction | 通过 TCP 连接检查容器指定的端口,如果端口开放,则认为容器健康 |
HTTPGetAction | 对指定的 URL 进行 Get 请求,如果状态码在 200~400 之间,则认为容器健康 |
gRPC |
livenessProbe 和 readinessProbe
创建一个没有探针的 Pod:
apiVersion: v1 # 必选,API 的版本号
kind: Pod # 必选,类型 Pod
metadata: # 必选,元数据
name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
spec: # 必选,用于定义 Pod 的详细信息
containers: # 必选,容器列表
- name: nginx # 必选,符合 RFC 1035 规范的容器名称
image: nginx:1.15.12 # 必选,容器所用的镜像的地址
imagePullPolicy: IfNotPresent
command: # 可选,容器启动执行的命令
- sh
- -c
- sleep 10; nginx -g "daemon off;"
ports: # 可选,容器需要暴露的端口号列表
- containerPort: 80 # 端口号
restartPolicy: Never
配置健康检查:
apiVersion: v1 # 必选,API 的版本号
kind: Pod # 必选,类型 Pod
metadata: # 必选,元数据
name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
spec: # 必选,用于定义 Pod 的详细信息
containers: # 必选,容器列表
- name: nginx # 必选,符合 RFC 1035 规范的容器名称
image: nginx:1.15.12 # 必选,容器所用的镜像的地址
imagePullPolicy: IfNotPresent
command: # 可选,容器启动执行的命令
- sh
- -c
- sleep 180; nginx -g "daemon off;"
startupProbe:
tcpSocket: # 端口检测方式
port: 80
initialDelaySeconds: 10 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 20 # 检测间隔
successThreshold: 1 # 检查成功为 1 次表示就绪
failureThreshold: 20 # 检测失败 20 次表示未就绪
readinessProbe: # 可选,健康检查。注意三种检查方式同时只能使用一种。
httpGet: # 接口检测方式
path: /index.html # 检查路径
port: 80
scheme: HTTP # HTTP or HTTPS
#httpHeaders: # 可选, 检查的请求头
#- name: end-user
# value: Jason
initialDelaySeconds: 10 # 初始化时间, 健康检查延迟执行时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 1 # 检查成功 1 次表示就绪
failureThreshold: 2 # 检测失败 2 次表示未就绪
livenessProbe: # 可选,健康检查
tcpSocket: # 端口检测方式
port: 80
initialDelaySeconds: 10 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 1 # 检查成功 1 次表示就绪
failureThreshold: 2 # 检测失败 2 次表示未就绪
ports: # 可选,容器需要暴露的端口号列表
- containerPort: 80 # 端口号
restartPolicy: Never
livenessProbe探针会检测容器是否运行,如果容器没有运行会根据restartPolicy配置的策略重启容器;
readinessProbe探针会检测容器内的服务是否启动,如果服务没有正常运行,就不会被svc分配流量,不会处理请求;
startupProbe探针应用在容器内部服务启动时间较长的场景,startupProde探针只检测一次,可大大缩短内部服务出故障时容器的恢复时间
postStart 和 preStop
apiVersion: v1 # 必选,API 的版本号
kind: Pod # 必选,类型 Pod
metadata: # 必选,元数据
name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
spec: # 必选,用于定义 Pod 的详细信息
containers: # 必选,容器列表
- name: nginx # 必选,符合 RFC 1035 规范的容器名称
image: nginx:1.15.12 # 必选,容器所用的镜像的地址
imagePullPolicy: IfNotPresent
lifecycle:
postStart: # 容器创建完成后执行的指令, 可以是 exec httpGet TCPSocket
exec:
command:
- sh
- -c
- 'mkdir /data/'
preStop: # 容器删除前执行的命令
exec:
command:
- sh
- -c
- pkill nginx ; sleep 30 #如果程序使用spring cloud微服务框架,可以在下架某pod服务A前,将pkill nginx替换为请求Eureka某个端口(127.0.0.1:8080/shutdown-后台开发),通知Eureka A服务即将下架,并让其在下架pod前通知其他pod内的服务更新pod PID注册表,防止A服务pod PID被删除后,B服务注册表因未更新继续访问A服务导致的请求失败。注册表默认更新时间为30S。
ports: # 可选,容器需要暴露的端口号列表
- containerPort: 80 # 端口号
restartPolicy: Never
注:此处pkill nginx杀掉了此容器的主进程, sleep 30s 不会生效。
gRPC健康检查
apiVersion: v1
kind: Pod
metadata:
name: etcd-with-grpc
spec:
containers:
- name: etcd
image: registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
command: [ "/usr/local/bin/etcd", "--data-dir", "/var/lib/etcd", "--
listen-client-urls", "http://0.0.0.0:2379", "--advertise-client-urls",
"http://127.0.0.1:2379", "--log-level", "debug"]
ports:
- containerPort: 2379
livenessProbe:
grpc:
port: 2379
initialDelaySeconds: 10
补充:集群管理最小资源单位,pod可以理解为容器的封装,一个pod包含一个或多个容器,
集群启动后各组件都是以pod的方式运行
自主式pod:pod死亡后不会重启,也不会创建新pod
控制器管理的pod