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 :发送请求到服务器但不实际创建/修改资源
典型用途
- 验证配置 :通过 --dry-run=client 生成资源的yaml模版,避免手动编写错误
- 安全检查 :使用 --dry-run=server 测试命令对集群的影响,避免误操作
- 学习参考 :结合 -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) 收藏 举报
浙公网安备 33010602011771号