Kubernetes Pod概念详解

Pods概念

Pod是K8S集群调度的最小单元

  • Pod分别包含:基础容器、初始化容器、业务容器

命令行操作

获取master组件

kubectl get cs
kubectl get cs -o wide

查看worker组件

kubectl get no
kubectl get no -o wide

查看k8s内置的资源

kubectl api-resources

查看pod列表及其详细信息

kubectl get po
kubectl get po -o wide

删除pod

kubectl delete po <pod_name>
kubectl delete po --all

创建pod

kubectl run xiuxian --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
kubectl set image po xiuxian xiuxian=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2

查看pod资源状态

kubectl describe pod xiuxian

报错故障排查

使用命令 kubectl describe pod xiuxian 查看错误信息,然后进入对应的容器中排查。

如上所示,根据报错信息,发现kubelet说’Failed to pull image’(拉取镜像失败)。

解决方案:

  1. 检查镜像是否合法,比如镜像写错可能会导致这个错误,远程仓库压根就不存在该镜像;
  2. 如果镜像是正确的,可能是你的虚拟机无法联网,导致下载失败;
  3. 可能是权限错误,说白了,这个镜像可能是私有仓库,需要登录后才能下载;

书写资源清单

vim 01-pods-xiuxian.yaml
# 指定资源的版本
apiVersion: v1
# 指定资源的类型
kind: Pod
# 指定资源的元数据
metadata:
  # 指定资源的名称
  name: xixi
# 期望资源的运行状态
spec:
  # 定义运行的容器信息
  containers:
    # 容器的名称
  - name: c1
    # 指定容器的镜像
    image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1

启动和删除资源

kubectl apply -f 01-pods-xiuxian.yaml
kubectl delete -f 01-pods-xiuxian.yaml

容器的三种状态

容器有三种状态,分别对应为:Waiting,Running,Terminating。

  • Running:表示容器处于正常运行状态。
  • Terminating:表示容器处于终止状态,一般情况下在删除时才会出现。
  • Waiting:表示既没有Running,也没有Terminating,属于一种等待状态,比如容器无法正常启动,或者正在拉取镜像。

案例:端口冲突问题

基础架构为c1和c2同时提供网络名称空间,但是80端口仅有一个,因此c2无法启动成功!

[root@master231 pods]# cat 02-pods-multiple-xiuxian.yaml
apiVersion: v1
kind: Pod
metadata:
  name: haha
spec:
  containers:
  - name: c1
    image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
  - name: c2
    image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2

此时用 kubectl describe pod haha 查看到c2的状态会变成waiting,容器被终止。

当查看Pod状态时,有CrashLoopBackOff关键字时,说明该Pod内有容器正在重启。

此时我们去该服务对应的worker节点查看docker的运行状态:

  • A. 虽然我们写了2个容器c1和c2,但是去对应的worker233节点发现有三个容器。
  • B. c1容器正常运行Up,c2容器Exited。
  • C. 还有一个基础架构容器,为Pod提供名称空间(ipc,net,time,user)。

此时进行删除操作:

  • 删除业务容器时,发现会自动重启,且IP地址并不会发生变化。
  • 删除基础架构容器后,业务容器也会重启,IP地址会发生变化。所以c1和c2都共享网络,80端口冲突导致c2无法启动。

所以进行改进:

[root@master231 pods]# cat 03-pods-multiple-xiuxian-command.yaml
apiVersion: v1
kind: Pod
metadata:
  name: hehe
spec:
  containers:
  - name: c1
    image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
  - name: c2
    image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
    # 修改容器的启动命令,相当于替换了Dockerfile的ENTRYPOINT指令。
    command: ["sleep","360d"]   # 睡觉了,先启动

再去连接指定容器修改配置文件的端口信息:

[root@master231 pods]# kubectl exec hehe -c c2 -it -- sh

nginx -t  # 发现在 include /etc/nginx/conf.d/*.conf; 当中
sed -i '/listen/s#80#81#' /etc/nginx/conf.d/default.conf
grep listen /etc/nginx/conf.d/default.conf
nginx  # 直接输入nginx可以重新启动容器

响应式pod标签书写

命令行操作

查看标签:

kubectl get po --show-labels
kubectl get po --show-labels -o wide

直接打标签:

kubectl label pod hehe app=v1
kubectl label pod hehe app=v2 --overwrite

删除标签:

kubectl label pod hehe app-

基于标签的过滤:

kubectl get pods -o wide --show-labels -l app=v2

基于标签删除pod:

kubectl delete pods -l app=v2

标签的资源清单

在基础的资源清单上,然后在metadata行下面增加labels:

[root@master231 pods]# cat 04-pods-labels.yaml
apiVersion: v1
kind: Pod
metadata:
  name: xixi
  # 为Pod添加标签
  labels:
    apps: v1
spec:
  containers:
  - name: c1
    image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
---
apiVersion: v1
kind: Pod
metadata:
  name: haha
  labels:
    apps: v2
spec:
  containers:
  - name: c1
    image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1

Pod三种重启策略

指定Pod的重启策略,有效值为:Always, OnFailure, Never

  • Always:当Pod内的容器退出时,始终重启容器。发现30s后重启。
  • Never:当Pod内的容器退出时,始终不重启容器。发现30s后不重启。
  • OnFailure:当容器异常退出时,则会重启容器(比如把该docker进程杀死)。如果正常退出会显示complete,则不会重启容器。

回顾:Docker中ENTRYPOINT和CMD的区别

ENTRYPOINT 和 CMD 都是用于指定容器启动时运行的命令

  • 当没有显式地提供docker run命令时,ENTRYPOINT将被自动执行。
  • 如果提供了CMD,则这些命令会被作为ENTRYPOINT的参数传递;如果没有提供CMD,ENTRYPOINT通常期望接收一些参数。
  • 示例ENTRYPOINT ["myapp", "-c"] 表示容器启动时运行"myapp"并传入"-c"参数。

什么是Pod,什么是容器

  • k8s资源清单当中:如果指定了kind是Pod,那么这个就用来定义pod的。
  • 一个pod中可以有多个容器:pod启动时,里面所有的容器都会启动,停止时容器全部停止。
  • Pod是Kubernetes的基本工作单元:每个Pod包含一个或多个紧密相关的容器,这些容器共享存储、网络和命名空间等资源。
  • 容器是应用程序的运行实例:容器是轻量级、可执行的软件包,包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐