Kubernetes 1.30.2 集群部署与管理实战

本文记录使用 kubeadm 在 Ubuntu 24.04 上部署一套三节点 Kubernetes 1.30.2 集群的完整过程。每个命令都标注了在哪台机器上执行,读者照着敲即可。

1. 环境说明

1.1 软件版本

组件版本
宿主机VMware Workstation 17
操作系统Ubuntu 24.04 Server (minimal)
Kubernetes1.30.2
containerd1.7.20
nerdctl1.7.7
CNI plugins1.6.0

1.2 虚拟机配置

  • 2 vCPU / 4 GB 内存 / 100 GB 硬盘
  • 一张 NAT 网卡
  • 不创建 swap 分区(Kubernetes 强制要求)

1.3 节点规划

主机名IP角色
master30.k8s.local10.1.8.30control-plane
worker31.k8s.local10.1.8.31worker
worker32.k8s.local10.1.8.32worker

阅读提示:每个命令块(黑底彩字)的第一行就是执行该命令的机器,比如 [root@master30 ~]# 表示在 master30 上以 root 身份执行。命令的输出结果放在 灰色引用块 中,一眼就能区分。

2. 安装方式选择

Kubernetes 有多种安装方式,各有利弊:

方式适用场景推荐度
kubeadm生产自建、CKA 考试、标准集群⭐⭐⭐⭐⭐
二进制手工原理研究、深度定制⭐⭐
Sealos / KubeKey快速搭建⭐⭐⭐⭐
k3s / k0s边缘节点、低配机器⭐⭐⭐⭐
minikube / kind本地开发、快速验证⭐⭐⭐
云厂商托管(ACK/EKS 等)云上生产⭐⭐⭐⭐

本文选用 kubeadm——Kubernetes 官方标准工具,兼容性最好,文档最全。

3. 系统初始化

以下操作在模板机上执行,之后通过 VMware 完全克隆生成三台节点,再分别修改主机名和 IP。这样只需配置一次,三台机器环境完全一致。

3.1 换源

国内访问 Ubuntu 官方源速度很慢,换成华为云和阿里云的镜像。

[root@ubuntu2404 ~]# cat > /etc/apt/sources.list.d/ubuntu.sources <<'EOF'
Types: deb
URIs: http://mirrors.huaweicloud.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF

添加 containerd 和 Kubernetes 仓库:

[root@ubuntu2404 ~]# curl -fsSL https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg | \
  gpg --dearmour -o /etc/apt/trusted.gpg.d/containerd.gpg
[root@ubuntu2404 ~]# cat <<'EOF' > /etc/apt/sources.list.d/docker-ce.list
deb [arch=amd64] https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu noble stable
EOF

[root@ubuntu2404 ~]# curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key | \
  gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
[root@ubuntu2404 ~]# echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" \
  > /etc/apt/sources.list.d/kubernetes.list

3.2 安装基础软件

[root@ubuntu2404 ~]# apt update && apt install -y vim lrzsz bash-completion \
  open-vm-tools apt-transport-https sshpass chrony

3.3 网络配置

[root@ubuntu2404 ~]# cat > /etc/netplan/00-static.yaml <<EOF
network:
  ethernets:
    ens33:
      dhcp4: no
      addresses:
        - 10.1.8.30/24
      routes:
        - to: default
          via: 10.1.8.2
      nameservers:
        addresses:
          - 10.1.8.2
          - 223.5.5.5
  version: 2
EOF
[root@ubuntu2404 ~]# chmod 600 /etc/netplan/00-static.yaml
[root@ubuntu2404 ~]# netplan apply

这里 IP 先写成 10.1.8.30,克隆后再根据实际角色改。

配置 /etc/hosts,让三台机器能通过主机名互相访问:

[root@ubuntu2404 ~]# cat <<'EOF' >> /etc/hosts

###### kubernetes #####
10.1.8.30 master30.k8s.local master30
10.1.8.31 worker31.k8s.local worker31
10.1.8.32 worker32.k8s.local worker32
EOF

3.4 内核参数

Kubernetes 依赖 IPVS 做负载均衡、overlay/bridge 做容器网络,需要加载对应内核模块并调整参数。

# 1. 关闭 swap(Kubernetes 硬性要求)
[root@ubuntu2404 ~]# swapoff -a && sed -i '/^.*swap/d' /etc/fstab && rm -f /swap.img

# 2. 安装 IPVS 依赖包
[root@ubuntu2404 ~]# apt install -y iptables ipvsadm ipset conntrack

# 3. 临时加载内核模块(立即生效)
[root@ubuntu2404 ~]# modprobe overlay br_netfilter
[root@ubuntu2404 ~]# modprobe ip_vs ip_vs_rr ip_vs_wrr ip_vs_lc ip_vs_sh nf_conntrack

# 4. 永久加载(重启后自动生效)
[root@ubuntu2404 ~]# cat > /etc/modules-load.d/k8s-net.conf <<EOF
br_netfilter
overlay
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_lc
ip_vs_sh
nf_conntrack
EOF

# 5. 内核参数
[root@ubuntu2404 ~]# cat > /etc/sysctl.d/k8s.conf <<'EOF'
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF
[root@ubuntu2404 ~]# sysctl -p /etc/sysctl.d/k8s.conf

各参数含义:

  • bridge-nf-call-iptables:让 Linux 网桥的流量经过 iptables 过滤,K8s 网络必需
  • ip_forward=1:开启路由转发
  • swappiness=0:禁用 swap 的使用倾向

3.5 SSH 配置

[root@ubuntu2404 ~]# echo 'UseDNS no' >> /etc/ssh/sshd_config
[root@ubuntu2404 ~]# echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
[root@ubuntu2404 ~]# ssh-keygen -N '' -f ~/.ssh/id_rsa -t rsa
[root@ubuntu2404 ~]# sshpass -p 123 ssh-copy-id root@localhost

3.6 配置 containerd

[root@ubuntu2404 ~]# apt install -y containerd.io=1.7.20-1 cri-tools

# 生成默认配置
[root@ubuntu2404 ~]# containerd config default > /etc/containerd/config.toml

# 两项关键修改
[root@ubuntu2404 ~]# sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
[root@ubuntu2404 ~]# sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.k8s.io/pause:3.9"|' /etc/containerd/config.toml

SystemdCgroup = true 确保 containerd 使用 systemd 作为 cgroup 驱动,与 kubelet 保持一致,避免 cgroup 混乱。

配置镜像加速(国内必备,否则拉镜像极慢甚至失败):

[root@ubuntu2404 ~]# vim /etc/containerd/config.toml

找到 [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 部分,添加:

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  endpoint = ["https://docker.m.daocloud.io","https://docker.1ms.run"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
  endpoint = ["https://k8s.m.daocloud.io","https://registry.cn-hangzhou.aliyuncs.com/google_containers"]

重启生效:

[root@ubuntu2404 ~]# systemctl restart containerd

3.7 安装 Kubernetes 组件

[root@ubuntu2404 ~]# apt install -y kubeadm=1.30.2-1.1 kubelet=1.30.2-1.1 kubectl=1.30.2-1.1
[root@ubuntu2404 ~]# systemctl enable kubelet --now

此时 systemctl status kubelet 会显示 activating——这是正常的。kubelet 在等 kubeadm init 生成 /var/lib/kubelet/config.yaml,没有这个文件它起不来。初始化集群后就会自动变为 active。

[root@ubuntu2404 ~]# init 0    # 关机,准备克隆

3.8 克隆节点并修改网络

用 VMware 完全克隆出 3 台虚拟机。克隆完成后,分别开机,在每台机器上修改主机名和 IP:

master30:

[root@ubuntu2404 ~]# hostnamectl set-hostname master30.k8s.local
# 修改 /etc/netplan/00-static.yaml,IP 改为 10.1.8.30
[root@master30 ~]# netplan apply

worker31:

[root@ubuntu2404 ~]# hostnamectl set-hostname worker31.k8s.local
# 修改 /etc/netplan/00-static.yaml,IP 改为 10.1.8.31
[root@worker31 ~]# netplan apply

worker32:

[root@ubuntu2404 ~]# hostnamectl set-hostname worker32.k8s.local
# 修改 /etc/netplan/00-static.yaml,IP 改为 10.1.8.32
[root@worker32 ~]# netplan apply

4. 初始化集群

4.1 预拉取镜像

初始化过程中需要下载 K8s 核心镜像,提前拉取可以避免 init 时等太久。

在 master30 上执行:

[root@master30 ~]# kubeadm config images pull --kubernetes-version=v1.30.2

国内网络慢的话,走阿里云镜像仓库:

[root@master30 ~]# kubeadm config images pull --kubernetes-version=v1.30.2 \
  --image-repository registry.aliyuncs.com/google_containers

Worker 节点至少需要 kube-proxy 和 pause 这两个镜像:

在 worker31 上执行:

[root@worker31 ~]# nerdctl pull registry.k8s.io/kube-proxy:v1.30.2
[root@worker31 ~]# nerdctl pull registry.k8s.io/pause:3.9

在 worker32 上执行:

[root@worker32 ~]# nerdctl pull registry.k8s.io/kube-proxy:v1.30.2
[root@worker32 ~]# nerdctl pull registry.k8s.io/pause:3.9

4.2 kubeadm init——初始化控制平面

在 master30 上执行:

[root@master30 ~]# kubeadm init \
  --kubernetes-version=v1.30.2 \
  --pod-network-cidr=10.224.0.0/16

关键参数:

  • --pod-network-cidr:Pod 网络范围,不同 CNI 插件有不同要求。本文用 Calico,后面会改成 10.224.0.0/16
  • --apiserver-advertise-address:如果 master 有多张网卡,建议显式指定 API Server 对外监听的 IP,例如 --apiserver-advertise-address=10.1.8.30

初始化成功后,终端会输出:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.1.8.30:6443 --token mi0yt8.1tzza4q64dr8y3pc \
 --discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd

⚠️ 把最后那行 join 命令复制保存下来! worker 加入集群全靠它。

4.3 配置 kubectl 凭据

在 master30 上执行:

[root@master30 ~]# mkdir -p $HOME/.kube
[root@master30 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

此时可以查看节点状态——由于还没装网络插件,节点是 NotReady:

[root@master30 ~]# kubectl get nodes
NAME                STATUS     ROLES           AGE   VERSION
master30.k8s.local   NotReady   control-plane   2m    v1.30.2

kubectl 凭据查找优先级:

  1. --kubeconfig 命令行参数
  2. $KUBECONFIG 环境变量
  3. ~/.kube/config 默认路径

5. 部署 Calico 网络

Kubernetes 本身不提供网络实现,需要安装 CNI 网络插件。本文选用 Calico——性能好、功能全、社区活跃。

以下操作均在 master30 上执行。

5.1 下载并修改配置

[root@master30 ~]# wget --no-check-certificate \
  https://raw.githubusercontent.com/projectcalico/calico/v3.30.7/manifests/calico.yaml

确认集群的 Pod CIDR,确保 Calico 配置与之一致:

[root@master30 ~]# kubectl get cm -n kube-system kubeadm-config -o yaml | grep podSubnet
   podSubnet: 10.224.0.0/16
[root@master30 ~]# sed -i "s|# - name: CALICO_IPV4POOL_CIDR|- name: CALICO_IPV4POOL_CIDR|g" calico.yaml
[root@master30 ~]# sed -i "s|#   value: \"192.*|  value: \"10.224.0.0/16\"|g" calico.yaml

5.2 拉取 Calico 镜像

在 所有三台节点 上分别执行:

[root@master30 ~]# nerdctl pull docker.io/calico/cni:v3.30.7
[root@master30 ~]# nerdctl pull docker.io/calico/node:v3.30.7
[root@master30 ~]# nerdctl pull docker.io/calico/kube-controllers:v3.30.7
[root@worker31 ~]# nerdctl pull docker.io/calico/cni:v3.30.7
[root@worker31 ~]# nerdctl pull docker.io/calico/node:v3.30.7
[root@worker31 ~]# nerdctl pull docker.io/calico/kube-controllers:v3.30.7
[root@worker32 ~]# nerdctl pull docker.io/calico/cni:v3.30.7
[root@worker32 ~]# nerdctl pull docker.io/calico/node:v3.30.7
[root@worker32 ~]# nerdctl pull docker.io/calico/kube-controllers:v3.30.7

5.3 部署并验证

[root@master30 ~]# kubectl apply -f calico.yaml
[root@master30 ~]# kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS
kube-system   calico-kube-controllers-56fcbf9d6b-v6qsn   1/1     Running
kube-system   calico-node-vc9v6                          1/1     Running
kube-system   coredns-6d8c4cb4d-9qdxg                    1/1     Running
kube-system   coredns-6d8c4cb4d-wwfmx                    1/1     Running
kube-system   etcd-master30.k8s.local                     1/1     Running
kube-system   kube-apiserver-master30.k8s.local           1/1     Running
kube-system   kube-controller-manager-master30.k8s.local  1/1     Running
kube-system   kube-proxy-8b7tn                           1/1     Running
kube-system   kube-scheduler-master30.k8s.local           1/1     Running

所有 control-plane pod + calico-node + CoreDNS 都 Running,网络就绪。

此时再查节点状态:

[root@master30 ~]# kubectl get nodes
NAME                STATUS   ROLES           AGE   VERSION
master30.k8s.local   Ready    control-plane   5m    v1.30.2

NotReady → Ready,搞定。

6. 加入 Worker 节点

使用刚保存的 join 命令,在每台 worker 上执行:

在 worker31 上执行:

[root@worker31 ~]# kubeadm join 10.1.8.30:6443 --token mi0yt8.1tzza4q64dr8y3pc \
    --discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd

在 worker32 上执行:

[root@worker32 ~]# kubeadm join 10.1.8.30:6443 --token mi0yt8.1tzza4q64dr8y3pc \
    --discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd

Token 默认 24 小时过期。如果忘了保存 join 命令,在 master 上重新生成:

在 master30 上执行:

[root@master30 ~]# kubeadm token create --print-join-command

7. 验证集群

在 master30 上执行:

[root@master30 ~]# kubectl cluster-info
Kubernetes control plane is running at https://10.1.8.30:6443
[root@master30 ~]# kubectl version
Client Version: v1.30.2
Server Version: v1.30.2
[root@master30 ~]# kubectl get nodes
NAME                STATUS   ROLES           AGE   VERSION
master30.k8s.local   Ready    control-plane   9h    v1.30.2
worker31.k8s.local   Ready    <none>          8h    v1.30.2
worker32.k8s.local   Ready    <none>          8h    v1.30.2

三节点全部 Ready,集群部署完成。

8. 节点管理

8.1 查看节点详情

在 master30 上执行:

[root@master30 ~]# kubectl get nodes
[root@master30 ~]# kubectl describe node worker31.k8s.local

8.2 驱逐并删除一个 Worker 节点

假设要下线 worker31:

在 master30 上执行前三步:

# 1. 驱逐 Pod——把 worker31 上的 Pod 迁移到其他节点
[root@master30 ~]# kubectl drain worker31.k8s.local --ignore-daemonsets

DaemonSet 类型的 Pod(如 calico-node、kube-proxy)每个节点一份,不驱逐,用 --ignore-daemonsets 跳过。

# 2. 确认节点已进入维护模式
[root@master30 ~]# kubectl get nodes
worker31.k8s.local   Ready,SchedulingDisabled   ...
# 3. 从集群中删除
[root@master30 ~]# kubectl delete node worker31.k8s.local

然后 SSH 到 worker31 上清理残留:

[root@worker31 ~]# kubeadm reset -f

8.3 删除整个集群

按顺序操作:先清 worker,再清 master。

在 master30 上执行:

# 驱逐并删除所有 worker
[root@master30 ~]# kubectl drain worker31.k8s.local --ignore-daemonsets --force
[root@master30 ~]# kubectl drain worker32.k8s.local --ignore-daemonsets --force
[root@master30 ~]# kubectl delete node worker31.k8s.local worker32.k8s.local

在 worker31 和 worker32 上分别重置:

[root@worker31 ~]# kubeadm reset -f
[root@worker32 ~]# kubeadm reset -f

回到 master30,备份配置后删除自己:

# 可选:备份集群配置,方便重建
[root@master30 ~]# kubectl get cm kubeadm-config -n kube-system -o yaml > kubeadm.yml

编辑 kubeadm.yml,删掉非必要的字段,保留核心配置:apiServer、apiVersion、certificatesDir、clusterName、controllerManager、dns、etcd、imageRepository、kind、kubernetesVersion、networking、scheduler。

# 删除 master 节点并重置
[root@master30 ~]# kubectl delete node master30.k8s.local
[root@master30 ~]# kubeadm reset -f
[root@master30 ~]# rm -rf ~/.kube/

8.4 重建集群

在 master30 上执行:

# 使用备份的配置文件重建
[root@master30 ~]# kubeadm init --config kubeadm.yml

# 或者直接用原始命令
[root@master30 ~]# kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.224.0.0/16

# 配置凭据和网络
[root@master30 ~]# mkdir -p $HOME/.kube
[root@master30 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master30 ~]# kubectl apply -f calico.yaml

在 worker31 和 worker32 上用新的 join 命令重新加入:

[root@worker31 ~]# kubeadm join 10.1.8.30:6443 --token <新token> \
    --discovery-token-ca-cert-hash sha256:<新hash>
[root@worker32 ~]# kubeadm join 10.1.8.30:6443 --token <新token> \
    --discovery-token-ca-cert-hash sha256:<新hash>

9. Namespace 管理

Namespace 把物理集群逻辑上划分成多个虚拟集群,实现资源隔离。多团队共用一套集群时,靠 Namespace 划分各自的地盘。

9.1 默认 Namespace

Kubernetes 创建了四个默认 Namespace:

Namespace用途
default不指定 ns 时的默认落脚点
kube-system系统组件(kube-proxy、CoreDNS、Calico 等)
kube-public所有用户(含未认证)可读的公共资源
kube-node-lease节点心跳租约,用于故障检测

注意:大多数资源(Pod、Service、PVC 等)属于某个 Namespace,但 Node 和 PersistentVolume 是集群级资源,不在任何 Namespace 中。default 和 kube-system 不可删除。

9.2 基本操作

在 master30 上执行:

[root@master30 ~]# kubectl get ns

[root@master30 ~]# kubectl create ns webapp

# 也可以用 YAML 创建
[root@master30 ~]# cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
  name: webapp
EOF

# 在指定 ns 中创建 Pod
[root@master30 ~]# kubectl run nginx --image=nginx -n webapp

# 查看 ns 详情
[root@master30 ~]# kubectl describe ns webapp

# 删除 ns——会级联删除其中所有资源!
[root@master30 ~]# kubectl delete ns webapp

9.3 切换默认 Namespace

每次敲 -n webapp 很烦,直接切到目标 ns:

方法一:kubectl 自带

[root@master30 ~]# kubectl config get-contexts
CURRENT   NAME                          ...   NAMESPACE
*         kubernetes-admin@kubernetes   ...              ← 空表示 default
[root@master30 ~]# kubectl config set-context --current --namespace=webapp
[root@master30 ~]# kubectl config set-context --current --namespace=default   # 切回

方法二:kubens(推荐,比 kubectl 简洁很多)

[root@master30 ~]# wget https://codeload.github.com/ahmetb/kubectx/zip/refs/heads/master -O kubectx.zip
[root@master30 ~]# unzip kubectx.zip
[root@master30 ~]# cp kubectx-master/kubens /usr/local/bin/
[root@master30 ~]# chmod +x /usr/local/bin/kubens

[root@master30 ~]# kubens              # 列出所有 ns
[root@master30 ~]# kubens kube-system  # 切到 kube-system
[root@master30 ~]# kubens -            # 切回上一个 ns
[root@master30 ~]# kubens -c           # 查看当前 ns

10. Context 与多集群切换

10.1 理解 ~/.kube/config

kubectl 的配置文件由三部分组成:

  • clusters:集群地址 + CA 证书
  • users:用户证书 + 私钥
  • contexts:把 cluster + user + namespace 三者绑在一起,一键切换

在 master30 上执行:

[root@master30 ~]# kubectl config view
apiVersion: v1
kind: Config
current-context: kubernetes-admin@kubernetes
clusters:
- name: kubernetes
  cluster:
    certificate-authority-data: <base64编码的CA证书>
    server: https://10.1.8.30:6443
users:
- name: kubernetes-admin
  user:
    client-certificate-data: <base64编码的客户端证书>
    client-key-data: <base64编码的私钥>
contexts:
- name: kubernetes-admin@kubernetes
  context:
    cluster: kubernetes
    user: kubernetes-admin

10.2 多集群配置示例

假如你要同时管理两个集群(或同一个集群用两个身份),可以自定义 config 文件:

在 master30 上写入 ~/.kube/config:

apiVersion: v1
kind: Config
current-context: ctx-cluster1     # 默认使用这个 context

clusters:
- name: cluster1
  cluster:
    server: https://10.1.8.30:6443
    certificate-authority-data: <base64>
- name: cluster2
  cluster:
    server: https://10.1.8.30:6443
    certificate-authority-data: <base64>

users:
- name: cluster-admin
  user:
    client-certificate-data: <base64>
    client-key-data: <base64>

contexts:
- name: ctx-cluster1
  context:
    cluster: cluster1
    user: cluster-admin
    namespace: default
- name: ctx-cluster2
  context:
    cluster: cluster2
    user: cluster-admin
    namespace: default

这里两个 context 共享同一个用户 cluster-admin,绑定不同 cluster。用 kubectl config use-context 一键切换操作目标。

10.3 切换 Context

kubectl 自带:

[root@master30 ~]# kubectl config get-contexts
CURRENT   NAME             CLUSTER     AUTHINFO       NAMESPACE
*         ctx-cluster1     cluster1    cluster-admin     default
          ctx-cluster2     cluster2    cluster-admin     default
[root@master30 ~]# kubectl config use-context ctx-cluster2   # 切换

kubectx(推荐,和 kubens 同一个包):

[root@master30 ~]# cp kubectx-master/kubectx /usr/local/bin/
[root@master30 ~]# chmod +x /usr/local/bin/kubectx

[root@master30 ~]# kubectx               # 列出所有 context
[root@master30 ~]# kubectx ctx-cluster2  # 切换
[root@master30 ~]# kubectx -             # 切回上一个
[root@master30 ~]# kubectx -c            # 查看当前

10.4 通过命令构建多集群配置

不想手写 YAML?用 kubectl config 子命令一行行构建,效果一样:

[root@master30 ~]# kubectl config set-cluster cluster1 \
  --server=https://10.1.8.30:6443 \
  --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true

[root@master30 ~]# kubectl config set-cluster cluster2 \
  --server=https://10.1.8.30:6443 \
  --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true

[root@master30 ~]# kubectl config set-credentials cluster-admin \
  --client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt \
  --client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --embed-certs=true

[root@master30 ~]# kubectl config set-context ctx-cluster1 \
  --cluster=cluster1 --user=cluster-admin --namespace=default

[root@master30 ~]# kubectl config set-context ctx-cluster2 \
  --cluster=cluster2 --user=cluster-admin --namespace=default

[root@master30 ~]# kubectl config use-context ctx-cluster1

11. 总结

本文从零开始走完了以下流程:

步骤内容操作位置
系统初始化换源、关 swap、内核模块、containerd、kubeadm模板机
克隆节点VMware 完全克隆,改主机名和 IP三台各自
kubeadm init初始化控制平面master30
Calico部署 CNI 网络,三节点 Readymaster30 + workers
加入节点worker 执行 join 命令worker31、worker32
节点管理驱逐、删除、重置、重建master30 + workers
Namespace资源隔离与切换master30
Context多集群/多身份切换master30

掌握了这些,一套标准的三节点 K8s 集群就能稳定运行。后续可以继续探索 Pod、Deployment、Service、Ingress 等工作负载的玩法。

更多推荐