四.常用项

一.metrice-server的部署

WARNING

在 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的基础了解

WARNING

Namespace(命名空间)在很多情况下用于多租户的资源隔离、将集群内部的资源对象分配到不同的Namespace中、形成逻辑上分组的不同项目、小组或用户组、例如、可以为test、devlopment、production环境分别创建各自的命名空间。

应用场景:

1、多租户部署:不同的团队或租户可以在同一个Kubernetes集群中创建自 己的Namespace,从而实现资源隔离和权限隔离。

2、多环境部署:在同一个Kubernetes集群中,可以为不同的环境(如开发、 测试、生产等)创建不同的Namespace,从而避免资源冲突和环境混乱。

3、应用拆分部署:将一个大型应用拆分为多个微服务,每个微服务可以通 过创建独立的Namespace来进行资源隔离和管理。

4、测试与运维:测试人员可以在自己的Namespace中部署测试环境,运维 人员可以在自己的Namespace中进行运维操作。

5、安全和合规:通过为不同的应用程序或服务创建独立的Namespace,可 以增强安全性和合规性,从而避免可能的安全漏洞或数据泄露。

实现原理:

WARNING

为不同的资源对象分配唯一的标识符、将它们隔离在不同的虚拟集群中、通过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的资源限额

WARNING

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总量。
.storageclass.storage.k8s.io /requests.storage在所有与相关的持久卷申领中,存储请求的总和不能超过该值。
.storageclass.storage.k8s.io /persistentvolumeclaims在与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标签

WARNING

标签(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.11k8s-master-01apiserver
controller-manager
scheduler
etcd
containerd
CPU:4vcpu
硬盘:100g
内存:4g
开启虚拟化
工作节点192.168.128.21k8s-node-01kubelet
kube-proxy
containerd
calico
coredns
CPU:2vcpu
硬盘:50g
内存:2g
开启虚拟化
工作节点192.168.128.22k8s-node-02kubelet
kube-proxy
containerd
calico
coredns
CPU:2vcpu
硬盘:50g
内存:2g
开启虚拟化