当前位置: 首页 > news >正文

Kubernetes二进制部署实战:v1.35.0高可用集群从零构建

1. 为什么现在还要手撸二进制安装 Kubernetes?v1.35.0 不是早该用 kubeadm 了吗?

“二进制安装 Kubernetes”这八个字,最近在运维群、K8s学习小组和企业私有云建设讨论里反复刷屏。不是因为大家怀旧,而是因为——真实生产环境从不按教程出牌。你点开任何一篇“Ubuntu 24.04 一键部署 k8s 教程”,十有八九用的是 kubeadm 或 SealOS;但当你真正坐到客户机房的工位上,面对一台刚重装完、没联网、没 Docker、甚至禁用 systemd 的国产信创服务器时,kubeadm 会直接报错:“Failed to connect to API server”,而 SealOS 的镜像仓库根本拉不下来。这时候,能救你的,只有那一组干净、可控、不依赖外部服务的二进制文件:kube-apiserverkube-controller-managerkube-schedulerkubeletkube-proxy,外加etcdkubectl

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 中启用 TSC(Time Stamp Counter)作为时钟源,并在 kernel boot 参数中加入tsc=stable tsc=reliable nohz_full=1,再配合 chrony 的makestep 1 -1强制步进校准。这不是“配置技巧”,而是 v1.35.0 对硬件时序模型的新要求。

再看证书体系这个“雷区”。kubeadm 默认用kubeadm init phase certs all一把梭生成所有证书,但二进制方式下,你必须亲手规划 CA 层级:

  • 根 CA(ca.crt/ca.key)用于签发所有下级证书,必须离线保管;
  • etcd CA(etcd/ca.crt/etcd/ca.key)专用于 etcd 成员通信,不能与 k8s CA 混用;
  • front-proxy CA(front-proxy-ca.crt/front-proxy-ca.key)专用于聚合 API Server(如 metrics-server)的身份验证;
  • service-account-key(sa.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-credentials=true参数已废弃,改为强制使用--service-account-private-key-file指向sa.key。如果你沿用老教程用--use-service-account-credentials,controller-manager 会静默退出,日志只有一行invalid argument,排查起来极其痛苦。这就是“版本差异”带来的隐性成本——它不会报错,但会让你的功能失效。

最后是组件启动顺序的强约束。你以为只要把所有服务都 systemctl enable 就行?错。真实启动链是:

  1. etcd.service必须完全 ready(etcdctl endpoint health返回 true);
  2. kube-apiserver.service启动后需等待curl -k https://127.0.0.1:6443/healthz返回 200;
  3. kube-controller-manager.servicekube-scheduler.service才能并行启动;
  4. kubelet.service启动后,会主动向 apiserver 注册 Node 对象,此时kubectl get nodes才能看到节点;
  5. kube-proxy.service必须在 Node Ready 后启动,否则 iptables 规则无法正确注入。

这个链条里任何一环卡住,都会导致后续组件无限重试。比如 kubelet 启动太快,apiserver 还没监听 6443 端口,它就会疯狂报Unable to connect to the server: EOF,然后不断 fork 新进程,最终把系统 OOM Killer 触发。所以我们在 systemd unit 里必须写明After=etcd.service kube-apiserver.serviceWants=etcd.service kube-apiserver.service,并设置StartLimitIntervalSec=600防止雪崩重启。

二进制部署不是复制粘贴,它是用 Linux 系统工程思维,在进程、网络、存储、安全四个维度上,对一个分布式系统的全栈解剖。

3. v1.35.0 二进制部署实操:从零构建高可用集群(3 master + 2 worker)

我们以最典型的生产级拓扑为例:3 台 Master 节点(承担 control plane + etcd 共建)、2 台 Worker 节点(纯工作负载)。所有节点操作系统为 Ubuntu 24.04 LTS(Linux kernel 6.8),CPU 架构 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 # 关闭 swap(k8s 强制要求) vm.swappiness = 0

执行sudo sysctl --system生效,并验证:sysctl net.bridge.bridge-nf-call-iptables应返回1

提示:很多教程漏掉tcp_slow_start_after_idle=0。v1.35.0 的 apiserver 在处理长连接时,默认开启 slow start,会导致客户端(如 kubectl exec)在空闲 1 秒后重传 SYN,引发连接卡顿。这个参数必须关。

第二类:容器运行时准备(CRI-O 1.29.0)
v1.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×5=1825 天),避免生产环境证书过期导致集群瘫痪。

步骤 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 -ca=etcd-ca.pem -ca-key=etcd-ca-key.pem -config=etcd-ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcd # 输出 etcd.pem(证书)和 etcd-key.pem(私钥)

步骤 3:生成 k8s 主要组件证书(apiserver、controller、scheduler、admin)
kubernetes-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 -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes 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 客户端证书(用于 kubectl)
admin-csr.json

{ "CN": "admin", "key": {"algo": "rsa", "size": 2048}, "names": [{"C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "system:masters", "OU": "Kubernetes"}] }

生成:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes 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.pem
  • Worker 节点需: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.15(v1.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.15

3.4 构建 etcd 集群(3 节点高可用)

在每台 Master 节点上创建/etc/etcd/etcd.conf

# master1 (10.10.10.101) ETCD_NAME="master1" ETCD_DATA_DIR="/var/lib/etcd" ETCD_LISTEN_PEER_URLS="https://10.10.10.101:2380" ETCD_LISTEN_CLIENT_URLS="https://10.10.10.101:2379,https://127.0.0.1:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.10.10.101:2380" ETCD_INITIAL_CLUSTER="master1=https://10.10.10.101:2380,master2=https://10.10.10.102:2380,master3=https://10.10.10.103:2380" ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS="https://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_AUTH="true" 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_AUTH="true" ETCD_HEARTBEAT_INTERVAL="250" ETCD_ELECTION_TIMEOUT="1250"

master2master3的配置仅修改ETCD_NAME和对应 IP 地址。

创建 systemd unit/etc/systemd/system/etcd.service

[Unit] Description=Etcd Server Documentation=https://github.com/coreos/etcd After=network.target [Service] Type=notify User=etcd 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} Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-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

启动集群(严格按顺序):

  1. 在 master1 上执行:sudo systemctl daemon-reload && sudo systemctl enable etcd --now
  2. 等待 10 秒,确认sudo systemctl is-active etcd返回active
  3. 在 master2 上执行相同命令
  4. 在 master3 上执行相同命令

验证集群健康:

# 在任意 master 上执行 export ETCDCTL_API=3 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 --endpoints=https://127.0.0.1:2379 endpoint health # 应返回全部 healthy /opt/kubernetes/bin/etcdctl --endpoints=https://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/250=5),这是 etcd Raft 协议的硬性要求,违反会导致选举失败。

3.5 部署 Control Plane 组件(apiserver、controller、scheduler)

apiserver 配置/etc/kubernetes/apiserver.conf

KUBE_APISERVER_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/var/log/kubernetes \ --etcd-servers=https://10.10.10.101:2379,https://10.10.10.102:2379,https://10.10.10.103:2379 \ --bind-address=10.10.10.101 \ --secure-port=6443 \ --advertise-address=10.10.10.101 \ --allow-privileged=true \ --service-cluster-ip-range=10.96.0.0/12 \ --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota,MutatingAdmissionWebhook,ValidatingAdmissionWebhook \ --authorization-mode=Node,RBAC \ --enable-bootstrap-token-auth=true \ --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-config=api/all=true \ --audit-log-path=/var/log/kubernetes/audit.log \ --audit-log-maxage=30 \ --audit-log-maxbackup=3 \ --audit-log-maxsize=100 \ --event-ttl=1h \ --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-names=front-proxy-client \ --requestheader-extra-headers-prefix=X-Remote-Extra- \ --requestheader-group-headers=X-Remote-Group \ --requestheader-username-headers=X-Remote-User \ --enable-aggregator-routing=true"

注意:--bind-address--advertise-address必须是本机 IP,不能写0.0.0.0--etcd-servers必须列出所有 etcd 成员;--service-account-signing-key-file必须指向sa.key(v1.35.0 强制要求)。

controller-manager 配置/etc/kubernetes/controller-manager.conf

KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/var/log/kubernetes \ --master=https://127.0.0.1:6443 \ --leader-elect=true \ --address=127.0.0.1 \ --service-cluster-ip-range=10.96.0.0/12 \ --cluster-name=kubernetes \ --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-cidrs=true \ --node-cidr-mask-size=24 \ --node-monitor-grace-period=40s \ --node-monitor-period=5s \ --pod-eviction-timeout=2m0s \ --controllers=*,bootstrapsigner,tokencleaner \ --use-service-account-credentials=false \ --feature-gates=RotateKubeletServerCertificate=true"

关键点:--use-service-account-credentials=false(v1.35.0 废弃参数,必须显式设为 false);--service-account-private-key-file指向sa.key--feature-gates=RotateKubeletServerCertificate=true启用 kubelet 证书自动轮换。

scheduler 配置/etc/kubernetes/scheduler.conf

KUBE_SCHEDULER_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/var/log/kubernetes \ --master=https://127.0.0.1:6443 \ --leader-elect=true \ --address=127.0.0.1"

创建 systemd unit/etc/systemd/system/kube-apiserver.service

[Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes After=etcd.service Wants=etcd.service [Service] EnvironmentFile=/etc/kubernetes/apiserver.conf ExecStart=/opt/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS Restart=on-failure RestartSec=5 Type=notify LimitNOFILE=65536 [Install] WantedBy=multi-user.target

同理创建kube-controller-manager.servicekube-scheduler.serviceAfter字段均设为kube-apiserver.service

创建日志目录并授权:

sudo mkdir -p /var/log/kubernetes sudo chown -R root:root /var/log/kubernetes

启动 control plane:

sudo systemctl daemon-reload sudo systemctl enable kube-apiserver kube-controller-manager kube-scheduler --now

验证 apiserver:

curl -k https://127.0.0.1:6443/healthz # 应返回 ok kubectl --kubeconfig /opt/kubernetes/conf/admin.kubeconfig get componentstatuses # 应显示 all True

3.6 部署 Worker 节点(kubelet + kube-proxy)

kubelet 配置/var/lib/kubelet/config.yaml(使用 v1.35.0 推荐的 KubeletConfiguration API):

apiVersion: 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] Description=Kubernetes Kubelet Documentation=https://github.com/kubernetes/kubernetes After=docker.service Wants=docker.service [Service] Type=notify 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-plugin=cni \ --cni-conf-dir=/etc/cni/net.d \ --cni-bin-dir=/opt/kubernetes/bin \ --container-runtime=remote \ --container-runtime-endpoint=unix:///var/run/crio/crio.sock \ --image-pull-progress-deadline=2m \ --runtime-cgroups=/systemd/system.slice \ --kubelet-cgroups=/systemd/system.slice \ --node-labels=node.kubernetes.io/node=worker \ --register-with-taints=node-role.kubernetes.io/control-plane:NoSchedule \ --v=2 Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target

kube-proxy 配置/var/lib/kube-proxy/config.yaml

apiVersion: 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] Description=Kubernetes Kube-Proxy Server Documentation=https://github.com/kubernetes/kubernetes After=network.target [Service] Type
http://www.jsqmd.com/news/1150609/

相关文章:

  • 昇腾CANN 6.0.1 算子开发实战:TBE DSL vs TIK vs AICPU 3种方式性能对比
  • K-S检验法实战:3步验证数据是否符合泊松/均匀/指数分布
  • MindSpore Serving 1.5 部署实战:5 分钟搭建 ResNet-50 模型 gRPC/RESTful 推理服务
  • LibTV本地部署指南:AI视频生成从环境配置到生产实践
  • VGG-16 迁移学习实战:乳腺超声图像3分类,Kaggle数据集准确率超92%
  • Deep Mutual Learning 与知识蒸馏对比:CIFAR-100/ImageNet 3 组实验解析性能差异
  • AutoUU API 逆向工程解析:4个核心接口实现饰品租赁自动化上架
  • 柯桥水司落地“脉信AI语音智能体+AI客服智能体”,实现私有化、信创化部署
  • A股年报词频分析:从7个关键词到构建行业趋势词库的3步方法
  • 弹簧振子周期公式 3 种验证方法对比:PASCO实测、Python模拟与理论误差分析
  • 如何快速完成学术论文排版:厦门大学LaTeX模板完整指南
  • Hunyuan3D-2源码级实战:3D生成模型的调试、优化与工业落地
  • 【爱马仕】Hermes Agent 本地智能体 Windows 搭建配置流程(含安装包)
  • 免费在线法线贴图生成器:3分钟将普通图片变3D纹理
  • Python 3.12 + Pandas 复现 MathorCup B题:共享单车时空分布与OD矩阵计算
  • 15分钟极速上手:开源卫星图像大气校正工具ACOLITE终极指南
  • JPEG 压缩原理深度解析:10:1 到 40:1 压缩比下,图片大小差异的量化分析
  • 决策树算法实战:ID3/C4.5/CART 3大经典算法对比与Python实现
  • 免费在线光学仿真工具终极指南:5分钟创建专业2D光学系统
  • 深度剖析RevokeMsgPatcher:Windows平台即时通讯防撤回的二进制修改技术解析
  • Seurat 4.3.0 单细胞数据预处理实战:4步封装函数实现乳腺癌数据质控与聚类
  • 洛雪音乐桌面版:免费开源跨平台音乐聚合播放器终极指南
  • ID3决策树Python实现:从信息熵到分类预测的5个核心函数解析
  • 随机森林回归特征重要性:5种评估方法对比与 Python 3.11 实战解读
  • 如何安全使用哔哩下载姬:B站视频离线观看的终极指南
  • 实对称矩阵正交对角化:从理论到NumPy/PyTorch的3个关键实现步骤
  • 高斯投影3度带与6度带:ArcGIS/PyQGIS 自动分带与坐标纠错
  • MindSpore 2.3.0 GPU 环境部署:Windows 11 下 Conda 与 Pip 源切换 3 步避坑
  • Perplexity Spaces团队协作效率翻倍:3个被92%团队忽略的权限配置关键点
  • K-S检验法 Python/Scipy 实战:3行代码完成正态/均匀/泊松分布检验