k8s学习笔记5——Pod资源对象文件

一. 最基础的Pod资源对象文件

# vim myweb.yaml

---                  # yaml文件起始标志
kind: Pod
apiVersion: v1
metadata:           # 特性描述specification
  name: myweb
spec:    
  containers:
  - name: webserver
    image: myos:nginx
status: {}            # 资源状态,运行后自动生成(一般不写这行)
  • 资源文件参数使用 "." 分割层级结构关系,如下
  • 一级,例如 .spec
  • 二级,例如 .spec.containers
  • 三级,例如 .spec.containers.name
# 查询帮助信息
kubectl explain Pod.spec.containers

 

二. Pod的资源清单

 1 apiVersion: v1             #必选,版本号,例如v1
 2 kind: Pod                 #必选,资源类型,例如 Pod
 3 metadata:                 #必选,元数据
 4   name: string             #必选,Pod名称
 5 annotations:               #选做,描述信息
 6   nginx: nginx
 7   namespace: string        #Pod所属的命名空间,默认为"default"
 8   labels:                #自定义标签列表
 9     - name: string                 
10 spec:                      #必选,Pod中容器的详细定义
11   containers:              #必选,Pod中容器列表
12   - name: string           #必选,容器名称
13     image: string          #必选,容器的镜像名称
14     imagePullPolicy: [ Always|Never|IfNotPresent ]   #获取镜像的策略 
15     command: [string]      #容器的启动命令列表,如不指定,使用打包时使用的启动命令
16     args: [string]         #容器的启动命令参数列表
17     workingDir: string     #容器的工作目录
18     volumeMounts:          #挂载到容器内部的存储卷配置
19     - name: string         #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
20       mountPath: string    #存储卷在容器内mount的绝对路径,应少于512字符
21       readOnly: boolean    #是否为只读模式
22     ports: #需要暴露的端口库号列表
23     - name: string         #端口的名称
24       containerPort: 80    #容器需要监听的端口号
25       hostPort: int        #容器所在主机需要监听的端口号,默认与Container相同
26       protocol: string     #端口协议,支持TCP和UDP,默认TCP
27     env:                   #容器运行前需设置的环境变量列表
28     - name: string         #环境变量名称
29       value: string        #环境变量的值
30     resources:             #资源限制和请求的设置
31       limits:              #资源限制的设置(上限)
32         cpu: string        #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
33         memory: string     #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
34       requests:            #资源请求的设置(下限)
35         cpu: string        #Cpu请求,容器启动的初始可用数量
36         memory: string     #内存请求,容器启动的初始可用数量
37     lifecycle:             #生命周期钩子
38     postStart:             #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
39     preStop:               #容器终止前执行此钩子,无论结果如何,容器都会终止
40     livenessProbe:         #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
41       exec:               #对Pod容器内检查方式设置为exec方式
42         command: [string]  #exec方式需要制定的命令或脚本
43       httpGet:             #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
44         path: string
45         port: number
46         host: string
47         scheme: string
48         HttpHeaders:
49         - name: string
50           value: string
51       tcpSocket:                    #对Pod内个容器健康检查方式设置为tcpSocket方式
52          port: number
53        initialDelaySeconds: 0       #容器启动完成后首次探测的时间,单位为秒
54        timeoutSeconds: 0          #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
55        periodSeconds: 0           #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
56        successThreshold: 0
57        failureThreshold: 0
58        securityContext:
59          privileged: false
60   restartPolicy: [Always | Never | OnFailure]  #Pod的重启策略
61   nodeName: <string>      #设置NodeName表示将该Pod调度到指定到名称的node节点上
62   nodeSelector: obeject   #设置NodeSelector表示将该Pod调度到包含这个label的node上
63   imagePullSecrets:       #Pull镜像时使用的secret名称,以key:secretkey格式指定
64   - name: string
65   hostNetwork: false      #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
66   volumes:                #在该pod上定义共享存储卷列表
67   - name: string          #共享存储卷名称 (volumes类型有很多种)
68     emptyDir: {}          #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
69     hostPath: string      #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
70       path: string                #Pod所在宿主机的目录,将被用于同期中mount的目录
71     secret:            #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
72       scretname: string  
73       items:     
74       - key: string
75         path: string
76     configMap:             #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
77       name: string
78       items:
79       - key: string
80         path: string

 

三. --dry-run 

kubectl的命令行的参数,用于模拟执行命令而不实际修改集群资源。该参数有以下3种模式

  • none :默认模式,命令正常执行并修改集群资源
  • client :仅打印对象配置,不发送请求到服务器
  • server :发送请求到服务器但不实际创建/修改资源

典型用途

  1. 验证配置 :通过 --dry-run=client 生成资源的yaml模版,避免手动编写错误
  2. 安全检查 :使用 --dry-run=server 测试命令对集群的影响,避免误操作
  3. 学习参考 :结合 -o yaml 输出参数的实际值,辅助理解命令执行结果

 

四. Pod自定义命令

  • 创建Pod时,启动时要执行的自定义命令,若配置了自定义命令,那镜像中自带的默认命令就不再执行
[root@master ~]# vim myweb.yml
---                  
kind: Pod             
apiVersion: v1        
metadata:  # 属性信息,元数据,包括名字和其他标识符等。这些信息对于识别和管理Pod很有用
  name: myweb         
spec:                 # 资源的特性描述(规约),定义Pod具体行为的部分
  containers: 
  - name: webserver
    image: myos:nginx 
    command: ["/bin/bash"]
    args:
    - -c                # 从字符串中读取命令
    - |                 # 以下多行字符串保留原格式,脚本指令,注意缩进对齐
        while sleep 5;do
            echo "hello world"
        done

 

五. restartPolicy 保护策略

  • Pod会根据策略决定容器结束后是否重启
  • Always | Never | OnFailure
[root@master ~]# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: mycmd
spec:
  restartPolicy: Never # 配置保护策略
  containers:
  - name: linux
    image: myos:8.5
    command: ["sleep"]
    args: ["30"]

 

六. terminationGracePeriodSeconds 宽限期策略

  • 是k8s中的Pod生命周期策略之一,当容器运行完自己的任务后,会等待一段时间然后优雅退出
  • 宽限期是为避免服务突然中断,造成事物不一致的问题
  • 默认30s,不等待 0s
[root@master ~]# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: mycmd
spec:
  terminationGracePeriodSeconds:0 # 设置宽限期
  restartPolicy: Never
  containers:
  - name: linux
    image: myos:8.5
    command: ["sleep"]
    args: ["30"]

 

七. activeDeadlineSeconds 策略

  • 是k8s中的Pod生命周期策略之一
  • 允许Pod运行的最大时长
  • 若一个Pod的内部程序在运行时出现循环死锁,那么就会不停的重复执行,为避免循环死锁,该时间到后,强制关闭,并设置Error状态
[root@master ~]# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: mycmd
spec:
  terminationGracePeriodSeconds: 0
  activeDeadlineSeconds: 60 # 可以执行的最大时长
  restartPolicy: Never
  containers:
  - name: linux
    image: myos:8.5
    command: ["sleep"]
    args: ["300"]

 

八. 多容器Pod

  • 受影响的命令:[ log , exec , cp ]
  • 需要以上命令后加 -c 容器名
  • 注意:如果启动多容器,也根据提供的配置文件,没有明确指定每个容器的端口信息,那就需要在一个Pod中,每个容器需要使用不同的端口来避免冲突 
[root@master ~]# vim web2.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: web2
spec:
  containers:
  - name: httpd
    image: myos:httpd
    ports:
    - containerPort: 80 # 指定该容器端口80
  - name: nginx
    image: myos:nginx
    ports:
    - containerPort: 8080 # 指定该容器端口8080

 

九. Pod调度策略

  • 什么是调度分配?
    • 在k8s中,调度是将Pod分配到合适的计算节点上,然后对应节点上的Kubelet运行这些pod
    • kube-scheduler是默认调度器,是集群的核心组件
  • 调度器是如何工作的?
    • 调度器通过k8s的监测(Watch)机制来发现集群中尚未被调度到节点上的Pod。调度器依据调度原则将Pod分配到一个合适的节点上运行
  • 调度流程 ——过滤和打分
    • 第一步过滤(筛选)
      • 首先要筛选出满足Pod所有的资源请求的节点,这里包含计算资源、内存、存储、网络、端口号等等,如果没有节点能满足Pod的需求,Pod将一直停留在Pending状态,直到调度器能够找到合适的节点运行它
    • 第二步打分(优选)
      • 在打分阶段,调度器会根据打分规则,为每一个课调度节点进行打分。选出其中得分最高的节点来运行Pod。如果存在多个得分最高的节点,调度器会从中随机选取一个
  • 绑定
    • 确认了某个节点运行Pod之后,调度器将这个调度决定通知给kube-apiserver,这个过程叫做绑定

 

1)定向调度

  • 基于节点名称的调度
  • 在 spec下面,添加nodeName标签,让Pod运行在指定节点上面,若指标节点无法运行,它会一直等下去,显示pending
[root@master ~]# vim myhttp.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: myhttp
spec:
  nodeName: node-0001 # 基于节点名进行调度
  containers:
  - name: apache
    image: myos:httpd

 

2)标签调度

  • Pod标签调度是指通过在Pod上设置标签(Label),将Pod调度到具有匹配标签的节点上,可以匹配到多个节点,也可以一个节点都匹配不到。
  • Pod标签调度是通过在Pod配置文件中设置nodeSelector字段来实现的
  • 查看筛选标签
    • 使用--show-labels查询标签

管理标签语法格式

  • 设置标签
    • kubectl label 资源类型 [资源名称] =
  • 删除标签
    • kubectl label 资源类型 [资源名称] -
  • 查看标签
    • kubectl label 资源类型 [资源名称] --show-labels
  • 使用标签选择
    • kubectl get 资源类型 [资源名称] -l
[root@master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myhttp 1/1 Running 1 (3m18s ago) 15h <none>
 
[root@master ~]# kubectl get namespaces --show-labels
NAME STATUS AGE LABELS
default Active 6d17h kubernetes.io/metadata.name=default
kube-node-lease Active 6d17h kubernetes.io/metadata.name=kube-node-lease
kube-public Active 6d17h kubernetes.io/metadata.name=kube-public
kube-system Active 6d17h kubernetes.io/metadata.name=kube-system
# 使用标签过滤资源对象
[root@master ~]# kubectl get nodes -l kubernetes.io/hostname=master
NAME STATUS ROLES AGE VERSION
master Ready control-plane 6d18h v1.26.0
 
# 添加标签
[root@master ~]# kubectl label pod myhttp app=apache
pod/myhttp labeled
[root@master ~]# kubectl get pods --show-labels
NAME   READY STATUS  RESTARTS    AGE LABELS
myhttp 1/1   Running 1 (39m ago) 15h app=apache
 
# 删除标签
[root@master ~]# kubectl label pod myhttp app-
pod/myhttp unlabeled
[root@master ~]# kubectl get pods --show-labels
NAME   READY STATUS  RESTARTS    AGE LABELS
myhttp 1/1   Running 1 (40m ago) 15h <none>

 

  • 使用系统标签调度
[root@master ~]# kubectl get nodes node-0002 --show-labels
NAME STATUS ROLES AGE VERSION LABELS
node-0002 Ready <none> 5d22h v1.26.0
beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd6
4,kubernetes.io/hostname=node-0002,kubernetes.io/os=linux
 
[root@master ~]# vim myhttp.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: myhttp
  labels:
    app: apache
spec:
  nodeSelector:         # 基于节点标签进行调度
    kubernetes.io/hostname: node-0002  # 标签
  containers:
  - name: apache
    image: myos:httpd
    
[root@master ~]# kubectl apply -f myhttp.yaml
pod/myhttp created
 
[root@master ~]# kubectl get pods -l app=apache -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myhttp 1/1 Running 0 23s 10.244.147.7 node-0002

 

十. Pod资源管理

  • 是K8s中用于限制和约束集群中各个命名空间或项目使用资源的方式,避免资源争用和浪费
  • Pod资源配额可以限制命名空间或项目中Pod使用的CPU、内存、存储等资源的数量
  • 设置resources字段,来实现资源管理

CPU资源类型

  • CPU资源的约束和请求以豪核(m)为单位。在k8s中1m是最小的调度单元,CPU的一个核心可以看作1000m
  • 如果你有2颗cpu,且每CPU为4核心,那么你的CPU资源总量就是8000

1)内存资源配额

[root@master ~]# vim minpod.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: minpod
spec:
  nodeSelector:                     # 配置Pod调度节点
  kubernetes.io/hostname: node-0003 # 在node-0003节点创建
  terminationGracePeriodSeconds: 0
  containers:
  - name: linux
    image: myos:8.5
    command: ["awk","BEGIN{while(1){}}"]
    resources:                      # 资源策略
      requests:                     # 配额策略
        memory: 1100Mi              # 内存配额

2)计算资源配额

[root@master ~]# vim minpod.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: minpod
spec:
  terminationGracePeriodSeconds: 0
  nodeSelector:
  kubernetes.io/hostname: node-0003
  containers:
  - name: linux
    image: myos:8.5
  command: ["awk","BEGIN{while(1){}}"]
  resources:    # 资源策略
    requests:   # 配额策略
      cpu: 800m # cpu配额,计算资源配额

3)综合资源配额

  • 同时设置CPU和内存配额时,资源必须满足全部需求
[root@master ~]# vim minpod.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: minpod
spec:
  terminationGracePeriodSeconds: 0
  nodeSelector:
  kubernetes.io/hostname: node-0003
  containers:
  - name: linux
    image: myos:8.5
  command: ["awk","BEGIN{while(1){}}"]
  resources:
    requests:
      cpu: 800m      # 计算资源配额
      memory: 1100Mi # 内存资源配额

4)内存 CPU 限额

# 创建限额资源对象文件
[root@master ~]# vim maxpod.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: maxpod
spec:
  terminationGracePeriodSeconds: 0
  containers:
  - name: linux
    image: myos:8.5
  command: ["awk","BEGIN{while(1){}}"]
  resources:
    limits:
      cpu: 800m       # 计算资源配额
      memory: 2000Mi  # 内存资源配额
 
[root@master ~]# kubectl apply -f maxpod.yaml
pod/maxpod created

 

十一. 全局资源管理

  • 如果有大量的容器需要设置资源配额,为每个Pod设置资源配额策略不方便且不好管理。管理员可以以名称空间为单位(namespace),限制其资源的使用与创建。在该名称空间中创建的容器都会受到规则的限制。
  • k8s 支持的全局资源配额方式有:
    • 对单个Pod内存、CPU进行配额:LimitRange
    • 对资源总量进行配额:ResourceQuota

1) LimitRange

# 创建名称空间
[root@master ~]# kubectl create namespace work
namespace/work created
 
# 设置默认配额
[root@master ~]# vim limit.yaml
---
apiVersion: v1
kind: LimitRange
metadata:
  name: mylimit      # 策略名称
  namespace: work    # 规则生效的名称空间
spec:
  limits: # 全局规则
  - type: Container  # 资源类型
    default:         # 对没有限制策略的容器添加规则
      cpu: 300m      # 计算资源限额
      memory: 500Mi  # 内存资源限额
  defaultRequest:
    cpu: 8m          # 计算资源配额
    memory: 8Mi      # 内存资源配额
 
[root@master ~]# kubectl -n work apply -f limit.yaml
limitrange/mylimit created

2) ResourceQuota

[root@master ~]# vim quota.yaml
---
apiVersion: v1
kind: ResourceQuota           # 全局资源限额对象
metadata:
  name: myquota               # 规则名称
  namespace: work             # 规则作用的名称空间
spec:                         # ResourceQuota.spec定义
  hard:                       # 创建强制规则
    requests.cpu: 1000m       # 计算资源配额总数
    requests.memory: 2000Mi   # 内存资源配额总数
    limits.cpu: 5000m         # 计算资源限额总数
    limits.memory: 8Gi        # 内存资源限额总数
    pods: 3                   # 限制创建资源对象总量
 
[root@master ~]# kubectl -n work apply -f quota.yaml
resourcequota/myquota created

 

posted on 2025-09-17 14:54  Karlkiller  阅读(17)  评论(0)    收藏  举报

导航