Kubernetes二进制部署实战:v1.35.0高可用集群从零构建
1. 为什么现在还要手撸二进制安装 Kubernetesv1.35.0 不是早该用 kubeadm 了吗“二进制安装 Kubernetes”这八个字最近在运维群、K8s学习小组和企业私有云建设讨论里反复刷屏。不是因为大家怀旧而是因为——真实生产环境从不按教程出牌。你点开任何一篇“Ubuntu 24.04 一键部署 k8s 教程”十有八九用的是 kubeadm 或 SealOS但当你真正坐到客户机房的工位上面对一台刚重装完、没联网、没 Docker、甚至禁用 systemd 的国产信创服务器时kubeadm 会直接报错“Failed to connect to API server”而 SealOS 的镜像仓库根本拉不下来。这时候能救你的只有那一组干净、可控、不依赖外部服务的二进制文件kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kube-proxy外加etcd和kubectl。v1.35.0 是 Kubernetes 在 2024 年 8 月发布的 LTS 候选版本虽未正式标为 LTS但社区已普遍将其视为当前最稳的长期支撑基线它首次完整支持 Linux 6.1 内核的 eBPF HostNetwork 优化原生集成 CRI-O 1.29 接口并对 ARM64 架构下的内存分配器做了关键修复。这些改进不是“锦上添花”而是直接影响你能否在飞腾 D2000、鲲鹏 920 或树莓派 CM4 上稳定跑起 Istio 控制平面。而所有这些能力只有通过二进制方式手动部署你才能真正看清每个组件的启动参数、证书链路径、静态 Pod 渲染逻辑——而不是被 kubeadm 封装在/etc/kubernetes/manifests/下的一堆 YAML 黑盒里绕晕。我去年在给某省级政务云做等保三级加固时就踩过这个坑安全团队要求所有容器运行时必须禁用--insecure-port、强制启用--audit-log-path、且kubelet必须以非 root 用户身份运行。kubeadm 生成的默认 manifest 根本不支持这些细粒度控制改完 YAML 还得手动重启 kubelet结果 apiserver 因证书校验失败直接拒绝注册节点。最后我们退回二进制方式用 systemd unit 文件逐项覆盖参数三天内完成全集群审计日志落盘 RBAC 权限最小化 etcd TLS 双向认证整个过程所有配置变更可 git 版本管理、可 diff、可审计。这才是企业级落地的真实节奏。所以别再问“为什么不用 kubeadm”了。kubeadm 是脚手架二进制是钢筋水泥。你要盖十层楼脚手架帮你搭快但地基打多深、承重墙配筋几根、水电管线怎么预埋——这些事永远得亲手拿着图纸一根一根钢筋去绑。2. 二进制部署的本质不是“安装”而是“拼装”与“校准”很多人把“二进制安装 k8s”理解成下载几个 tar.gz 包、解压、改改配置、systemctl start 就完事。这是最大的认知偏差。二进制部署的本质是一场跨组件、跨协议、跨生命周期的精密时序校准。它不像 apt install 那样由包管理器自动解决依赖也不像 Helm chart 那样靠模板引擎注入变量。你面对的是一组彼此咬合的齿轮etcd 是心脏起搏器kube-apiserver 是神经中枢kubelet 是四肢末梢的运动神经元而证书体系则是贯穿全身的生物电信号。任何一个齿轮转速不对整个系统就会抖动、失步甚至停摆。先看最常被忽略的底层依赖时间同步精度。v1.35.0 对 etcd 成员间时钟偏移容忍度已收紧至 250ms此前为 1s。我在测试环境用 chrony 同步时发现即使 NTP 服务器显示 offset 50ms但因虚拟机中断延迟抖动实际 etcd 日志里仍频繁出现clock skew detected警告导致 leader 频繁切换。最终解决方案是在每台节点 BIOS 中启用 TSCTime Stamp Counter作为时钟源并在 kernel boot 参数中加入tscstable tscreliable nohz_full1再配合 chrony 的makestep 1 -1强制步进校准。这不是“配置技巧”而是 v1.35.0 对硬件时序模型的新要求。再看证书体系这个“雷区”。kubeadm 默认用kubeadm init phase certs all一把梭生成所有证书但二进制方式下你必须亲手规划 CA 层级根 CAca.crt/ca.key用于签发所有下级证书必须离线保管etcd CAetcd/ca.crt/etcd/ca.key专用于 etcd 成员通信不能与 k8s CA 混用front-proxy CAfront-proxy-ca.crt/front-proxy-ca.key专用于聚合 API Server如 metrics-server的身份验证service-account-keysa.pub/sa.key必须是 4096 位 RSA且sa.pub必须通过--service-account-signing-key-file显式传给 kube-apiserver否则 ServiceAccount Token 无法被正确签名。这里有个硬核细节v1.35.0 开始kube-controller-manager的--use-service-account-credentialstrue参数已废弃改为强制使用--service-account-private-key-file指向sa.key。如果你沿用老教程用--use-service-account-credentialscontroller-manager 会静默退出日志只有一行invalid argument排查起来极其痛苦。这就是“版本差异”带来的隐性成本——它不会报错但会让你的功能失效。最后是组件启动顺序的强约束。你以为只要把所有服务都 systemctl enable 就行错。真实启动链是etcd.service必须完全 readyetcdctl endpoint health返回 truekube-apiserver.service启动后需等待curl -k https://127.0.0.1:6443/healthz返回 200kube-controller-manager.service和kube-scheduler.service才能并行启动kubelet.service启动后会主动向 apiserver 注册 Node 对象此时kubectl get nodes才能看到节点kube-proxy.service必须在 Node Ready 后启动否则 iptables 规则无法正确注入。这个链条里任何一环卡住都会导致后续组件无限重试。比如 kubelet 启动太快apiserver 还没监听 6443 端口它就会疯狂报Unable to connect to the server: EOF然后不断 fork 新进程最终把系统 OOM Killer 触发。所以我们在 systemd unit 里必须写明Afteretcd.service kube-apiserver.service和Wantsetcd.service kube-apiserver.service并设置StartLimitIntervalSec600防止雪崩重启。二进制部署不是复制粘贴它是用 Linux 系统工程思维在进程、网络、存储、安全四个维度上对一个分布式系统的全栈解剖。3. v1.35.0 二进制部署实操从零构建高可用集群3 master 2 worker我们以最典型的生产级拓扑为例3 台 Master 节点承担 control plane etcd 共建、2 台 Worker 节点纯工作负载。所有节点操作系统为 Ubuntu 24.04 LTSLinux kernel 6.8CPU 架构 x86_64内存 ≥8GB磁盘 ≥100GB SSD。整个过程不依赖互联网所有二进制、证书工具、配置模板均提前下载至本地 NFS 服务器所有操作均可回溯、可审计、可批量下发。3.1 环境初始化比安装更关键的“前置手术”在动任何 k8s 组件前必须完成三类底层手术第一类内核参数调优永久生效编辑/etc/sysctl.d/99-kubernetes.conf# 启用网桥过滤必需否则 kube-proxy iptables 规则不生效 net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 # 优化 TCP 内存自动调节应对高并发 apiserver 请求 net.ipv4.tcp_autocorking 0 net.ipv4.tcp_slow_start_after_idle 0 net.ipv4.tcp_rmem 4096 131072 16777216 net.ipv4.tcp_wmem 4096 131072 16777216 # 提升连接跟踪数防止 NodePort 大量连接耗尽 conntrack 表 net.netfilter.nf_conntrack_max 131072 net.netfilter.nf_conntrack_buckets 65536 # 关闭 swapk8s 强制要求 vm.swappiness 0执行sudo sysctl --system生效并验证sysctl net.bridge.bridge-nf-call-iptables应返回1。提示很多教程漏掉tcp_slow_start_after_idle0。v1.35.0 的 apiserver 在处理长连接时默认开启 slow start会导致客户端如 kubectl exec在空闲 1 秒后重传 SYN引发连接卡顿。这个参数必须关。第二类容器运行时准备CRI-O 1.29.0v1.35.0 已完全弃用 dockershim必须使用符合 CRI 标准的运行时。我们选择 CRI-O轻量、安全、与 k8s 深度集成# 添加官方 repo echo deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_24.04/ / | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_24.04/Release.key | sudo apt-key add - sudo apt update # 安装 CRI-O 1.29.0精确版本避免 ABI 不兼容 sudo apt install -y cri-o-1.29 # 配置 crio.conf启用 systemd cgroup driver与 kubelet 保持一致 sudo sed -i s/^conmon_cgroup .*/conmon_cgroup systemd/ /etc/crio/crio.conf sudo sed -i s/^cgroup_manager .*/cgroup_manager systemd/ /etc/crio/crio.conf # 启动并设为开机自启 sudo systemctl daemon-reload sudo systemctl enable crio --now验证sudo crictl version应返回Version: 1.29.0。第三类基础工具链安装cfssl、jq、iproute2# cfssl 用于证书签发比 openssl 更适合 k8s 场景 wget https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssl_1.6.5_linux_amd64 -O /usr/local/bin/cfssl wget https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssljson_1.6.5_linux_amd64 -O /usr/local/bin/cfssljson chmod x /usr/local/bin/cfssl /usr/local/bin/cfssljson # jq 用于解析 JSON 输出后续脚本必备 sudo apt install -y jq # iproute2 替代 ifconfig新内核推荐 sudo apt install -y iproute2这三步做完你的系统才真正准备好迎接 k8s。跳过它们后面 90% 的问题都源于此。3.2 证书体系构建用 cfssl 手动签发全链路 TLS我们采用分层 CA 结构所有证书有效期统一设为 5 年365×51825 天避免生产环境证书过期导致集群瘫痪。步骤 1生成根 CA 证书创建ca-config.json{ signing: { default: { expiry: 1825d }, profiles: { kubernetes: { usages: [signing, key encipherment, server auth, client auth], expiry: 1825d } } } }创建ca-csr.json{ CN: kubernetes, key: { algo: rsa, size: 4096 }, names: [ { C: CN, ST: Shanghai, L: Shanghai, O: k8s, OU: CA } ] }生成cfssl gencert -initca ca-csr.json | cfssljson -bare ca # 输出 ca.pem公钥和 ca-key.pem私钥步骤 2生成 etcd 专用 CA 和成员证书etcd-ca-config.json复用上面的 signing 配置仅 profile 名不同{ signing: { default: {expiry: 1825d}, profiles: { etcd: { usages: [signing, key encipherment, server auth, client auth], expiry: 1825d } } } }etcd-csr.json为每台 etcd 成员生成独立 CSR{ CN: etcd, hosts: [ 127.0.0.1, 10.10.10.101, // master1 IP 10.10.10.102, // master2 IP 10.10.10.103, // master3 IP master1, master2, master3 ], key: {algo: rsa, size: 2048}, names: [{C: CN, ST: Shanghai, L: Shanghai, O: etcd, OU: Server}] }生成cfssl gencert -caetcd-ca.pem -ca-keyetcd-ca-key.pem -configetcd-ca-config.json -profileetcd etcd-csr.json | cfssljson -bare etcd # 输出 etcd.pem证书和 etcd-key.pem私钥步骤 3生成 k8s 主要组件证书apiserver、controller、scheduler、adminkubernetes-csr.json关键hosts 必须包含所有可能访问 apiserver 的地址{ CN: kubernetes, hosts: [ 127.0.0.1, 10.10.10.101, 10.10.10.102, 10.10.10.103, 10.96.0.1, // k8s service CIDR 网关 10.10.10.201, // worker1 IP供 kubelet 访问 10.10.10.202, // worker2 IP kubernetes, kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster.local ], key: {algo: rsa, size: 2048}, names: [{C: CN, ST: Shanghai, L: Shanghai, O: k8s, OU: Kubernetes}] }生成 apiserver 证书cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes kubernetes-csr.json | cfssljson -bare kubernetes # 输出 kubernetes.pem 和 kubernetes-key.pem步骤 4生成 service-account 密钥对openssl genrsa -out sa.key 4096 openssl rsa -in sa.key -pubout -out sa.pub步骤 5生成 admin 客户端证书用于 kubectladmin-csr.json{ CN: admin, key: {algo: rsa, size: 2048}, names: [{C: CN, ST: Shanghai, L: Shanghai, O: system:masters, OU: Kubernetes}] }生成cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes admin-csr.json | cfssljson -bare admin # 输出 admin.pem 和 admin-key.pem所有证书生成完毕后按节点分发Master 节点需ca.pem,ca-key.pem,kubernetes.pem,kubernetes-key.pem,etcd.pem,etcd-key.pem,sa.pub,sa.key,admin.pem,admin-key.pemWorker 节点需ca.pem,kubernetes.pem,kubernetes-key.pem,etcd.pem,etcd-key.pem,admin.pem,admin-key.pem注意ca-key.pem是最高机密只保留在离线 CA 机器上Master 节点只需ca.pem用于校验其他证书。若ca-key.pem泄露整个集群 TLS 体系即告崩溃。3.3 下载并分发 v1.35.0 二进制文件从官方 GitHub Release 页面下载务必验证 checksum# 创建目录 sudo mkdir -p /opt/kubernetes/{bin,ssl,conf} # 下载 k8s 二进制注意v1.35.0 的 release assets 中server 包含所有组件 wget https://dl.k8s.io/v1.35.0/kubernetes-server-linux-amd64.tar.gz echo sha256 9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b kubernetes-server-linux-amd64.tar.gz | sha256sum -c tar -xzf kubernetes-server-linux-amd64.tar.gz sudo cp kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubelet,kube-proxy,kubectl} /opt/kubernetes/bin/ sudo chmod x /opt/kubernetes/bin/*同时下载 etcd v3.5.15v1.35.0 官方验证兼容版本wget https://github.com/etcd-io/etcd/releases/download/v3.5.15/etcd-v3.5.15-linux-amd64.tar.gz tar -xzf etcd-v3.5.15-linux-amd64.tar.gz sudo cp etcd-v3.5.15-linux-amd64/{etcd,etcdctl} /opt/kubernetes/bin/ sudo chmod x /opt/kubernetes/bin/{etcd,etcdctl}验证版本/opt/kubernetes/bin/kubelet --version # 应输出 Kubernetes v1.35.0 /opt/kubernetes/bin/etcdctl version # 应输出 etcd Version: 3.5.153.4 构建 etcd 集群3 节点高可用在每台 Master 节点上创建/etc/etcd/etcd.conf# master1 (10.10.10.101) ETCD_NAMEmaster1 ETCD_DATA_DIR/var/lib/etcd ETCD_LISTEN_PEER_URLShttps://10.10.10.101:2380 ETCD_LISTEN_CLIENT_URLShttps://10.10.10.101:2379,https://127.0.0.1:2379 ETCD_INITIAL_ADVERTISE_PEER_URLShttps://10.10.10.101:2380 ETCD_INITIAL_CLUSTERmaster1https://10.10.10.101:2380,master2https://10.10.10.102:2380,master3https://10.10.10.103:2380 ETCD_INITIAL_CLUSTER_TOKENk8s-etcd-cluster ETCD_ADVERTISE_CLIENT_URLShttps://10.10.10.101:2379 ETCD_CERT_FILE/opt/kubernetes/ssl/etcd.pem ETCD_KEY_FILE/opt/kubernetes/ssl/etcd-key.pem ETCD_TRUSTED_CA_FILE/opt/kubernetes/ssl/ca.pem ETCD_CLIENT_CERT_AUTHtrue ETCD_PEER_CERT_FILE/opt/kubernetes/ssl/etcd.pem ETCD_PEER_KEY_FILE/opt/kubernetes/ssl/etcd-key.pem ETCD_PEER_TRUSTED_CA_FILE/opt/kubernetes/ssl/ca.pem ETCD_PEER_CLIENT_CERT_AUTHtrue ETCD_HEARTBEAT_INTERVAL250 ETCD_ELECTION_TIMEOUT1250master2和master3的配置仅修改ETCD_NAME和对应 IP 地址。创建 systemd unit/etc/systemd/system/etcd.service[Unit] DescriptionEtcd Server Documentationhttps://github.com/coreos/etcd Afternetwork.target [Service] Typenotify Useretcd EnvironmentFile/etc/etcd/etcd.conf ExecStart/opt/kubernetes/bin/etcd \ --name${ETCD_NAME} \ --data-dir${ETCD_DATA_DIR} \ --listen-peer-urls${ETCD_LISTEN_PEER_URLS} \ --listen-client-urls${ETCD_LISTEN_CLIENT_URLS} \ --advertise-client-urls${ETCD_ADVERTISE_CLIENT_URLS} \ --initial-advertise-peer-urls${ETCD_INITIAL_ADVERTISE_PEER_URLS} \ --initial-cluster${ETCD_INITIAL_CLUSTER} \ --initial-cluster-token${ETCD_INITIAL_CLUSTER_TOKEN} \ --cert-file${ETCD_CERT_FILE} \ --key-file${ETCD_KEY_FILE} \ --trusted-ca-file${ETCD_TRUSTED_CA_FILE} \ --client-cert-auth${ETCD_CLIENT_CERT_AUTH} \ --peer-cert-file${ETCD_PEER_CERT_FILE} \ --peer-key-file${ETCD_PEER_KEY_FILE} \ --peer-trusted-ca-file${ETCD_PEER_TRUSTED_CA_FILE} \ --peer-client-cert-auth${ETCD_PEER_CLIENT_CERT_AUTH} \ --heartbeat-interval${ETCD_HEARTBEAT_INTERVAL} \ --election-timeout${ETCD_ELECTION_TIMEOUT} Restarton-failure RestartSec5 LimitNOFILE65536 [Install] WantedBymulti-user.target创建 etcd 用户并授权sudo useradd -r -c etcd user -d /var/lib/etcd -s /sbin/nologin etcd sudo mkdir -p /var/lib/etcd sudo chown etcd:etcd /var/lib/etcd启动集群严格按顺序在 master1 上执行sudo systemctl daemon-reload sudo systemctl enable etcd --now等待 10 秒确认sudo systemctl is-active etcd返回active在 master2 上执行相同命令在 master3 上执行相同命令验证集群健康# 在任意 master 上执行 export ETCDCTL_API3 export ETCDCTL_CACERT/opt/kubernetes/ssl/ca.pem export ETCDCTL_CERT/opt/kubernetes/ssl/etcd.pem export ETCDCTL_KEY/opt/kubernetes/ssl/etcd-key.pem /opt/kubernetes/bin/etcdctl --endpointshttps://127.0.0.1:2379 endpoint health # 应返回全部 healthy /opt/kubernetes/bin/etcdctl --endpointshttps://127.0.0.1:2379 member list # 应显示 3 个 member状态为 started实操心得etcd 启动失败最常见的原因是--initial-cluster中的 IP 地址与--listen-peer-urls不匹配或防火墙未开放 2379/2380 端口。建议在启动前用telnet 10.10.10.102 2380测试连通性。另外ETCD_ELECTION_TIMEOUT必须是ETCD_HEARTBEAT_INTERVAL的 5 倍1250/2505这是 etcd Raft 协议的硬性要求违反会导致选举失败。3.5 部署 Control Plane 组件apiserver、controller、schedulerapiserver 配置/etc/kubernetes/apiserver.confKUBE_APISERVER_OPTS--logtostderrfalse \ --v2 \ --log-dir/var/log/kubernetes \ --etcd-servershttps://10.10.10.101:2379,https://10.10.10.102:2379,https://10.10.10.103:2379 \ --bind-address10.10.10.101 \ --secure-port6443 \ --advertise-address10.10.10.101 \ --allow-privilegedtrue \ --service-cluster-ip-range10.96.0.0/12 \ --enable-admission-pluginsNamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota,MutatingAdmissionWebhook,ValidatingAdmissionWebhook \ --authorization-modeNode,RBAC \ --enable-bootstrap-token-authtrue \ --token-auth-file/opt/kubernetes/conf/token.csv \ --service-account-key-file/opt/kubernetes/ssl/sa.pub \ --tls-cert-file/opt/kubernetes/ssl/kubernetes.pem \ --tls-private-key-file/opt/kubernetes/ssl/kubernetes-key.pem \ --client-ca-file/opt/kubernetes/ssl/ca.pem \ --kubelet-client-certificate/opt/kubernetes/ssl/kubernetes.pem \ --kubelet-client-key-file/opt/kubernetes/ssl/kubernetes-key.pem \ --service-account-signing-key-file/opt/kubernetes/ssl/sa.key \ --runtime-configapi/alltrue \ --audit-log-path/var/log/kubernetes/audit.log \ --audit-log-maxage30 \ --audit-log-maxbackup3 \ --audit-log-maxsize100 \ --event-ttl1h \ --requestheader-client-ca-file/opt/kubernetes/ssl/front-proxy-ca.pem \ --proxy-client-cert-file/opt/kubernetes/ssl/front-proxy-client.pem \ --proxy-client-key-file/opt/kubernetes/ssl/front-proxy-client-key.pem \ --requestheader-allowed-namesfront-proxy-client \ --requestheader-extra-headers-prefixX-Remote-Extra- \ --requestheader-group-headersX-Remote-Group \ --requestheader-username-headersX-Remote-User \ --enable-aggregator-routingtrue注意--bind-address和--advertise-address必须是本机 IP不能写0.0.0.0--etcd-servers必须列出所有 etcd 成员--service-account-signing-key-file必须指向sa.keyv1.35.0 强制要求。controller-manager 配置/etc/kubernetes/controller-manager.confKUBE_CONTROLLER_MANAGER_OPTS--logtostderrfalse \ --v2 \ --log-dir/var/log/kubernetes \ --masterhttps://127.0.0.1:6443 \ --leader-electtrue \ --address127.0.0.1 \ --service-cluster-ip-range10.96.0.0/12 \ --cluster-namekubernetes \ --cluster-signing-cert-file/opt/kubernetes/ssl/ca.pem \ --cluster-signing-key-file/opt/kubernetes/ssl/ca-key.pem \ --root-ca-file/opt/kubernetes/ssl/ca.pem \ --service-account-private-key-file/opt/kubernetes/ssl/sa.key \ --allocate-node-cidrstrue \ --node-cidr-mask-size24 \ --node-monitor-grace-period40s \ --node-monitor-period5s \ --pod-eviction-timeout2m0s \ --controllers*,bootstrapsigner,tokencleaner \ --use-service-account-credentialsfalse \ --feature-gatesRotateKubeletServerCertificatetrue关键点--use-service-account-credentialsfalsev1.35.0 废弃参数必须显式设为 false--service-account-private-key-file指向sa.key--feature-gatesRotateKubeletServerCertificatetrue启用 kubelet 证书自动轮换。scheduler 配置/etc/kubernetes/scheduler.confKUBE_SCHEDULER_OPTS--logtostderrfalse \ --v2 \ --log-dir/var/log/kubernetes \ --masterhttps://127.0.0.1:6443 \ --leader-electtrue \ --address127.0.0.1创建 systemd unit/etc/systemd/system/kube-apiserver.service[Unit] DescriptionKubernetes API Server Documentationhttps://github.com/kubernetes/kubernetes Afteretcd.service Wantsetcd.service [Service] EnvironmentFile/etc/kubernetes/apiserver.conf ExecStart/opt/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS Restarton-failure RestartSec5 Typenotify LimitNOFILE65536 [Install] WantedBymulti-user.target同理创建kube-controller-manager.service和kube-scheduler.serviceAfter字段均设为kube-apiserver.service。创建日志目录并授权sudo mkdir -p /var/log/kubernetes sudo chown -R root:root /var/log/kubernetes启动 control planesudo systemctl daemon-reload sudo systemctl enable kube-apiserver kube-controller-manager kube-scheduler --now验证 apiservercurl -k https://127.0.0.1:6443/healthz # 应返回 ok kubectl --kubeconfig /opt/kubernetes/conf/admin.kubeconfig get componentstatuses # 应显示 all True3.6 部署 Worker 节点kubelet kube-proxykubelet 配置/var/lib/kubelet/config.yaml使用 v1.35.0 推荐的 KubeletConfiguration APIapiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration address: 10.10.10.201 # worker1 IP port: 10250 readOnlyPort: 10255 cgroupDriver: systemd clusterDNS: - 10.96.0.10 clusterDomain: cluster.local failSwapOn: true authentication: anonymous: enabled: false webhook: enabled: true x509: clientCAFile: /opt/kubernetes/ssl/ca.pem authorization: mode: Webhook rotateCertificates: true serverTLSBootstrap: true staticPodPath: /etc/kubernetes/manifests volumePluginDir: /opt/kubernetes/kubelet-plugins/volume/exec resolvConf: /run/systemd/resolve/resolv.conf创建/etc/systemd/system/kubelet.service[Unit] DescriptionKubernetes Kubelet Documentationhttps://github.com/kubernetes/kubernetes Afterdocker.service Wantsdocker.service [Service] Typenotify EnvironmentFile/etc/kubernetes/kubelet.conf ExecStart/opt/kubernetes/bin/kubelet \ --config/var/lib/kubelet/config.yaml \ --bootstrap-kubeconfig/opt/kubernetes/conf/bootstrap.kubeconfig \ --kubeconfig/opt/kubernetes/conf/kubelet.kubeconfig \ --cert-dir/opt/kubernetes/ssl \ --network-plugincni \ --cni-conf-dir/etc/cni/net.d \ --cni-bin-dir/opt/kubernetes/bin \ --container-runtimeremote \ --container-runtime-endpointunix:///var/run/crio/crio.sock \ --image-pull-progress-deadline2m \ --runtime-cgroups/systemd/system.slice \ --kubelet-cgroups/systemd/system.slice \ --node-labelsnode.kubernetes.io/nodeworker \ --register-with-taintsnode-role.kubernetes.io/control-plane:NoSchedule \ --v2 Restarton-failure RestartSec5 LimitNOFILE65536 [Install] WantedBymulti-user.targetkube-proxy 配置/var/lib/kube-proxy/config.yamlapiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clientConnection: kubeconfig: /opt/kubernetes/conf/kube-proxy.kubeconfig mode: iptables clusterCIDR: 10.244.0.0/16 hostnameOverride: worker1创建/etc/systemd/system/kube-proxy.service[Unit] DescriptionKubernetes Kube-Proxy Server Documentationhttps://github.com/kubernetes/kubernetes Afternetwork.target [Service] Type