在离线、无外网环境下部署 Kubernetes(二进制方式),最关键且复杂的步骤之一就是:证书与配置文件的准备与生成。
这部分工作 kubeadm 可以自动完成,但在你二进制部署时,必须自己搞定。这正是考验你对 K8s 机制理解的时候。
✅ 离线部署中涉及的证书与配置文件
我们分为两大类:
一、🔐 TLS 证书(基于 CA)
Kubernetes 各组件之间通过 TLS 加密通信,如下组件都需要用到证书:
组件 |
使用的证书 |
说明 |
kube-apiserver |
使用 CA 颁发的服务端证书 |
被 controller/kubelet 等访问 |
kubelet |
连接 kube-apiserver 的客户端证书 |
每个 node 都有 |
controller-manager |
客户端证书 |
访问 apiserver |
scheduler |
客户端证书 |
访问 apiserver |
etcd |
自己的 CA + etcd 证书 |
自签或复用 K8s CA |
kube-proxy |
客户端证书 |
用于访问 API |
admin 账号 |
kubectl 用来访问集群的证书 |
kubeconfig 中引用 |
二、⚙️ 配置文件(KubeConfig)
用于存储认证信息、集群信息、用户身份:
文件 |
作用 |
包含证书 |
admin.kubeconfig |
提供 kubectl 用的管理凭据 |
✅ 有 |
kubelet.kubeconfig |
节点与 API 通信凭据 |
✅ 有 |
controller-manager.kubeconfig |
控制器访问凭据 |
✅ 有 |
scheduler.kubeconfig |
调度器访问凭据 |
✅ 有 |
kube-proxy.kubeconfig |
kube-proxy 访问 API 凭据 |
✅ 有 |
✅ 离线环境如何生成证书与配置?
你需要使用工具(推荐 cfssl
)进行证书签发,或使用 openssl
。
🛠️ 推荐使用:cfssl 工具
1. 安装 cfssl 工具(在联网机器操作一次)
1 2 3 4
| wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 chmod +x cfssl* mv cfssl* /usr/local/bin/
|
2. 生成 CA 根证书(ca.pem
)
ca-config.json
:
1 2 3 4 5 6 7 8 9 10 11 12 13
| { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "usages": ["signing", "key encipherment", "server auth", "client auth"], "expiry": "87600h" } } } }
|
ca-csr.json
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "CN": "Kubernetes CA", "key": { "algo": "rsa", "size": 2048 }, "names": [{ "C": "CN", "L": "Beijing", "O": "Kubernetes", "OU": "CA", "ST": "Beijing" }] }
|
生成:
1
| cfssl gencert -initca ca-csr.json | cfssljson -bare ca
|
会得到:
1 2 3
| ca.pem ca-key.pem ca.csr
|
3. 生成组件证书(以 kube-apiserver 为例)
apiserver-csr.json
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| { "CN": "kube-apiserver", "hosts": [ "127.0.0.1", "10.0.0.1", "192.168.100.10", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [{ "C": "CN", "L": "Beijing", "O": "Kubernetes", "OU": "Cluster", "ST": "Beijing" }] }
|
生成:
1 2 3 4 5 6
| cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -profile=kubernetes \ apiserver-csr.json | cfssljson -bare apiserver
|
4. 用证书生成 kubeconfig 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| KUBERNETES_PUBLIC_ADDRESS=192.168.100.10
kubectl config set-cluster kubernetes \ --certificate-authority=ca.pem \ --embed-certs=true \ --server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443 \ --kubeconfig=admin.kubeconfig
kubectl config set-credentials admin \ --client-certificate=admin.pem \ --client-key=admin-key.pem \ --embed-certs=true \ --kubeconfig=admin.kubeconfig
kubectl config set-context default \ --cluster=kubernetes \ --user=admin \ --kubeconfig=admin.kubeconfig
kubectl config use-context default --kubeconfig=admin.kubeconfig
|
✅ 所有证书建议按目录整理(离线打包)
1 2 3 4 5 6 7 8 9 10 11
| /opt/k8s/ ├── bin/ ├── certs/ │ ├── ca.pem │ ├── apiserver.pem │ └── ... ├── config/ │ ├── admin.kubeconfig │ ├── kubelet.kubeconfig │ └── ... └── manifests/
|
✅ 离线部署建议流程
在有网机器准备好:
- 所有证书(cfssl生成)
- 所有二进制文件(下载并测试)
- 所有 kubeconfig 文件
将文件通过 U 盘或内网传输到所有节点
各节点使用这些固定文件初始化
整个流程无需访问公网,也不依赖镜像仓库