一、安装前的准备
1.1、k8s的常见安装方式
目前安装Kubernetes的方式多样,主要是kubeadm,kops,Rancher,手动部署,Kubespray:
| 序号 | 说明 |
|---|---|
| 1 | kubeadm是官方推荐方案,简单方便。 |
| 2 | Kops与各云平台整合度非常高,使用GCE/AWS的话,还是非常推荐的。 |
| 3 | 若说kuernetes类似于IaaS+,那么Rancher就是标准的PaaS,完全基于web管理,但是内部实现细节无法获知。 |
| 4 | 手动二进制部署方式可以了解Kubernetes的各个组件运作机制,专业运维人员推荐这种方法。 |
| 5 | kubespray是一个基于Ansible的部署方案,要部署的话,仅仅需要写一下部署配置,声明一些镜像地址即可自动完成安装。 |
1.2、安装规划与主机名配置
| 主机名称 | IP地址 | 集群角色 | 系统版本 |
|---|---|---|---|
| k8s-master | 192.168.1.141 | master | OpenEuler2403-sp2 |
| k8s-node1 | 192.168.1.142 | node1 | OpenEuler2403-sp2 |
| k8s-node2 | 192.168.1.143 | node2 | OpenEuler2403-sp2 |
查看和修改Linux的主机名称
https://coffeemilk.blog.csdn.net/article/details/152363961
Linux的全新网络管理命令行工具------nmcli
https://coffeemilk.blog.csdn.net/article/details/148851886
bash
#1-修改主机名称并让其生效(如:修改主机名称为【k8s-master】)
hostnamectl set-hostname k8s-master
systemctl restart systemd-hostnamed
exec bash
hostname
#2-给这三台服务器都配置本地的域名解析
cat >>/etc/hosts <<EOF
192.168.1.141 k8s-master
192.168.1.142 k8s-node1
192.168.1.143 k8s-node2
EOF



1.3、开启流量转发
启用桥接网络上的IPv6和IPv4流量,通过iptables进行过滤,并启动IP转发,运行内核转发IPv4包,确保跨界点的Pod间通信。
bash
#1-开启流量转发(每台k8s服务器都需要开启)
cat > /etc/sysctl.d/k8s.conf << EOF
#开启IPv4内核转发,Pod跨节点通信、Service转发必备
net.ipv4.ip_forward = 1
#网桥流量交给iptables处理(配合br_netfilter模块)
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
# 调高连接跟踪最大值,集群大量Pod防丢包
net.nf_conntrack_max = 131072
net.netfilter.nf_conntrack_max = 131072
# 优化TCP队列,高并发集群防拥塞
net.core.somaxconn = 32768
# 禁用内存交换
vm.swappiness=0
EOF
#2-加载br_netfilter模块,并让br_netfilter模块开机自动加载
modprobe br_netfilter
lsmod | grep br_netfilter
echo "br_netfilter" >> /etc/modules-load.d/k8s.conf
#3-加载nf_conntrack模块,并让nf_conntrack模块开机自动加载
modprobe nf_conntrack
lsmod | grep nf_conntrack
echo "nf_conntrack" >> /etc/modules-load.d/k8s.conf
#4-让k8s内核参数生效
sysctl -p /etc/sysctl.d/k8s.conf
#5-【/etc/rc.local】是 Linux 开机自动运行脚本,已经将modprobe br_netfilter、sysctl 等内核配置写进去,因此必须有执行权限(x),开机才会自动运行,默认权限是 644(无执行权限),开机不生效
chmod 755 /etc/rc.local
#6-注意:在openeuler系统中,由于/etc/sysctl.conf中也定义了net.ipv4.ip_forward参数,因此在/etc/sysctl.conf中,找到'net.ipv4.ip_forward=0'行,然后注释,上面的配置才能生效。
1.4、关闭防火墙与selinux
bash
#关闭防火墙和selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
systemctl disable --now firewalld
1.5、彻底关闭swap
关闭swap很关键【因为swap打开,会导致k8s无法正常运行】。但在openeuler下,不能仅是临时关闭swap,要永久关闭。
bash
#1-临时关闭系统的交换分区
swapoff -a
cp /etc/fstab /etc/fstab.bak
cat /etc/fstab.bak | grep -v swap > /etc/fstab
#2-确认systemctl系统服务中swap分区名的方法
systemctl list-unit-files |grep swap
#3-使用systemctl指令mask参数关闭对应swap分区服务(显示disabled才表示彻底关闭了)
systemctl mask swap.target
systemctl mask 'dev-disk-by\x2duuid-2617a1d1\x2d8202\x2d403b\x2db35d\x2d08313c1929c2.swap'
systemctl list-unit-files |grep swap
#4-重启服务器并查看swap数据是否显示0,显示0则表示彻底禁用了,否则还需要按照如上2、3方法再次执行【一般需要禁用2次就彻底禁用了】
reboot
top


1.6、配置OpenEuler的yum源
OpenEuler镜像仓库列表
https://www.openeuler.openatom.cn/zh/mirror/list/
由于OpenEuler服务器默认的yum源较慢,因此推荐修改为华为云镜像源:
bash
#直接将原有源替换为华为云的源
#方法一:直接替换为华为云的源
cd /etc/yum.repos.d/
cp -p openEuler.repo openEuler.repo.old
sed -i 's|repo.openeuler.org|repo.huaweicloud.com/openeuler|g' /etc/yum.repos.d/openEuler.repo
sed -i 's|mirrors.openeuler.org|mirrors.huaweicloud.com|g' /etc/yum.repos.d/openEuler.repo
#清理并重新生成
yum clean all
yum makecache

bash
#方法二:手动将主机的yum源修改为华为云的
cd /etc/yum.repos.d/
mv openEuler.repo openEuler.repo.old
vi openEuler.repo
#【openEuler.repo】文件的内容如下(注意:具体的openEuler版本需要根据自己主机系统的版本修改):
[OS]
name=OS
baseurl=https://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/OS/$basearch/
metalink=https://mirrors.huaweicloud.com/metalink?repo=$releasever/OS&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/OS/$basearch/RPM-GPG-KEY-openEuler
[everything]
name=everything
baseurl=https://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/everything/$basearch/
metalink=https://mirrors.huaweicloud.com/metalink?repo=$releasever/everything&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/everything/$basearch/RPM-GPG-KEY-openEuler
[EPOL]
name=EPOL
baseurl=https://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/EPOL/main/$basearch/
metalink=https://mirrors.huaweicloud.com/metalink?repo=$releasever/EPOL/main&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/OS/$basearch/RPM-GPG-KEY-openEuler
[debuginfo]
name=debuginfo
baseurl=https://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/debuginfo/$basearch/
metalink=https://mirrors.huaweicloud.com/metalink?repo=$releasever/debuginfo&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/debuginfo/$basearch/RPM-GPG-KEY-openEuler
[source]
name=source
baseurl=https://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/source/
metalink=https://mirrors.huaweicloud.com/metalink?repo=$releasever&arch=source
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/source/RPM-GPG-KEY-openEuler
[update]
name=update
baseurl=https://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/update/$basearch/
metalink=https://mirrors.huaweicloud.com/metalink?repo=$releasever/update&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/OS/$basearch/RPM-GPG-KEY-openEuler
[update-source]
name=update-source
baseurl=https://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/update/source/
metalink=https://mirrors.huaweicloud.com/metalink?repo=$releasever&arch=source
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP2/source/RPM-GPG-KEY-openEuler
#清理并重新生成
yum clean all
yum makecache
二、k8s的安装部署
2.1、安装k8s所需的软件包
bash
#安装k8s所需的软件包【规划的k8s每台主机都执行一遍】
yum install -y containerd
yum install -y kubernetes*
yum install -y cri-tools
注意:若系统中已经安装了Docker,请确保在安装containerd之前卸载Docker,否则可能会引发冲突。 containerd要求使用1.6.22-15或更高版本,如果下载的版本过低请运行以下命令升级成1.6.22-15版本,或自行升级。
bash
#1-卸载已有docker命令
#1.1-先停止 Docker 服务
systemctl stop docker
systemctl disable docker
#1.2-卸载 Docker 所有安装包
dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
#1.3-删除残留数据(镜像、容器、卷、配置)
#注意:这一步会清空所有 Docker 数据,不可逆,确认要删再执行
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
rm -rf /etc/docker
#1.4-清理缓存
dnf clean all
#1.5-验证是否卸载完成【执行下面命令,提示找不到命令就说明卸载成功】
docker --version
#2-OpenEuler中升级containerd为1.6.22-15及其更高版本命令
#2.1-下载containerd-1.6.22-27.oe2403sp2.x86_64.rpm包
wget --no-check-certificate https://repo.openeuler.org/openEuler-24.03-LTS-SP2/update/x86_64/Packages/containerd-1.6.22-27.oe2403sp2.x86_64.rpm
#2.2-安装下载好的containerd-1.6.22-27.oe2403sp2.x86_64.rpm包
rpm -Uvh containerd-1.6.22-27.oe2403sp2.x86_64.rpm



2.2、下载cni组件
bash
#下载cni组件【规划的k8s每台主机都执行一遍】
mkdir -p /opt/cni/bin
cd /opt/cni/bin
wget --no-check-certificate https://github.com/containernetworking/plugins/releases/download/v1.9.1/cni-plugins-linux-amd64-v1.9.1.tgz -c
tar -zxvf cni-plugins-linux-amd64-v1.9.1.tgz

2.3、配置containerd及其加速器
bash
#配置containerd【规划的k8s每台主机都执行一遍】
#1-生成containerd的配置文件【config.toml】
mkdir -p /etc/containerd && cd /etc/containerd/
containerd config default > config.toml
#2-编辑生成的containerd配置文件【config.toml】
vi config.toml
#【config.toml】文件修改的内容如下表所示:
|----------------------------------|----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| /etc/containerd/config.toml 修改内容 | 修改前 | 修改后 |
| 配置pause_image | sandbox_image = "registry.k8s.io/pause:3.6" | sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6" |
| 将cgroup驱动指定为systemd | SystemdCgroup = false | SystemdCgroup = true |
| 关闭"registry.k8s.io"镜像源证书验证 | [plugins."io.containerd.grpc.v1.cri".registry.configs] | [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.k8s.io".tls] insecure_skip_verify = true |
| 配置containerd镜像加速器 | [plugins."io.containerd.grpc.v1.cri".registry.mirrors] | [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://docker.1ms.run","https://docker.m.daocloud.io","https://docker.xuanyuan.me"] |
bash
#【config.toml】文件修改的内容命令如下:
#1-配置pause_image,找到sandbox镜像地址修改为国内的阿里云镜像
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"#' /etc/containerd/config.toml
#2-将cgroup驱动指定为systemd
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
#3-关闭"registry.k8s.io"镜像源证书验证
sed -i '/plugins."io.containerd.grpc.v1.cri".registry.configs/a\
[plugins."io.containerd.grpc.v1.cri".registry.configs."registry.k8s.io".tls]\
insecure_skip_verify = true
' /etc/containerd/config.toml
#4-配置containerd镜像加速器
sed -i '/\[plugins."io.containerd.grpc.v1.cri".registry.mirrors\]/a \
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\
endpoint = ["https://docker.1ms.run","https://docker.m.daocloud.io","https://docker.xuanyuan.me"]
' /etc/containerd/config.toml
bash
#containerd配置文件修改完成后,重启containerd服务
systemctl daemon-reload
systemctl enable containerd
systemctl restart containerd
systemctl status containerd.service






2.4、配置crictl使用containerd作为容器运行时
bash
#配置crictl使用containerd作为容器运行时【规划的k8s每台主机都执行一遍】
#执行如下命令后【会生成配置文件/etc/crictl.yaml】
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock
cat /etc/crictl.yaml

2.5、配置kubelet使用systemd作为cgroup驱动
bash
#配置kubelet使用systemd作为cgroup驱动
systemctl enable kubelet.service
echo 'KUBELET_EXTRA_ARGS="--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"' >> /etc/sysconfig/kubelet

2.6、使用Kubeadm创建集群
bash
#使用Kubeadm创建集群
#1-生成集群配置文件【只需要在master节点操作即可】
#1.1-在master节点生成集群配置文件
cd
kubeadm config print init-defaults --component-configs KubeletConfiguration >> kubeletConfig.yaml
#1.2-编辑master节点生成的集群配置文件(编辑内容请看下表)
#2-初始化部署k8s集群【只需要在master节点操作即可】
#2.1-初始化k8s集群
kubeadm init --config kubeletConfig.yaml
#2.2-初始化成功后,指定kubectl使用的配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#2.3-获取k8s集群下的所有节点【注意:查看k8s集群中的节点都是NotReady 状态,这是因为还没有安装网络插件,接下来会配置安装】
kubectl get nodes
#2.4-在其他k8s节点(如:192.168.1.142、192.168.1.143)中执行刚才在master节点下初始化成功后末尾的加入k8s集群命令即可将这些节点加入到集群中
##注意:在这里的--token来自前面kubeadm init输出提示,如果当时没有记录下来可以通过【kubeadm token create --ttl 0 --print-join-command】命令找回, token是有24小时有效期的:
kubeadm join 192.168.1.141:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:0d901afd42bfdc871b0845600d0b99c0293fc2ce7bd318ce830683b4f7a507eb
#2.5-再次查看k8s集群节点情况,是否其余的两个节点已经添加到集群中,如果节点状态显示为not ready,是因为网络插件未成功部署。所以,接下来还需要安装网络插件。
kubectl get nodes
| kubeadm.yaml文件修改属性 | 说明 |
|---|---|
| advertiseAddress | 值配置k8s中的master节点所在服务器IP,可通过【ip a】命令获取 |
| criSocket | 值配置containerd.sock所在路径(默认是:unix:///var/run/containerd/containerd.sock); 可通过执行【find / -name containerd.sock】命令查找 |
| name | 值配置文件所在主机的名称,可通过【hostname】命令获取 |
| imageRepository | 值是镜像仓库地址(默认是【registry.k8s.io】; 国内可修改为【registry.aliyuncs.com/google_containers】) |
| kubernetesVersion | 值是版本信息,必须与我们安装的k8s组件版本一致,可通过【kubelet --version】或【kubeadm version】或【kubectl version】命令获取。 |
| serviceSubnet | 指定service网络地址段。持默认(10.96.0.0/12)即可 |
| podSubnet | 指定pod网络地址段。保持默认即可。 |







2.7、部署网络插件
网络插件可以选择【calico】和【flannel 】;calico适合多节点大型复杂网络【推荐使用】,flannel适合小型网络。
bash
#部署网络插件
#1-下载calico资源文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml -c
#2-使用kubectl apply部署网络插件calico.yaml
kubectl apply -f calico.yaml
#2.1-Calico网络插件的安装过程,需要下载三个镜像文件【docker.io/calico/cni】【docker.io/calico/node】【docker.io/calico/kube-controllers】(可通过【cat calico.yaml | grep image】命令查看到是这几个镜像),下载完成,网络插件即可正常工作。等网络插件镜像下载完成以后,看到node的状态会变成ready,执行如下命令查看:
crictl images
kubectl get nodes
#2.2-【可选】如果发现某个节点还是处于NotReady状态,可以重启此节点的kubelet服务,然后此节点就会重新下载需要的镜像。
systemctl restart kubelet
systemctl status kubelet
#2.3-查看pod状态
kubectl get pods -n kube-system



三、让k8s的工作节点可使用kubectl命令方法
3.1、让k8s的工作节点可直接使用kubectl完整命令【不安全】
注意:Kubernetes 只有主节点(Master/ControlPlane) 才能直接用 kubectl,Worker 节点默认没有权限配置 ,所以会报:connection to server localhost:8080 was refused。若要解决在fei非zhu主节点的服务器上运行kubectl命令则执行如下操作:
bash
#解决k8s节点使用kubectl命令报错问题
#1-方法一:
#1.1-复制k8s的master节点上的授权文件内容
cat /etc/kubernetes/admin.conf
#1.2-在需要执行【kubectl】命令的节点执行如下操作:
mkdir -p ~/.kube
vi ~/.kube/config
#【~/.kube/config】文件的内容就是k8s的master节点上的授权文件内容【/etc/kubernetes/admin.conf】
#2-方法二:直接在需要使用kubectl的服务器执行
mkdir -p /root/.kube
scp -p -P 22 root@主节点IP:/etc/kubernetes/admin.conf /root/.kube/config
kubectl get nodes
注意:直接把主节点的 /etc/kubernetes/admin.conf 复制给所有 worker 节点,在生产环境是非常不安全的,相当于给了节点 "集群最高管理员权限",风险很高!!!


3.1.1、为什么直接复制 admin.conf 不安全?
/etc/kubernetes/admin.conf 里包含的是 cluster-admin 超级管理员权限的证书和密钥,它能:
- 查看、修改、删除集群里的所有资源(包括其他节点、命名空间、secret)
- 访问集群里所有的敏感数据(比如数据库密码、密钥)
- 执行任意容器、直接获取宿主机 root 权限
如果任何一个 worker 节点被入侵,攻击者就能拿到集群的完全控制权,整个集群直接沦陷。
| 场景 | 风险等级 | 说明 |
|---|---|---|
| 个人测试 / 学习环境 | 低 | 集群里没有敏感数据,节点也不对外暴露,只是自己练手 |
| 生产环境 / 有业务数据 | 极高 | 一旦节点被攻破,集群所有数据都可能被窃取或篡改 |
3.2、让k8s的工作节点可直接使用kubectl命令【推荐的安全做法】
3.2.1、在工作节点上只给必要的权限
创建一个仅用于查看节点状态的权限账号,如果你只是为了在节点上调试、查看状态,可以:
- 只给
get, list, watch权限,不给create, update, delete; - 配置 RBAC 时限制命名空间,不要给 cluster-admin;
- 定期轮换证书(
admin.conf的证书有效期通常是 1 年,普通用户证书可以设置更短)。
bash
#一键生成【安全只读权限】kubeconfig 脚本(最终配置文件的生成路径是【/root/node-reader.kubeconfig】)
vi onlyread-k8s-config.sh
#【onlyread-k8s-config.sh】文件的完整内容如下:
#!/bin/bash
# ===================== 配置 =====================
SA_NAME="node-reader"
SA_NS="kube-system"
KUBECONFIG_OUTPUT="/root/node-reader.kubeconfig"
# ================================================
echo "===== 开始创建安全只读权限 kubeconfig ====="
# 1. 创建只读服务账号
kubectl create sa $SA_NAME -n $SA_NS --dry-run=client -o yaml | kubectl apply -f -
# 2. 创建集群只读权限
cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: $SA_NAME
rules:
- apiGroups: [""]
resources: ["nodes", "pods", "services", "endpoints", "namespaces", "persistentvolumes", "persistentvolumeclaims"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments", "daemonsets", "statefulsets", "replicasets"]
verbs: ["get", "list", "watch"]
- apiGroups: ["batch"]
resources: ["jobs", "cronjobs"]
verbs: ["get", "list", "watch"]
EOF
# 3. 绑定权限
kubectl create clusterrolebinding $SA_NAME-binding \
--clusterrole=$SA_NAME \
--serviceaccount=$SA_NS:$SA_NAME \
--dry-run=client -o yaml | kubectl apply -f -
# 4. 获取 API Server 地址
APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
# 5. 获取 CA 证书
CA_CRT=$(kubectl config view --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}')
# 6. 获取 ServiceAccount Token(适配新版本)
TOKEN=$(kubectl create token $SA_NAME -n $SA_NS --duration=87600h)
# 7. 生成安全 kubeconfig 文件
cat > $KUBECONFIG_OUTPUT << EOF
apiVersion: v1
kind: Config
clusters:
- name: default-cluster
cluster:
certificate-authority-data: $CA_CRT
server: $APISERVER
contexts:
- name: default-context
context:
cluster: default-cluster
namespace: default
user: $SA_NAME
current-context: default-context
users:
- name: $SA_NAME
user:
token: $TOKEN
EOF
echo -e "\n✅ 生成完成!安全只读 kubeconfig 路径:$KUBECONFIG_OUTPUT"
echo -e "⚠️ 权限说明:只能查看集群状态,无法修改/删除任何资源"
echo -e "👉 发给工作节点使用【注意:/root/.kube必须已经存在(ssh -p 22 root@节点IP "mkdir -p /root/.kube")】:scp -p -P 22 $KUBECONFIG_OUTPUT root@节点IP:/root/.kube/config"
echo -e "👉 工作节点拉取使用【注意:/root/.kube必须已经存在(mkdir -p /root/.kube)】:scp -p -P 22 root@主节点IP:$KUBECONFIG_OUTPUT /root/.kube/config"
#授予一键生成【安全只读权限】kubeconfig 脚本执行权限
chmod +x onlyread-k8s-config.sh
#一键生成【安全只读权限】的配置/root/node-reader.kubeconfig
./onlyread-k8s-config.sh

3.2.2、仅在主节点上使用 kubectl(最简单、最安全)
不建议在所有 worker 节点上都装 kubectl,直接在主节点上操作集群即可:
- 所有
kubectl命令都在主节点执行 - worker 节点只跑容器,不管理集群
- 从根源上避免权限泄露问题