四.常用项
一.metrice-server的部署
在 Kubernetes 集群中,Metrics Server 是负责收集和提供资源指标(如 CPU、内存使用率)的核心组件,这些指标被用于 Horizontal Pod Autoscaler(HPA)等自动扩缩容功能。
1.单机版metrice-server部署
查看metrece-server与k8s的版本对应关系、我使用是1.28.2版本的k8s、所以可以下载0.6或者0.7版本的mterice-server配置文件

https://github.com/kubernetes-sigs/metrics-server/releases/tag/v0.7.2
去这个网站下载components.yaml文件
//打开配置文件
vi components.yaml
//修改配置文件、修改用蓝色标注、添加用紫色标注、注意用红色标注
# 1. 服务账号定义
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
---
# 2. 聚合指标读取权限(供管理员/编辑者/查看者角色继承)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-view: "true"
name: system:aggregated-metrics-reader
rules:
- apiGroups: ["metrics.k8s.io"]
resources: ["pods", "nodes"]
verbs: ["get", "list", "watch"]
---
# 3. Metrics Server 专属权限
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
rules:
- apiGroups: [""]
resources: ["nodes/metrics", "pods", "nodes"]
verbs: ["get", "list", "watch"]
---
# 4. API 认证读取权限绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
k8s-app: metrics-server
name: metrics-server-auth-reader
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
# 5. 认证委派权限绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
name: metrics-server:system:auth-delegator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
# 6. 核心指标服务绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:metrics-server
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
# 7. Service 定义(暴露 443 端口)
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
ports:
- name: https
port: 443
protocol: TCP
targetPort: https
selector:
k8s-app: metrics-server
---
# 8. Deployment 核心配置(重点关注部分)
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: metrics-server
strategy:
rollingUpdate:
maxUnavailable: 0 # 滚动更新策略(确保零宕机)
template:
metadata:
labels:
k8s-app: metrics-server
spec:
containers:
- args:
- --cert-dir=/tmp # 证书存储目录(临时目录)
- --secure-port=10250 # 安全端口号
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname # 节点地址优先级
- --kubelet-use-node-status-port # 使用节点状态端口(需 Kubelet 配置支持)
- --metric-resolution=15s # 指标采集间隔(默认 60s,缩短可提高精度)
- --kubelet-insecure-tls #官方的yaml文件加了就绪性探测、使用的是https方式、这个参数的意思就是启用https、如果不启用的话、
#就绪性探测就会一直失败
image: registry.aliyuncs.com/google_containers/metrics-server:v0.7.2 //改为国内镜像
imagePullPolicy: IfNotPresent
securityContext:
readOnlyRootFilesystem: true # 安全加固:只读根文件系统
runAsNonRoot: true # 非 root 用户运行
runAsUser: 1000 # 指定用户 ID
resources:
requests:
cpu: 100m # 最小 CPU 资源
memory: 200Mi # 最小内存资源
volumeMounts:
- mountPath: /tmp # 挂载临时卷
name: tmp-dir
nodeSelector:
kubernetes.io/os: linux # 仅调度到 Linux 节点
priorityClassName: system-cluster-critical # 优先级(关键系统组件)
---
# 9. API 服务注册(聚合层配置)
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
labels:
k8s-app: metrics-server
name: v1beta1.metrics.k8s.io
spec:
insecureSkipTLSVerify: true # 跳过 TLS 验证(生产环境不推荐)
service:
name: metrics-server
namespace: kube-system
// 先把镜像拉下来(不拉也行)
nerdctl -n k8s.io pull registry.aliyuncs.com/google_containers/metrics-server:v0.7.2
//应用yaml文件
kubectl apply -f components.yaml
//查看pod状态(等待pod状态为完成)
kubectl get pods -n kube-system -l k8s-app=metrics-server
//测试mterice-server是否可用
//查看pod、cpu、内存使用率
kubectl top pods -n kube-system
kubectl top nodes
//查看node节点cpu、内存使用率
kubectl top nodes
2.高可用方式部署
// 先清除之前部署的单机的metrice-server(没部署就不用这一步)
kubectl delete -f components.yaml
//去下载高可用的配置文件(上面给地址了)
vi high-availability.yaml
//修改三处配置文件(比单机版多修改了一处)
//1.
- --kubelet-insecure-tls #官方的yaml文件加了就绪性探测、使用的是https方式、这个参数的意思就是启用https、如果不启用的话、
#就绪性探测就会一直失败
//2.
image: registry.aliyuncs.com/google_containers/metrics-server:v0.7.2 #改为国内镜像
//3.
---
apiVersion: policy/v1 #如果使用的k8s是1.25+这里也要讲v1beta1修改为v1(这个地方在配置文件的偏后的部分)
kind: PodDisruptionBudget
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
minAvailable: 1
selector:
matchLabels:
k8s-app: metrics-server
//应用yaml文件
kubectl apply -f high-availability.yaml
//查看pod状态(等待pod状态为完成)
kubectl get pods -n kube-system -l k8s-app=metrics-server
//测试mterice-server是否可用
//查看pod、cpu、内存使用率
kubectl top pods -n kube-system
kubectl top nodes
//查看node节点cpu、内存使用率
kubectl top nodes
3.高可用部署可能会遇到的问题
pod长时间未进入running状态

检查一下原因(红色部分换成自己要查询的pod)
kubectl describe pod -n kube-system metrics-server-xxxxx | grep -A 20 Events

我查询的原因说是有污点
然后我就修改了一下配置文件high-availability.yaml、新增了容忍配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
spec:
template:
spec:
tolerations: # 新增容忍配置
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
containers:
- args:
- --kubelet-certificate-authority=/etc/kubernetes/pki/ca.crt # 证书配置
image: registry.aliyuncs.com/google_containers/metrics-server:v0.7.2 # 国内镜像
把之前的部署给删除
kubectl delete -f high-availability.yaml
重新应用一下
kubectl apply -f high-availability.yaml
问题解决

一般出现问题的话就先看一下是哪个pod出问题了、然后用kubectl describe pod查看一下错误原因、再根据具体的原因进行修复就行了
二.kubeadm部署的k8s集群证书续期
//查看证书过期时间
kubeadm certs check-expiration
//查看证书有效期
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not
//备份证书所在目录
cp -r /etc/kubernetes /etc/kubernetes.bak
//批量续约证书
kubeadm certs renew all
//查看证书过期时间
kubeadm certs check-expiration
//重新拷贝认证文件
cp /etc/kubernetes/admin.conf /root/.kube/config
//检查node和pod状态
kubectl get nodes
kubectl get pods -A
三.部署k8sUI(kubepi可视化页面)
这里只介绍非持久化部署的方式
//创建一个kubepi.yaml文件(因为我下载不下来所以直接复制了)
//也可用直接执行命令sudo kubectl apply -f https://raw.githubusercontent.com/1Panel-dev/KubePi/master/docs/deploy/kubectl/kubepi.yaml
vi kubepi.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: kubepi-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubepi-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubepi-user
namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
name: kubepi
namespace: kube-system
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
selector:
app.kubernetes.io/name: kubepi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubepi
namespace: kube-system
labels:
app.kubernetes.io/name: kubepi
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: kubepi
template:
metadata:
labels:
app.kubernetes.io/name: kubepi
spec:
containers:
- name: kubepi
image: kubeoperator/kubepi-server:latest
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
securityContext:
privileged: true
// 把上面的内容粘贴进去然后进行部署
kubectl apply -f kubepi.yaml
//获取访问地址
echo http://$NODE_IP:$NODE_PORT
//获取apiserver
cat /root/.kube/config | grep server:
//生成token
kubectl -n kube-system create token kubepi-user
在这里把集群导入就可用了、如果获取不到看看是不是命名空间的问题。
四.Namespace和Label
1.Namespace的基础了解
Namespace(命名空间)在很多情况下用于多租户的资源隔离、将集群内部的资源对象分配到不同的Namespace中、形成逻辑上分组的不同项目、小组或用户组、例如、可以为test、devlopment、production环境分别创建各自的命名空间。
应用场景:
1、多租户部署:不同的团队或租户可以在同一个Kubernetes集群中创建自 己的Namespace,从而实现资源隔离和权限隔离。
2、多环境部署:在同一个Kubernetes集群中,可以为不同的环境(如开发、 测试、生产等)创建不同的Namespace,从而避免资源冲突和环境混乱。
3、应用拆分部署:将一个大型应用拆分为多个微服务,每个微服务可以通 过创建独立的Namespace来进行资源隔离和管理。
4、测试与运维:测试人员可以在自己的Namespace中部署测试环境,运维 人员可以在自己的Namespace中进行运维操作。
5、安全和合规:通过为不同的应用程序或服务创建独立的Namespace,可 以增强安全性和合规性,从而避免可能的安全漏洞或数据泄露。
实现原理:
为不同的资源对象分配唯一的标识符、将它们隔离在不同的虚拟集群中、通过k8s APIServer和etcd存储元数据、并使用k8s Scheduler和DNS插件进行资源调度和解析
1、每个Namespace 都是Kubernetes 集群中的一个虚拟集群,其内部包含的 资源(Pod、Service、Volume、Secret 等)只能在该Namespace中使用。
2、Kubernetes API Server使用etcd存储资源对象的元数据,每个Namespace 都有一个独立的etcd存储空间,用于存储该Namespace中所有资源对象的元数据。
3、在Kubernetes 运行时,每个Namespace的Pod、Service、Volume、Secret 等资源都被分配一个唯一标识符(UID),并与该Namespace的标识符进行关联。 这样,即使多个Namespace中的资源对象名称相同,它们也不会冲突。
4、Kubernetes Scheduler根据不同的Namespace分别调度Pod到不同的Node 上。
5、Kubernetes DNS 插件会为每个Namespace分别创建一个DNS域名,用于 解析该Namespace中所有Service的域名。
常用命令:
// 查看有哪些命名空间
kubectl get namespace
// 创建命名空间
kubectl create namespace devops namespace/devops created
或者
kubectl create ns devops
//删除命名空间
kubectl delete ns devops namespace "devops" deleted
//切换到kube-system命名空间
kubectl config set-context --current --namespace=kube-system
//查看K8s集群默认支持的所有资源
kubectl api-resources
//查看K8s集群默认支持的所有资源哪些属于命名空间级别的
kubectl api-resources --namespace=true
2.Namespace的资源限额
1、在集群容量小于各命名空间配额总和的情况下,可能存在资源竞争。资 源竞争时,Kubernetes系统会遵循先到先得的原则。
2、不管是资源竞争还是配额的修改,都不会影响已经创建的资源使用对象。
3、通过k8s中的资源配额API对象来定义和应用
常见的Namespace资源配额:
1、CPU 配额:可以限制一个Namespace中所有Pod使用的CPU配额。
2、内存配额:可以限制一个Namespace中所有Pod使用的内存配额。
3、存储配额:可以限制一个Namespace中所有PersistentVolumeClaim(PVC) 使用的存储配额。
4、Pod 配额:可以限制一个Namespace中最多可以运行的Pod数量。
5、服务配额:可以限制一个Namespace中最多可以创建的Service数量。
| 资源名称 | 描述 |
|---|---|
| limits.cpu | 所有非终止状态的Pod,其CPU限额总量不能超过该值。 |
| limits.memory | 所有非终止状态的Pod,其内存限额总量不能超过该值。 |
| requests.cpu | 所有非终止状态的Pod,其CPU需求总量不能超过该值。 |
| requests.memory | 所有非终止状态的Pod,其内存需求总量不能超过该值。 |
| cpu | 与requests.cpu 相同 |
| memory | 与requests.memory 相同 |
常用项
//检查当前集群是否启用了资源配额(下面是没有指定的输出)
cat /etc/kubernetes/manifests/kube-apiserver.yaml |grep "enable-admission-plugins"
---enable-admission-plugins=NodeRestriction
//给k8s加上资源配额
vi /etc/kubernetes/manifests/kube-apiserver.yaml
---enable-admission-plugins=NodeRestriction,ResourceQuota
systemctl restart kubelet
//创建命名空间(需要先创建命名空间、才能够对命名空间进行资源限额)
kubectl create ns devops namespace/devops created
//编辑yaml文件、对命名空间进行限额
vi devops-quota.yaml
//具体的参数注释
apiVersion: v1 # 必填字段,指定 Kubernetes API 版本
kind: ResourceQuota # 资源类型,表示这是一个资源配额对象[6,7](@ref)
metadata:
name: mem-cpu-quota # 配额对象名称(自定义,需唯一)
namespace: devops # 配额生效的命名空间(需提前创建 devops 命名空间)[6](@ref)
spec:
hard: # 定义命名空间内所有资源的硬性限制
requests.cpu: "2" # 所有 Pod 的 CPU 请求总量上限为 2 核(单位:Core)
requests.memory: "2Gi" # 所有 Pod 的内存请求总量上限为 2 GiB(单位:GiB/Gi,1Gi=1024Mi)
limits.cpu: "4" # 所有 Pod 的 CPU 使用总量上限为 4 核(容器不可超过此限制)
limits.memory: "4Gi" # 所有 Pod 的内存使用总量上限为 4 GiB[7](@ref)
//更新清单文件
kubectl apply -f devops-quota.yaml
//查看资源限额
kubectlgetresourcequota-A
//检查命名空间限额
kubectldescribensdevops
创建一个测试pod容器:
//编写yaml文件
vi pod-test.yaml
apiVersion:v1
kind:Pod
metadata:
name:pod-test
namespace:devops
labels:
app:tomcat-pod-test
spec:
containers:-name: tomcat-test
ports:-containerPort:8080
image:tomcat
resources:
limits:
memory:"2Gi"
cpu:"1"
requests:
memory:"500Mi"
cpu:"500m"
//创建pod并进行检查
kubectl create -f pod-test.yaml
//查看pod是否启动
kubectl get pods -n devops
//查看命名空间资源限额情况
kubectl describe ns devops
3.存储资源的配额
| 资源名称 | 描述 |
|---|---|
| requests.storage | 所有PVC,存储资源的需求总量不能超过该值。 |
| persistentvolumeclaims | 在该命名空间中所允许的PVC总量。 |
| 在所有与 | |
| 在与storage-class-name相关的所有持久卷申领 中,命名空间中可以存在的持久卷申领总数。 |
项目演练:
目标: :创建storage命名空间,对storage命名空间进行资源配额,限制 PVC资源存储总量不能超过50G,PVC总量不得超过1。
//创建命名空间
kubectl create ns storage
//创建yaml文件、对命名空间进行限额
vi storage-quota.yaml
//yaml文件的参数的注释
apiVersion: v1 # Kubernetes API 版本(ResourceQuota 属于核心 API 组)
kind: ResourceQuota # 资源类型:资源配额对象
metadata:
name: pvc-quota # 资源配额名称(自定义,需唯一)
namespace: storage # 配额生效的命名空间(需提前创建 storage 命名空间)
spec:
hard: # 定义命名空间内存储资源的硬性限制
requests.storage: "50Gi" # 所有持久卷声明(PVC)的存储请求总量上限为 50 GiB[2,3](@ref)
persistentvolumeclaims: "1" # 允许创建的 PVC 数量上限为 1 个[2,3](@ref)
//应用yaml文件
kubectl apply -f storage-quota.yaml
//检查命名空间限额
kubectl get ResourceQuota -n storage
kubectl describe ns storage
//创建测试pvc、大于50G(这个是不符合要求的)
vi storage-pvc.yaml
apiVersion: v1 # Kubernetes API 版本(PVC 属于核心 API 组)
kind: PersistentVolumeClaim # 资源类型:持久化卷声明(PVC)
metadata:
name: storage-pvc # PVC 名称(需唯一)
namespace: storage # PVC 所属命名空间(需提前创建)
spec:
accessModes: ["ReadWriteMany"] # 访问模式:允许多个节点同时读写(RWX)
resources:
requests:
storage: 60Gi # 请求的存储容量为 60 GiB(Gibibytes)
//应用yaml文件、发现报错
kubectl apply -f storage-pvc.yaml
Error from server (Forbidden): error when creating
"storage-pvc.yaml":persistentvolumeclaims"storage-pvc"isforbidden:
exceeded quota: pvc-quota, requested: requests.storage=60Gi, used:
requests.storage=0,limited:requests.storage=50Gi
//创建测试pvc、小于50G(这个符合要求)
vi storage-pvc.yaml
apiVersion: v1 # Kubernetes API 版本(PVC 属于核心 API 组)
kind: PersistentVolumeClaim # 资源类型:持久化卷声明(PVC)
metadata:
name: storage-pvc # PVC 名称(需唯一)
namespace: storage # PVC 所属命名空间(需提前创建)
spec:
accessModes: ["ReadWriteMany"] # 访问模式:允许多个节点同时读写(RWX)
resources:
requests:
storage: 40Gi # 请求的存储容量为 60 GiB(Gibibytes)
//应用yaml文件、发现成功
kubectl apply -f storage-pvc.yaml
//查看命名空间限额情况
kubectl get ResourceQuota -n storage
kubectl describe ns storage
4.对象数量配额
| 资源名称 | 描述 |
|---|---|
| configmaps | 在该命名空间中允许存在的ConfigMap总数上限。 |
| persistentvolumeclaims | 在该命名空间中允许存在的PVC的总数上限。 |
| pods | 在该命名空间中允许存在的非终止状态的Pod总数 上限。 |
| replicationcontrollers | 在该命名空间中允许存在的ReplicationController 总数上限。 |
| resourcequotas | 在该命名空间中允许存在的ResourceQuota总数上 限。 |
| services | 在该命名空间中允许存在的Service总数上限。 |
| services.loadbalancers | 在该命名空间中允许存在的LoadBalancer类型的 Service总数上限。 |
| services.nodeports | 在该命名空间中允许存在的NodePort类型的 Service总数上限。 |
| secrets | 在该命名空间中允许存在的Secret总数上限。 |
项目演练: 创建number命名空间,对number命名空间进行资源配额,限制 configmaps资源总量不能超过10、PVC资源总量不得超过5、pods资源总量不 得超过50、services资源总量不得超过10、services.nodeports资源总量不得 超过5、secrets资源总量不得超过10。
//创建命名空间
kubectl create ns number
//创建yaml文件、对命名空间进行限额
vi number-quota.yaml
apiVersion: v1 # Kubernetes 核心 API 版本(ResourceQuota 属于核心组)
kind: ResourceQuota # 资源类型:资源配额对象
metadata:
name: number-quota # 配额名称(需唯一)
namespace: number # 生效的命名空间(需提前创建)
spec:
hard: # 定义命名空间内资源的硬性限制
configmaps: "10" # 允许创建的ConfigMap数量上限为10个、常用于存储配置信息
persistentvolumeclaims: "5" # 允许创建的PVC数量上限为5个、防止存储资源滥用(每个 PVC 需绑定 PV)
pods: "50" # 允许运行的Pod数量上限为 50 个
services: "10" # 允许创建的Service数量上限为 10 个
services.nodeports: "5" # 允许创建的NodePort类型 Service 数量上限为 5 个
secrets: "10" # 允许创建的Secret数量上限为 10 个、限制敏感信息(如证书、密码)的存储对象数量。
//应用yaml文件
kubectl apply -f number-quota.yaml
//检查命名空间限额
kubectl get ResourceQuota -n number
kubectl describe ns number
5.Label标签
标签(Label)是附加在 Kubernetes 资源对象(如 Pod、Service、Node 等)上的键值对(Key-Value),用于标识和分类资源,方便用户根据业务需求灵活管理
// 创建标签语法
kubectl label 资源类型 资源名称 <label-key>=<label-value>
//删除标签语法
kubectl label 资源类型 资源名称 <label-key>-
//查看标签语法
kubectl get 资源类型 {资源名称}--show-labels
应用案例:
//创建测试容器
kubectl run nginx--image=nginx
//查看pod
kubectl get pods
//查看pod标签
kubectl get pods--show-labels
//给已存在的pod打标签
kubectl label pods nginx release=v1 app=web
//查看pod标签
kubectl get pods--show-labels
//删除pod资源标签
kubectl label pods nginx release-
//查看资源标签
kubectl get pods--show-labels
//查看默认名称空间下所有pod资源的标签
kubectl get pods--show-labels
//查看默认名称空间下指定pod具有的所有标签
kubectl get pods nginx--show-labels
//列出默认名称空间下标签key是app的pod,不显示标签
kubectl get pods-l app
//列出默认名称空间下标签key是app、值是web的pod,不显示标签
kubectl get pods-l name=tomcat
//列出默认名称空间下标签key是name的所有pod,并打印对应的标签值
kubectl get pods-L name
//查看所有名称空间下的所有pod的标签
kubectl get pods --all-namespaces --show-labels
//列出默认名称空间下标签key是app的pod,并显示key的值
kubectl get pods-L app
通过标签选择器删除pod
//查看pod中的标签
kubectl get pod --show-labels
//删除带有app=web标签的pod
kubectl delete pods-l app=web
| 角色 | IP | 主机名 | 组件 | 硬件 |
|---|---|---|---|---|
| 控制节点 | 192.168.128.11 | k8s-master-01 | apiserver controller-manager scheduler etcd containerd | CPU:4vcpu 硬盘:100g 内存:4g 开启虚拟化 |
| 工作节点 | 192.168.128.21 | k8s-node-01 | kubelet kube-proxy containerd calico coredns | CPU:2vcpu 硬盘:50g 内存:2g 开启虚拟化 |
| 工作节点 | 192.168.128.22 | k8s-node-02 | kubelet kube-proxy containerd calico coredns | CPU:2vcpu 硬盘:50g 内存:2g 开启虚拟化 |