Kubernetes二进制部署全流程指南:从环境准备到集群运维

作者:KAKAKA2026.07.04 02:30浏览量:1

简介:本文详解Kubernetes二进制部署全流程,覆盖资源规划、环境准备、组件安装、集群验证及运维优化,帮助开发者掌握非kubeadm部署方案的核心逻辑与操作细节,适用于需要深度定制集群或离线环境的场景。

一、部署概述:为何选择二进制部署?

Kubernetes官方推荐kubeadm作为标准部署工具,但二进制部署方案因其灵活性和可定制性仍被广泛采用。与kubeadm相比,二进制部署允许开发者:

  1. 完全控制组件版本:可自由选择kubelet、apiserver、controller-manager等组件的版本组合;
  2. 深度定制配置:直接修改组件启动参数,实现更细粒度的网络、存储、认证配置;
  3. 离线环境支持:无需依赖互联网下载镜像,适合内网或安全受限环境;
  4. 故障排查透明:组件日志独立输出,便于定位问题根源。

适用场景:

  • 需要兼容旧版本Kubernetes的遗留系统
  • 对集群性能有极致要求的金融、游戏行业
  • 无法使用容器镜像的裸金属或虚拟机环境
  • 需要实现多集群联邦或混合云架构的复杂场景

二、架构与组件:二进制部署的核心模块

Kubernetes二进制部署需手动安装以下核心组件:
| 组件 | 功能 | 关键配置项 |
|———————-|——————————————-|—————————————-|
| kube-apiserver | 集群API入口 | --secure-port, --etcd-servers |
| kube-controller-manager | 资源控制器核心 | --cluster-signing-cert-file |
| kube-scheduler | 节点调度器 | --leader-elect-resource-lock |
| kubelet | 节点代理 | --cgroup-driver, --pod-infra-container-image |
| kube-proxy | 服务网络代理 | --proxy-mode, --cluster-cidr |
| etcd | 分布式键值存储 | --listen-client-urls, --initial-cluster-token |

组件依赖关系:

  1. etcd需优先部署并验证数据一致性
  2. apiserver依赖etcd存储集群状态
  3. controller-manager和scheduler通过apiserver操作资源
  4. kubelet向apiserver注册节点并管理Pod生命周期

三、前置准备:环境与资源规划

1. 基础环境要求

  • 操作系统:推荐CentOS 7.9/Ubuntu 20.04 LTS,内核版本≥4.19
  • 硬件规格:
    • 控制节点:4核8G内存,50GB系统盘
    • 工作节点:8核16G内存,100GB系统盘+数据盘
  • 网络配置:
    • 主节点间需开通TCP 6443(API)、2379-2380(etcd)、10250(kubelet)等端口
    • 工作节点需开通10250及NodePort范围(30000-32767)

2. 依赖组件安装

  1. # 安装基础工具链(以CentOS为例)
  2. yum install -y conntrack ipvsadm ipset jq sysstat curl iptables
  3. # 配置内核参数
  4. cat <<EOF > /etc/sysctl.d/k8s.conf
  5. net.ipv4.ip_forward=1
  6. net.bridge.bridge-nf-call-iptables=1
  7. fs.may_detach_mounts=1
  8. EOF
  9. sysctl --system
  10. # 禁用Swap(Kubernetes要求)
  11. swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

3. 证书与密钥管理

建议使用cfssl工具生成集群证书:

  1. # 生成CA证书
  2. cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  3. # 生成API Server证书(需配置SAN字段)
  4. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \
  5. -config=ca-config.json -hostname="10.0.0.1,kubernetes.default" \
  6. apiserver-csr.json | cfssljson -bare apiserver

四、部署流程:从组件安装到集群初始化

1. etcd集群部署(以3节点为例)

  1. # 下载并解压etcd二进制包
  2. wget https://dl.k8s.io/v1.23.0/etcd-v3.5.0-linux-amd64.tar.gz
  3. tar -xzf etcd-v3.5.0-linux-amd64.tar.gz
  4. cp etcd-v3.5.0-linux-amd64/{etcd,etcdctl} /usr/local/bin/
  5. # 创建系统服务(节点1配置示例)
  6. cat <<EOF > /etc/systemd/system/etcd.service
  7. [Unit]
  8. Description=Etcd Server
  9. After=network.target
  10. [Service]
  11. Type=notify
  12. ExecStart=/usr/local/bin/etcd \\
  13. --name=etcd1 \\
  14. --initial-advertise-peer-urls=https://10.0.0.1:2380 \\
  15. --listen-peer-urls=https://10.0.0.1:2380 \\
  16. --listen-client-urls=https://10.0.0.1:2379,https://127.0.0.1:2379 \\
  17. --advertise-client-urls=https://10.0.0.1:2379 \\
  18. --initial-cluster-token=k8s-etcd-cluster \\
  19. --initial-cluster=etcd1=https://10.0.0.1:2380,etcd2=https://10.0.0.2:2380,etcd3=https://10.0.0.3:2380 \\
  20. --client-cert-auth=true \\
  21. --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  22. --cert-file=/etc/kubernetes/ssl/etcd.pem \\
  23. --key-file=/etc/kubernetes/ssl/etcd-key.pem \\
  24. --peer-client-cert-auth=true \\
  25. --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  26. --peer-cert-file=/etc/kubernetes/ssl/etcd.pem \\
  27. --peer-key-file=/etc/kubernetes/ssl/etcd-key.pem
  28. Restart=on-failure
  29. RestartSec=5
  30. LimitNOFILE=65536
  31. [Install]
  32. WantedBy=multi-user.target
  33. EOF
  34. systemctl daemon-reload && systemctl enable etcd && systemctl start etcd

验证etcd集群:

  1. ETCDCTL_API=3 etcdctl --endpoints=https://10.0.0.1:2379 \
  2. --cacert=/etc/kubernetes/ssl/ca.pem \
  3. --cert=/etc/kubernetes/ssl/etcd.pem \
  4. --key=/etc/kubernetes/ssl/etcd-key.pem \
  5. endpoint health

2. 控制平面组件部署

  1. # 下载Kubernetes二进制包
  2. wget https://dl.k8s.io/v1.23.0/kubernetes-server-linux-amd64.tar.gz
  3. tar -xzf kubernetes-server-linux-amd64.tar.gz
  4. cp kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl} /usr/local/bin/
  5. # 配置API Server(需修改--etcd-servers等参数)
  6. cat <<EOF > /etc/systemd/system/kube-apiserver.service
  7. [Unit]
  8. Description=Kubernetes API Server
  9. Documentation=https://kubernetes.io/docs/
  10. After=network.target
  11. [Service]
  12. ExecStart=/usr/local/bin/kube-apiserver \\
  13. --advertise-address=10.0.0.1 \\
  14. --bind-address=0.0.0.0 \\
  15. --secure-port=6443 \\
  16. --etcd-servers=https://10.0.0.1:2379,https://10.0.0.2:2379,https://10.0.0.3:2379 \\
  17. --etcd-cafile=/etc/kubernetes/ssl/ca.pem \\
  18. --etcd-certfile=/etc/kubernetes/ssl/etcd.pem \\
  19. --etcd-keyfile=/etc/kubernetes/ssl/etcd-key.pem \\
  20. --client-ca-file=/etc/kubernetes/ssl/ca.pem \\
  21. --tls-cert-file=/etc/kubernetes/ssl/apiserver.pem \\
  22. --tls-private-key-file=/etc/kubernetes/ssl/apiserver-key.pem \\
  23. --service-account-key-file=/etc/kubernetes/ssl/sa.pub \\
  24. --service-cluster-ip-range=10.96.0.0/12 \\
  25. --authorization-mode=Node,RBAC \\
  26. --enable-admission-plugins=NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook \\
  27. --kubelet-certificate-authority=/etc/kubernetes/ssl/ca.pem \\
  28. --kubelet-client-certificate=/etc/kubernetes/ssl/apiserver.pem \\
  29. --kubelet-client-key=/etc/kubernetes/ssl/apiserver-key.pem \\
  30. --v=2
  31. Restart=on-failure
  32. RestartSec=5
  33. LimitNOFILE=65536
  34. [Install]
  35. WantedBy=multi-user.target
  36. EOF
  37. # 依次启动controller-manager和scheduler(配置略)
  38. systemctl enable --now kube-apiserver kube-controller-manager kube-scheduler

3. 工作节点部署

  1. # 配置kubelet
  2. cat <<EOF > /etc/systemd/system/kubelet.service
  3. [Unit]
  4. Description=Kubernetes Kubelet
  5. After=docker.service
  6. Requires=docker.service
  7. [Service]
  8. ExecStart=/usr/local/bin/kubelet \\
  9. --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \\
  10. --kubeconfig=/etc/kubernetes/kubelet.conf \\
  11. --config=/var/lib/kubelet/config.yaml \\
  12. --network-plugin=cni \\
  13. --cni-conf-dir=/etc/cni/net.d \\
  14. --cni-bin-dir=/opt/cni/bin \\
  15. --container-runtime=remote \\
  16. --container-runtime-endpoint=unix:///run/containerd/containerd.sock \\
  17. --runtime-request-timeout=15m \\
  18. --cgroup-driver=systemd \\
  19. --node-status-update-frequency=10s \\
  20. --v=2
  21. Restart=on-failure
  22. RestartSec=5
  23. [Install]
  24. WantedBy=multi-user.target
  25. EOF
  26. # 配置kube-proxy
  27. cat <<EOF > /etc/systemd/system/kube-proxy.service
  28. [Unit]
  29. Description=Kubernetes Kube Proxy
  30. Documentation=https://kubernetes.io/docs/
  31. After=network.target
  32. [Service]
  33. ExecStart=/usr/local/bin/kube-proxy \\
  34. --config=/var/lib/kube-proxy/config.conf \\
  35. --v=2
  36. Restart=on-failure
  37. RestartSec=5
  38. [Install]
  39. WantedBy=multi-user.target
  40. EOF

五、集群验证与运维要点

1. 基础验证

  1. # 检查组件状态
  2. kubectl get cs
  3. # 输出示例:
  4. # NAME STATUS MESSAGE ERROR
  5. # scheduler Healthy ok
  6. # controller-manager Healthy ok
  7. # etcd-0 Healthy {"health":"true"}
  8. # 创建测试Pod
  9. kubectl run nginx --image=nginx:alpine --port=80
  10. kubectl expose deployment nginx --type=NodePort
  11. kubectl get svc nginx # 记录NodePort端口
  12. curl http://<节点IP>:<NodePort>

2. 运维监控方案

  • 日志收集:配置rsyslog或filebeat收集组件日志至ELK
  • 指标监控:部署Prometheus+Grafana监控集群资源使用率
  • 告警规则:设置NodeMemoryPressure、DiskPressure等预警阈值
  • 备份策略:定期备份etcd数据快照至对象存储

3. 常见问题排查

现象 可能原因 解决方案
NodeNotReady kubelet未注册 检查kubelet日志,验证证书有效性
ImagePullBackOff 镜像仓库不可达 配置镜像拉取秘钥或私有仓库镜像
CrashLoopBackOff Pod启动失败 使用kubectl logs查看容器日志
API Server无响应 etcd集群不可用 检查etcd健康状态及网络连通性

六、总结:二进制部署的核心价值

二进制部署方案虽然操作复杂,但为Kubernetes集群提供了:

  1. 极致可控性:从组件版本到启动参数均可定制
  2. 离线能力:适合内网或安全合规要求高的环境
  3. 深度排障:组件日志独立输出,便于问题定位
  4. 混合云支持:可实现异构基础设施的统一管理

对于需要长期维护的生产环境,建议结合Ansible或Terraform实现二进制部署的自动化,在保证灵活性的同时提升部署效率。后续可逐步引入Service Mesh、Operator等高级特性,构建企业级容器平台。