工作负载Pod
认识Pod
Pod的基本概念
定义: Pod是Kubernetes中最小的部署单元,是一个或多个紧密关联容器的组合。
调度: Pod作为一个整体被调度到Kubernetes集群中的节点上。
生命周期: Pod的生命周期由包含的容器的生命周期决定。
Pod中的容器
容器定义: Pod中的容器通过Pod的容器列表定义,这些容器可以共享相同的网络和存储。
共享资源: 容器共享相同的网络命名空间,可以通过localhost进行通信。它们也可以访问共享的存储卷。
Pod的网络模型
共享网络: 所有Pod中的容器共享同一个IP地址和端口空间,它们可以使用localhost进行直接通信。
Service: Pod可以通过Service抽象进行访问,Service提供了负载均衡和服务发现的功能。
Pod的状态
Pending: Pod正在等待调度到某个节点上。
Running: Pod中的至少一个容器正在运行。
Succeeded: Pod中的所有容器已成功运行完成。
Failed: Pod中的至少一个容器已经以非正常状态退出。
Unknown: Pod的状态无法确定。
Pod的创建和管理
Pod定义文件: 使用YAML文件定义Pod的配置,包括容器规范、环境变量、资源限制等。
通过yaml 文件定义pod:
pod-nginx-simple.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nignx-simple
spec:
containers:
- name: pod-nignx-simple
image: nginx:1.14.2
ports:
- containerPort: 80
按照文件创建资源:
kubectl apply
命令用于根据 YAML 或 JSON 文件创建或更新资源配置。
kubectl apply -f filename
kubectl命令: 使用kubectl命令行工具创建、删除、管理Pod。
代码语言:javascript复制## 直接运行一个nginx pod
kubectl run pod-kubectl --image=nginx:latest
## 查看pod 列表
kubectl get pod
## 查看更多信息的列表
kubectl get pod -owide
# 查看pod具体信息
kubectl describe pod podname
#进入容器
kubectl exec -it podname -- /bin/bash
# 删除容器
kubectl delete pod podname
ReplicaSets和Deployments: 通过ReplicaSets和Deployments来管理Pod的复制和更新。
多容器Pod
定义: 一个Pod可以包含多个容器,这些容器共享相同的网络和存储。
使用场景: 多容器Pod适用于需要协同工作的应用,例如日志收集、辅助任务等。
Pod配置
配置Pod 镜像拉取策略
spec.containers[].imagePullPolicy: IfNotPresent
:
Always(重新下载镜像)| Never(仅使用本地) | IfNotPresent(优先使用本地)
资源申请
当你为 Pod 中的 Container 指定了资源 request(请求) 时, kube-scheduler 就利用该信息决定将 Pod 调度到哪个节点上。
当你为 Container 指定了资源 limit(限制) 时,kubelet 就可以确保运行的容器不会使用超出所设限制的资源。 kubelet 还会为容器预留所 request(请求) 数量的系统资源,供其使用。
单位:CPU(0.1/100m) Memory(100Ei、100Pi、100Ti、100Gi、100Mi、100Ki)
配置:
spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory
生命周期事件回调
- postStart: Kubernetes 在容器创建后立即发送 postStart 事件。 然而,postStart 处理函数的调用不保证早于容器的入口点(entrypoint) 的执行
- preStop: Kubernetes 在容器结束前立即发送 preStop 事件(terminating),如果preStop被阻塞,那外界将会一直等待该事件结束,除非 Pod 宽限期限超时(terminationGracePeriodSeconds=30)
定义Pod:postStart回调后 输出“postStart”到k8s.txt,preStop回调后 输出“preStop”到k8s.txt
代码语言:javascript复制apiVersion: v1
kind: Pod
metadata:
name: pod-nignx-simple-lifecycle
spec:
containers:
- name: pod-nignx-simple-lifecycle
image: nginx:1.14.2
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo postStart > /k8s.txt"]
preStop:
exec:
command: ["/bin/sh","-c","echo preStop >> /k8s.txt;sleep 3600;"]
ports:
- containerPort: 80
为Pod加上启动、就绪、存活探针
定义
- 存活探针:k8s通过存活探针来确定什么时候要重启容器。
- 就绪探针:k8s通过就绪探针来判断是否要给流量
- 启动探针:k8s通过启动探针来了解应用容器何时启动,如果配置了这类探针,那么在这个探针成功之前就不会触发存活和就绪探针,防止程序被频繁kill
存活探针:
- exec模式
代码语言:javascript复制容器启动时创建healthy文件,休眠30秒,删除healthy文件,休眠3000秒 存活探针延时5秒调用,后面每隔5秒调用一次,验证存活
apiVersion: v1
kind: Pod
metadata:
name: pod-nginx-simple-liveness-exec
spec:
containers:
- name: pod-nginx-simple-liveness-exec
image: nginx:1.14.2
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- touch /healthy; sleep 30; rm -f /healthy; sleep 3000
livenessProbe:
exec:
command:
- cat
- /healthy
initialDelaySeconds: 5
periodSeconds: 5
观察探针情况:
代码语言:javascript复制kubectl describe pod pod-nginx-simple-liveness-exec
- http模式
apiVersion: v1
kind: Pod
metadata:
name: pod-nginx-simple-liveness-http
spec:
containers:
- name: pod-nginx-simple-liveness-http
image: nginx:1.14.2
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /index.html
port: 80
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
sProbe: httpGet: path: /index.html port: 80 httpHeaders: - name: Custom-Header value: Awesome initialDelaySeconds: 3 periodSeconds: 3