在Kubernetes并不直接运行容器,而是通过Pod对象的方式来运行。
Pod是Kubernetes中最小的调度和管理单位,它是由一个或多个容器组成的集合。
每个Pod都有自己的IP地址,而且Pod内的所有容器共享相同的网络命名空间和存储卷。
换句话说,Pod是一组运行在同一个节点上的容器的集合体。
Pod不是进程,而是容器运行的环境。在被删除之前,Pod会一直存在。
一、Pod资源清单详解
YAML格式的Pod定义文件的重要内容:
apiVersion: v1 # 资源对象版本号
kind: Pod # 资源对象类型
metadata: # 元数据
name: nginx-deploy # 元数据对象名称
labels: # 自定义标签
app: nginx # 自定义标签键值对
namespace: default # 命名空间,默认是default
annotations: # 自定义注解
name: mynginx # 自定义注解信息
apiVersion: v1 # 资源对象版本号
kind: Pod # 资源对象类型
metadata: # 元数据
name: nginx-deploy # 元数据对象名称
labels: # 自定义标签
app: nginx # 自定义标签键值对
namespace: default # 命名空间,默认是default
annotations: # 自定义注解
name: mynginx # 自定义注解信息
spec: # 定义对象
containers: # 定义容器列表
- name: nginx # 容器名称
image: nginx:1.22.0 # 指定容器镜像及版本
imagePullPolicy: IfNotPresent # 容器镜像拉去策略
workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
ports: # 需要暴露的端口列表
- name: http # 端口名称
containerPort: 80 # 所需暴露的端口号
protocol: TCP # 端口号的协议
volumeMounts: # 挂载到容器内部的存储卷配置
- name: data-volume # 指定可以被容器挂载的存储卷名称
mountPath: /data # 定义卷在容器内的挂载路径
readOnly: false # 设置存储卷的读写模式,true为只读模式,false是读写模式
resources:
requests: # 最少需要的资源,不满足无法运行
cpu: 100m # 要求cpu最少使用0.1个核心
memory: 64Mi # 要求memory最少使用64Mi
limits: # 最多使用的资源,超过则杀掉该容器
cpu: 200m # 限制最多使用0.2个核心
memory: 128Mi # 限制最多使用128兆
restartPolicy: OnFailure # 重启策略,Onfailure表示只有失败的情况才会重启
volumes: # 在该pod上定义的存储卷列表
- name: data-volume # 存储卷名称
emptyDir: {} # 类型为emptyDir的存储卷
说明:
1、镜像拉取策略:
- Always:表示每次都尝试重新拉取镜像,这是默认的拉取镜像策略。
- IfNotPresent:表示如果本地有该镜像,则使用本地镜像,本地不存在则拉取镜像。
- Never:表示仅用本地镜像
2、port详解
- port:port是k8s集群内部访问service的端口,即通过clusterIP: port可以访问到某个service
- nodePort:nodePort是外部访问k8s集群中service的端口,通过nodeIP: nodePort可以从外部访问到某个service。
- targetPort:targetPort是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器。
- containerPort:containerPort是pod内部容器的端口,targetPort映射到containerPort。
总结:port和nodePort都是service的端口,前者暴露给k8s集群内部服务访问,后者暴露给k8s集群外部流量访问。从这两个端口到来的数据都需要经过反向代理kube-proxy,流入后端pod的targetPort上,最后到达pod内容器的containerPort。
3、重启策略
- Always:Pod一旦终止运行,则无论容器是如何终止的,kubelet都将重启它,这是默认的重启策略
- OnFailure:有失败的情况才会重启,如果容器正常结束,则kubelet将不会重启它。
- Never:Pod终止后,kubelet不会再重启该Pod。
二、Pod基本用法
1、创建pod
可以通过kubectl create命令直接创建也可以,yaml资源清单来
说明:生产环境Pod通常不是直接创建的,而是使用工作负载资源(如deployment,statusful等)创建的。
[root@k8s-master ~]# kubectl apply -f pod.yaml
pod/nginx-deploy created
2、查看pod状态
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deploy 1/1 Running 0 4s
常见状态值
running | 运行中 |
CrashLoopBackOff | 容器退出,kubelet正在将它重启 |
Terminating | 正在终止Pod |
ImagePullBackOff | 正在重试拉取镜像 |
RegistryUnavailable | 连接不到镜像仓库 |
ErrImagePull | 拉取镜像出错 |
ContainerCreating | 容器创建中 |
Evicted | 驱赶(当节点出现异常时,kubernetes将有相应的机制驱赶该节点上的Pod.)。多见于资源不足时导致的驱赶 |
Pod的生命周期:
- pod创建
- 运行初始化容器(Init container);
- 运行主容器;
- 容器启动后钩子(post start)、容器终止前钩子(pre stop),在启动后就执行post start;
- 容器存活性检查、就绪性检测。
- pod终止过程,pod完全退出之前执行 pre stop操作。
Pod在其生命周期中只会被调度一次。一旦Pod被调度到某个节点,Pod会一直在该节点运行直到Pod停止或者被终止。
Pod是临时存在的实体。Pod被创建并被调度到节点,并在终止或删除之前一直运行在该节点。
3、查看pod的详细信息
[root@k8s-master ~]# kubectl describe pod nginx-deploy
Name: nginx-deploy
Namespace: default
Priority: 0
Service Account: default
Node: k8s-node2/10.0.0.107
Start Time: Sat, 06 Jan 2024 11:28:44 +0800
Labels: app=nginx
Annotations: cni.projectcalico.org/containerID: ba17161d21659b9dd8dd912094359c3f0a64a0c9aeaaa90d44d43b8d2d1caaa0
cni.projectcalico.org/podIP: 10.224.169.137/32
cni.projectcalico.org/podIPs: 10.224.169.137/32
name: mynginx
Status: Running
IP: 10.224.169.137
IPs:
IP: 10.224.169.137
Containers:
nginx:
Container ID: containerd://1da5d9228ac8ef2bbf0ea0f886da6ca1974d505a3c8256b9205873b112614035
Image: nginx:latest
Image ID: docker.io/library/nginx@sha256:2bdc49f2f8ae8d8dc50ed00f2ee56d00385c6f8bc8a8b320d0a294d9e3b49026
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Sat, 06 Jan 2024 11:28:45 +0800
Ready: True
Restart Count: 0
Limits:
cpu: 200m
memory: 128Mi
Requests:
cpu: 100m
memory: 64Mi
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5tw6x (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-5tw6x:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 15m default-scheduler Successfully assigned default/nginx-deploy to k8s-node2
Normal Pulled 15m kubelet Container image "nginx:latest" already present on machine
Normal Created 15m kubelet Created container nginx
Normal Started 15m kubelet Started container nginx
4、删除pod
通过yaml资源清单删除
[root@k8s-master ~]# kubectl delete -f pod.yaml
pod "nginx-deploy" deleted
有时候 Pod 的状态一直为 Terminating(终止),这个状态默认值是30秒,超时后可以强制删除Pod。
–grace-period=0 重载默认值
–force 强制删除
[root@k8s-master ~]# kubectl delete pod nginx-deploy --grace-period=0 --force
Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "nginx-deploy" force deleted
© 版权声明
本站文章由不念博客原创,未经允许严禁转载!
THE END