K8S快速入门(一)
·
集群管理命令
语法格式:
kubectl [command] [TYPE] [NAME] [flags]
command: 子命令,如create、get、describe、delete
type: 资源类型,可以表示单数,复数或缩写形式
name: 资源的名称,如果省略,泽显示所有资源信息
flags: 指定可选标志,或附加的参数
| 子命令 | 说明 |
|---|---|
| help | 用于查看命令及子命令的帮助信息 |
| cluster-info | 显示集群的相关配置信息 |
| version | 查看服务器及客户端的版本信息 |
| api-resources | 查看当前服务器上所有的资源对象 |
| api-versions | 查看当前服务器上所有资源对象的版本 |
| config | 管理当前节点上kubeconfig 的认证信息 |
命名空间
Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
- 获取命名空间
[root@master ~]# kubectl get ns # 简写
[root@master ~]# kubectl get namespaces # 全写
[root@master ~]# kubectl -n 命名空间 get pods # 查看命名空间中的资源对象
- 创建命名空间
[root@master ~]# kubectl create ns your_namespace # 简写, 其中:your_namespace 为你自己的命名空间名称
[root@master ~]# kubectl create namespace your_namespace # 全写, 其中:your_namespace 为你自己的命名空间名称
- 删除命名空间
[root@master ~]# kubectl delete namespace your_namespace # 简写, 其中:your_namespace 为你自己的命名空间名称
[root@master ~]# kubectl delete namespace your_namespace # 全写, 其中:your_namespace 为你自己的命名空间名称
- 查看命名空间
[root@master ~]# kubectl describe ns your_namespace # your_namespace 为你自己的命名空间名称
Pod
Pod概述
由一个容器或多个容器组成(最少一个容器)
是k8s中最小的管理元素
同一个Pod 共享IP及权限,主机名称,共享存储设备,命名空间
每个Pod都会存在一个Pause根容器,这是每一个Pod都会去运行的。它就像一个基石,为Pod中的其他容器提供基础运行环境。Pause容器会加载所有必要的运行时、内核模块和设备驱动,以确保Pod中的所有容器都能在相同的网络和命名空间中运行。
其他的资源对象都是用来支撑或者扩展Pod对象功能的。
Pod相位状态
-- Pending: Pod创建过程中,但它尚未被调度完成
-- Running: Pod中所有容器都被创建成功
-- Completed或者successd: Pod所有容器都已经成功终止,并不会被重启
-- Failed: Pod中的所有容器至少有一个容器退出是非0状态
-- Unkown: 无法正常获取Pod对象的状态信息
管理命令
获取命名空间下容器(pod)列表
[root@master ~]# kubectl get pods -n your_namespace -o wide -w # your_namespace为你自己的命名空间名称
-n 指定命名空间
-o wide 显示更加详细信息
-o name 只显示名字
-o yaml/json 以yaml/json语法格式显示资源对象
-w 持续监听
查看pod的详细信息
[root@master ~]# kubectl describe pod your_pod -n your_namespace # your_pod为自己的pod名称,your_namespace为你自己的命名空间名称
创建 && 运行
[root@master ~]# kubectl run [pod名称] --image=[镜像]:[镜像版本] --port=[对外端口] --namespace [namespace]
删除pod
[root@master ~]# kubectl delete pod [pod名称] -n [命名空间名称]
删除会再次出现?
因为pod是隶属于Pod控制器下,控制器会监控pod的健康值,出现问题会重启几次失败后删除重新创建,所以会出现删除在出现的问题。
进入容器
[root@master ~]# kubectl exec your_pod -c 容器名称 -n your_namespace -it /bin/bash
# 在容器内执行命令
[root@master ~]# kubectl exec myweb -- ls
50x.html
index.html
若有很多容器
# 获取pod列表
[root@node2 ~]# kubectl get pods -n your_namespace
NAME READY STATUS RESTARTS AGE
nginx-64777cd554-c2k5n 2/2 Running 2 23h
# 获取pod详情
# - your_pod 你的pd名称, 对应上面 nginx-64777cd554-c2k5n
[root@node2 ~]# kubectl describe pod your_pod -n your_namespace
...其他配置
Controlled By: ReplicaSet/nginx-replicaset
Containers:
nginx: # ***容器名称***
Container ID: docker://42534954660b49806772a7df127267f399652fcaef18b26c619363e1283d6c8c
Image: nginx:1.17.1
Image ID: docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b7510c77ae70cfba567af1376a573a967c03dbb
...其他配置
# 进入容器内部
# - your_container 你的容器名称,对应上面获取pod详情结果的 nginx
[root@master ~]# kubectl exec your_pod -n your_namespace -it -c your_container /bin/bash
根据资源对象文件运行命令
[root@master ~]# kubectl create/apply/delete -f 资源文件名称.yaml
create 创建文件中定义的资源
kubectl create .... --dry-run=client -o yaml(create主要用来生成资源对象的模板,我们一般都是用apply)
apply 创建(更新)文件中定义的资源 (主要用的就是这个)
delete 删除文件中定义的资源
排错三兄弟
kubectl get 查看资源对象的状态信息)
kubectl describe 查询资源对象的属性信息
Events下是事物日志,用来排错
Kubectl logs 查看容器报错信息
# 查看 work 名称空间下的 pod 信息
[root@master ~]# kubectl -n work describe pod myhttp
Name: myhttp
Namespace: work
Priority: 0
Service Account: default
Node: node-0004/192.168.1.54
... ...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 12m default-scheduler Successfully assigned work/myhttp
to node-0004
Normal Pulling 12m kubelet Pulling image "myos:httpd"
Normal Pulled 12m kubelet Successfully pulled image
"myos:httpd" in 3.678925795s (3.678930716s including waiting)
Normal Created 12m kubelet Created container myhttp
Normal Started 12m kubelet Started container myhttp
# 查看 myweb 日志
[root@master ~]# kubectl logs myweb
2023/09/14 09:42:38 [error] 7#0: *2 open() "/usr/local/nginx/html/info.php"
failed (2: No such file or directory), client: 10.244.219.64, server: localhost,
request: "GET /info.php HTTP/1.1", host: "10.244.243.193"
2023/09/14 09:44:46 [error] 6#0: *4 open() "/usr/local/nginx/html/info.php"
failed (2: No such file or directory), client: 10.244.219.64, server: localhost,
request: "GET /info.php HTTP/1.1", host: "10.244.243.193"
2023/09/14 09:51:08 [error] 6#0: *5 open() "/usr/local/nginx/html/info.php"
failed (2: No such file or directory), client: 10.244.219.64, server: localhost,
request: "GET /info.php HTTP/1.1", host: "10.244.243.193"
污点策略
污点标签
污点(Taint)是使节点与Pod产生排斥的一类规则
污点策略通过嵌合在键值对上的污点标签进行声明
污点的格式为:key=value:effect, key和value是污点的标签,effect描述污点的作用
污点标签
PreferNoSchedule:kubernetes将尽量避免把Pod调度到具有该污点的Node上,除非没有其他节点可调度
NoSchedule:kubernetes将不会把Pod调度到具有该污点的Node上,但不会影响当前Node上已存在的Pod
NoExecute:kubernetes将不会把Pod调度到具有该污点的Node上,同时也会将Node上已存在的Pod驱离
管理污点标签
查看污点标签
kubectl describe nodes [节点名字]
设置污点标签
kubectl taint node [节点名字] key=value:污点标签
删除污点标签
kubectl taint node [节点名字] key=value:污点标签-
设置并查看污点标签
# node01 设置污点策略 PreferNoSchedule
[root@master ~]# kubectl taint node node01 k=v1:PreferNoSchedule
node/node01 tainted
# 查看污点
[root@master ~]# kubectl describe node node01
Name: node01
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=node01
kubernetes.io/os=linux
Annotations: flannel.alpha.coreos.com/backend-data: {"VNI":1,"VtepMAC":"ce:d8:30:f2:9b:b0"}
flannel.alpha.coreos.com/backend-type: vxlan
flannel.alpha.coreos.com/kube-subnet-manager: true
flannel.alpha.coreos.com/public-ip: 192.168.1.101
kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Mon, 25 Dec 2023 12:15:15 +0800
Taints: taint=v1:PreferNoSchedule # 污点标签
Unschedulable: false
...其他设置内容
删除污点标签
[root@master ~]# kubectl taint node node01 k-
node/node01 untainted
资源文件对象
资源对象文件相关帮助
Pod的资源清单
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,资源类型,例如 Pod
metadata: #必选,元数据
name: string #必选,Pod名称
annotations: #选做,描述信息
nginx: nginx
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: 80 #容器需要监听的端口号
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
最基础Pod资源对象文件
[root@master ~]# vim myweb.yml
--- # Yaml文件起始标志
kind: Pod # 当前创建资源的类型
apiVersion: v1 # 当前资源对应的版本
metadata: # 属性信息,元数据,包括名字和其他标识符等。这些信息对于识别和管理Pod很有用
name: myweb # 属性信息,资源的名称
spec: # 资源的特性描述(规约),定义Pod具体行为的部分
containers: # 容器资源特征描述
- name: webserver # 容器名称
image: myos:nginx # 启动容器使用的镜像
status: {} # 资源状态,运行后自动生成(一般不写这行)
自动生成模板命令
生成模板命令: [ --dry-run=client -o yaml]
[root@master ~]# kubectl run myweb --image=myos:nginx --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: myweb
name: myweb
spec:
containers:
- image: myos:nginx
name: myweb
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
查询帮助信息
[root@master ~]# kubectl explain Pod.spec.restartPolicy
KIND: Pod
VERSION: v1
FIELD: restartPolicy <string>
DESCRIPTION:
Restart policy for all containers within the pod. One of Always, OnFailure,
Never. Default to Always. More info:
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy
Possible enum values:
- `"Always"`
- `"Never"`
- `"OnFailure"`
资源文件参数使用"."分割层级结构关系
---
kind: xxx # 一级,可以表示为 .kind
apiVersion: xx # 一级,可以表示为 .apiVersion
metadata: # 一级,可以表示为 .metadata
name: xx # 二级,可以表示为 .metadata.name
spec: # 一级,可以表示为 .spec
restartPolicy: xx # 二级,可以表示为 .spec.restartPolicy
containers: # 二级,可以表示为 .spec.containers
- name: xx # 三级,可以表示为 .spec.containers.name
image: xx # 三级,可以表示为 .spec.containers.image
status: {} # 一级,可以表示为 .status
Pod
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 保护策略
指在系统发生故障或意外停机时,系统或应用程序如何处理和恢复的策略
重启[Always] -- 不重启[Never] -- 失败就重启[OnFailure]
Pod会根据策略决定容器结束后是否重启
[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的内部程序在运行时出现循环死锁,那么就会永远不停的重复执行,为避免出现循环死索,允许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 容器名
[root@master ~]# vim mynginx.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mynginx
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
containers: # 容器资源是个数组,可以定义多个Pod
- name: nginx # 容器名称
image: myos:nginx # 启动容器使用的镜像
- name: php # 容器名称
image: myos:php-fpm # 启动容器使用的镜像
注意:如果启动多容器,也根据提供的配置文件,没有明确指定每个容器的端口信息,那就需要在一个Pod中,每个容器需要使用不同的端口来避免冲突
Pod容忍策略
容忍刚好和污点相反,某些时候我们需要在有污点的节点上运行Pod,这种无视污点标签的调度方式成为容忍
精确匹配: 下面3个条件必须写全
模糊匹配: 不需要写全
精确匹配策略
把effect: "" 改成这个样子代表容忍所有污点
# 容忍 k=v1:NoSchedule 污点
[root@master ~]# vim myphp.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: myphp
spec:
tolerations: # 定义容忍策略
- operator: Equal # 匹配方式,必选(Equal精确匹配,Exists模糊匹配)
key: k # 设置键值对的key,为空代表任意键值对
value: v1 # 设置values的值
effect: NoSchedule # 设置容忍的标签,为空代表所有污点标签
containers:
- name: php
image: myos:php-fpm
模糊匹配策略
# 容忍 k=*:NoSchedule 污点
[root@master ~]# vim myphp.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: myphp
spec:
tolerations:
- operator: Exists # 部分匹配,存在即可
key: k # 键
effect: NoSchedule # 污点标签
containers:
- name: php
image: myos:php-fpm
优先级与抢占
优先级就是为了保证重要的Pod被调度运行
通过配置优先级PriorityClass或创建Pod时为其设置对应的优先级来确认优先级
PriorityClass是一个全局资源对象,它定义了从优先级类名称到优先级整数值的映射。优先级在value字段中指定,可以设置小于10亿的整数值,值越大,优先级越高,默认优先级0
PriorityClass还有两个可选字段:
globalDefault用于设置默认优先级状态,如果没有任何优先级设置Pod的优先级为零
description用来配置描述性信息,告诉用户优先级的用途
优先级策略:
非抢占优先:指的是在调度阶段优先进行调度分配,一旦容器调度完成就不可以抢占,资源不足时,只能等待
抢占优先:强制调度一个Pod,如果资源不足无法被调度,调度程序会抢占(删除)较低优先级的Pod的资源,来保证高优先级Pod的运行
非抢占优先级
# 定义优先级(队列优先)
[root@master ~]# vim mypriority.yaml
---
kind: PriorityClass
apiVersion: scheduling.k8s.io/v1
metadata:
name: high-non # 优先级名称
preemptionPolicy: Never # 策略:非抢占
value: 1000 # 优先级
---
kind: PriorityClass
apiVersion: scheduling.k8s.io/v1
metadata:
name: low-non # 优先级名称
preemptionPolicy: Never # 策略:非抢占
value: 500 # 优先级
# 运行并查看优先级
[root@master ~]# kubectl apply -f mypriority.yaml
priorityclass.scheduling.k8s.io/high-non created
priorityclass.scheduling.k8s.io/low-non created
[root@master ~]# kubectl get priorityclasses.scheduling.k8s.io
NAME VALUE GLOBAL-DEFAULT AGE
high-non 1000 false 12s
low-non 500 false 12s
system-cluster-critical 2000000000 false 45h
system-node-critical 2000001000 false 45h
创建pod
[root@master ~]# vim php2.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: php2
spec:
nodeSelector:
kubernetes.io/hostname: node01
priorityClassName: low-non # 优先级名称
containers:
- name: php
image: myos:php-fpm
抢占优先级
[root@master ~]# vim mypriority.yaml
---
kind: PriorityClass
apiVersion: scheduling.k8s.io/v1
metadata:
name: high
preemptionPolicy: PreemptLowerPriority #抢占策略
value: 1000
---
kind: PriorityClass
apiVersion: scheduling.k8s.io/v1
metadata:
name: low
preemptionPolicy: PreemptLowerPriority #抢占策略
value: 500
# 运行并查看优先级策略
[root@master ~]# kubectl apply -f mypriority.yaml
priorityclass.scheduling.k8s.io/high-non created
priorityclass.scheduling.k8s.io/low-non created
priorityclass.scheduling.k8s.io/high created
priorityclass.scheduling.k8s.io/low created
[root@master ~]# kubectl get priorityclasses.scheduling.k8s.io
NAME VALUE GLOBAL-DEFAULT AGE
high 1000 false 2m56s
low 500 false 2m56s
system-cluster-critical 2000000000 false 7d22h
system-node-critical 2000001000 false 7d22h
Pod调度策略
将Pod分配到合适的计算节点上,并运行 -- kube-scheduler 默认调度器
什么是调度分配?
在k8s中,调度是将Pod分配到合适的计算节点上,然后对应节点上的Kubelet运行这些pod
kube-scheduler是默认调度器,是集群的核心组件
调度器是如何工作的?
调度器通过k8s的监测(Watch)机制来发现集群中尚未被调度到节点上的Pod。调度器依据调度原则将Pod分配到一个合适的节点上运行。
调度流程
调度器给一个pod做调度选择包含两个步骤: 过滤和打分
第一步过滤(筛选)
首先要筛选出满足Pod所有的资源请求的节点,这里包含计算资源、内存、存储、网络、端口号等等,如果没有节点能满足Pod的需求,Pod将一直停留在Pending状态,直到调度器能够找到合适的节点运行它
第二步打分(优选):
在打分阶段,调度器会根据打分规则,为每一个课调度节点进行打分。选出其中得分最高的节点来运行Pod。如果存在多个得分最高的节点,调度器会从中随机选取一个。
绑定
在确认了某个节点运行Pod之后,调度器将这个调度决定通知给kube-apiserver,这个过程叫做绑定
定向调度
基于节点名称的调度
在 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
标签调度
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
内存资源配额
[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 # 内存配额
计算资源配额
[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配额,计算资源配额
综合资源配额
[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 # 内存资源配额
内存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
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
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
更多推荐

所有评论(0)