k8s的pod的概述和配置

概念

Pod 容器组 是一个k8s中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容器,即图上正方体),以及这些 container (容器)的一些共享资源。这些资源包括:

  • 共享存储,称为卷(Volumes),即图上紫色圆柱
  • 网络,每个 Pod(容器组)在集群中有个唯一的 IP,pod(容器组)中的 container(容器)共享该IP地址
  • container(容器)的基本信息,例如容器的镜像版本,对外暴露的端口等

例如,Pod可能既包含带有Node.js应用程序的 container 容器,也包含另一个非 Node.js 的 container 容器,用于提供 Node.js webserver 要发布的数据。Pod中的容器共享 IP 地址和端口空间(同一 Pod 中的不同 container 端口不能相互冲突),始终位于同一位置并共同调度,并在同一节点上的共享上下文中运行。(同一个Pod内的容器可以使用 localhost + 端口号互相访问)。

Pod(容器组)是 k8s 集群上的最基本的单元。当我们在 k8s 上创建 Deployment 时,会在集群上创建包含容器的 Pod (而不是直接创建容器)。每个Pod都与运行它的 worker 节点(Node)绑定,并保持在那里直到终止或被删除。如果节点(Node)发生故障,则会在群集中的其他可用节点(Node)上运行相同的 Pod(从同样的镜像创建 Container,使用同样的配置,IP 地址不同,Pod 名字不同)。

复制代码
注意:

Pod 是一组容器(可包含一个或多个应用程序容器),以及共享存储(卷 Volumes)、IP 地址和有关如何运行容器的信息。

如果多个容器紧密耦合并且需要共享磁盘等资源,则他们应该被部署在同一个Pod(容器组)中。

每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类:

  • 用户程序所在的容器,数量可多可少
  • Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:
    • 可以以它为依据,评估整个Pod的健康状态
    • 可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现Pod内部的网路通信

pod的定义

复制代码
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,资源类型,例如 Pod
metadata: #必选,元数据
name: string #必选,Pod名称
namespace: string #Pod所属的命名空间,默认为"default"
labels: #自定义标签列表
- name: string
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表
- name: string #必选,容器名称
image: string #必选,容器的镜像名称
imagePullPolicy: [ Always|Never|IfNotPresent ] #获取镜像的策略
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口的名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存请求,容器启动的初始可用数量
lifecycle: #生命周期钩子
postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要制定的命令或脚本
httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一
次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure] #Pod的重启策略
nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上
nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机
网络
volumes: #在该pod上定义共享存储卷列表
- name: string #共享存储卷名称 (volumes类型有很多种)
emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string #Pod所在宿主机的目录,将被用于同期中mount的目录
secret: #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string

配置

基本配置

创建nginxpod.yaml,写入

复制代码
apiVersion: v1
kind: Namespace
metadata:
  name: dev

---

apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
  namespace: dev
spec:
  containers:
  - name: nginx-containers
    image: nginx:1.17.1

镜像拉取

在nginxpod.yaml添加

复制代码
apiVersion: v1
kind: Namespace
metadata:
  name: dev

---

apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
  namespace: dev
spec:
  containers:
  - name: nginx-containers
    image: nginx:1.17.1
    imagePullPolicy: Always  #设置镜像拉取策略为always
  • imagePullPolicy,用于设置镜像拉取策略,kubernetes支持配置三种拉取策略:
  • Always:总是从远程仓库拉取镜像(一直远程下载)
  • IfNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像(本地有就本地 本地没
  • 远程下载)
  • Never:只使用本地镜像,从不去远程仓库拉取,本地没有就报错 (一直使用本地)

注意:
如果镜像tag为具体版本号, 默认策略是:IfNotPresent
如果镜像tag为:latest(最终版本) ,默认策略是always

复制代码
[root@k8s-master01 nginx]# kubectl delete -f nginxpod.yaml #先删除
namespace "dev" deleted
pod "nginxpod" deleted
[root@k8s-master01 nginx]# kubectl create -f nginxpod.yaml #再创建
namespace/dev created
pod/nginxpod created

[root@k8s-master01 nginx]# kubectl describe pod nginxpod -n dev  #查看创建pod详情
Name:             nginxpod
Namespace:        dev
Priority:         0
Service Account:  default
Node:             k8s-worker02/192.168.234.14
Start Time:       Sun, 23 Mar 2025 21:34:57 +0800
Labels:           <none>
Annotations:      cni.projectcalico.org/containerID: b3e8244aebfa692ac22dfc5a2bb                                                                                     e17931600f1253537454a521adb4da7d547dd
                  cni.projectcalico.org/podIP: 100.73.45.88/32
                  cni.projectcalico.org/podIPs: 100.73.45.88/32
Status:           Running
IP:               100.73.45.88
IPs:
  IP:  100.73.45.88
Containers:
  nginx-containers:
    Container ID:   docker://f24c8c0bff883217f8730d42669a47acbc8800a1e8ca44738b4                                                                                     fb285eb2a5f4a
    Image:          nginx:1.17.1
    Image ID:       docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b751                                                                                     0c77ae70cfba567af1376a573a967c03dbb
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sun, 23 Mar 2025 21:35:01 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dn4zd (                                                                                     ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       True
  ContainersReady             True
  PodScheduled                True
Volumes:
  kube-api-access-dn4zd:
    Type:                    Projected (a volume that contains injected data fro                                                                                     m multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists fo                                                                                     r 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists                                                                                      for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  50s   default-scheduler  Successfully assigned dev/nginxpod                                                                                      to k8s-worker02
  Normal  Pulling    22m   kubelet            Pulling image "nginx:1.17.1"
  Normal  Pulled     22m   kubelet            Successfully pulled image "nginx:1                                                                                     .17.1" in 2.636s (2.636s including waiting). Image size: 109357455 bytes.
  Normal  Created    22m   kubelet            Created container nginx-containers
  Normal  Started    22m   kubelet            Started container nginx-containers

端口设置

复制代码
[root@k8s-master01 nginx]# kubectl explain pod.spec.containers.ports
KIND: Pod
VERSION: v1
RESOURCE: ports <[]Object>
FIELDS:
name <string> # 端口名称,如果指定,必须保证name在pod中是唯一的
containerPort<integer> # 容器要监听的端口(0<x<65536)
hostPort <integer> # 容器要在主机上公开的端口,如果设置,主机上只能运行容器的一个副
本(一般省略)
hostIP <string> # 要将外部端口绑定到的主机IP(一般省略)
protocol <string> # 端口协议。必须是UDP、TCP或SCTP。默认为"TCP"

创建 pod-ports.yam

复制代码
apiVersion: v1
kind: Pod
metadata:
 name: pod-ports
 namespace: dev
spec:
 containers:
 - name: nginx
   image: nginx:1.17.1
   ports: # 设置容器暴露的端口列表
   - name: nginx-port
     containerPort: 80
     protocol: TCP

资源配额

容器中的程序要运行,肯定是要占用一定资源的,比如 cpu 和内存等,如果不对某个容器的资源做限
制,那么它就可能吃掉大量资源,导致其它容器无法运行。针对这种情况, kubernetes 提供了对内存和
cpu 的资源进行配额的机制,这种机制主要通过 resources 选项实现,他有两个子选项:
limits :用于限制运行时容器的最大占用资源,当容器占用资源超过 limits 时会被终止,并进行重启
requests :用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动
可以通过上面两个选项设置资源的上下限。
创建 pod-resources.yaml

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-resources
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    resources:
      limits:
        cpu: "2"
        memory: "2Gi"   # 调整后的内存限制
      requests:
        cpu: "1"
        memory: "10Mi" # 调整后的内存请求
  • cpu:core数,可以为整数或小数 memory:

  • 内存大小,可以使用Gi、Mi、G、M等形式

    运行Pod

    [root@master ~]# kubectl create -f pod-resources.yaml
    pod/pod-resources created

    查看发现pod运行正常

    [root@master ~]# kubectl get pod pod-resources -n dev
    NAME READY STATUS RESTARTS AGE
    pod-resources 1/1 Running 0 39s

    接下来,停止Pod

    [root@master ~]# kubectl delete -f pod-resources.yaml
    pod "pod-resources" deleted

    编辑pod,修改resources.requests.memory的值为10Gi

    [root@master ~]# vim pod-resources.yaml

    再次启动pod

    [root@master ~]# kubectl create -f pod-resources.yaml
    pod/pod-resources created

    查看Pod状态,发现Pod启动失败

    [root@master ~]# kubectl get pod pod-resources -n dev -o wide
    NAME READY STATUS RESTARTS AGE
    pod-resources 0/2 Pending 0 20s

    查看pod详情会发现,如下提示

    [root@master ~]# kubectl describe pod pod-resources -n dev
    ......
    Warning FailedScheduling <unknown> default-scheduler 0/2 nodes are
    available: 2 Insufficient memory.(内存不足)

相关推荐
陌上阳光5 小时前
docker搭建ray集群
docker·容器·ray
这就是佬们吗5 小时前
初识 docker [上]
java·开发语言·笔记·docker·容器
FJW0208146 小时前
负载均衡集群HAproxy
linux·服务器·云原生·负载均衡
BigBigHang6 小时前
【docker】DM8达梦数据库的docker-compose以及一些启动踩坑
数据库·docker·容器
云道轩6 小时前
使用Docker在Rocky Linux 9.5上在线部署LangFlow
linux·人工智能·docker·容器·langflow
伟大的大威6 小时前
Docker 部署 Supabase并连接
运维·docker·容器
杰克逊的日记7 小时前
k8s的csi对接GPFS
云原生·容器·kubernetes·存储·gpfs
岚天start7 小时前
云服务器以域名形式访问机房Kubernetes集群服务之解决方案
nginx·docker·kubernetes·kubesphere·解决方案·云服务器·机房
容器魔方11 小时前
「中科类脑」正式加入 Karmada 用户组!携手社区共建多集群生态
云原生·容器·云计算
终端行者11 小时前
k8s之ingress定义https访问方式
容器·https·kubernetes