简介:本文详解Kubernetes二进制部署全流程,覆盖资源规划、环境准备、组件安装、集群验证及运维优化,帮助开发者掌握非kubeadm部署方案的核心逻辑与操作细节,适用于需要深度定制集群或离线环境的场景。
Kubernetes官方推荐kubeadm作为标准部署工具,但二进制部署方案因其灵活性和可定制性仍被广泛采用。与kubeadm相比,二进制部署允许开发者:
适用场景:
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 |
组件依赖关系:
# 安装基础工具链(以CentOS为例)yum install -y conntrack ipvsadm ipset jq sysstat curl iptables# 配置内核参数cat <<EOF > /etc/sysctl.d/k8s.confnet.ipv4.ip_forward=1net.bridge.bridge-nf-call-iptables=1fs.may_detach_mounts=1EOFsysctl --system# 禁用Swap(Kubernetes要求)swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
建议使用cfssl工具生成集群证书:
# 生成CA证书cfssl gencert -initca ca-csr.json | cfssljson -bare ca# 生成API Server证书(需配置SAN字段)cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \-config=ca-config.json -hostname="10.0.0.1,kubernetes.default" \apiserver-csr.json | cfssljson -bare apiserver
# 下载并解压etcd二进制包wget https://dl.k8s.io/v1.23.0/etcd-v3.5.0-linux-amd64.tar.gztar -xzf etcd-v3.5.0-linux-amd64.tar.gzcp etcd-v3.5.0-linux-amd64/{etcd,etcdctl} /usr/local/bin/# 创建系统服务(节点1配置示例)cat <<EOF > /etc/systemd/system/etcd.service[Unit]Description=Etcd ServerAfter=network.target[Service]Type=notifyExecStart=/usr/local/bin/etcd \\--name=etcd1 \\--initial-advertise-peer-urls=https://10.0.0.1:2380 \\--listen-peer-urls=https://10.0.0.1:2380 \\--listen-client-urls=https://10.0.0.1:2379,https://127.0.0.1:2379 \\--advertise-client-urls=https://10.0.0.1:2379 \\--initial-cluster-token=k8s-etcd-cluster \\--initial-cluster=etcd1=https://10.0.0.1:2380,etcd2=https://10.0.0.2:2380,etcd3=https://10.0.0.3:2380 \\--client-cert-auth=true \\--trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\--cert-file=/etc/kubernetes/ssl/etcd.pem \\--key-file=/etc/kubernetes/ssl/etcd-key.pem \\--peer-client-cert-auth=true \\--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\--peer-cert-file=/etc/kubernetes/ssl/etcd.pem \\--peer-key-file=/etc/kubernetes/ssl/etcd-key.pemRestart=on-failureRestartSec=5LimitNOFILE=65536[Install]WantedBy=multi-user.targetEOFsystemctl daemon-reload && systemctl enable etcd && systemctl start etcd
验证etcd集群:
ETCDCTL_API=3 etcdctl --endpoints=https://10.0.0.1:2379 \--cacert=/etc/kubernetes/ssl/ca.pem \--cert=/etc/kubernetes/ssl/etcd.pem \--key=/etc/kubernetes/ssl/etcd-key.pem \endpoint health
# 下载Kubernetes二进制包wget https://dl.k8s.io/v1.23.0/kubernetes-server-linux-amd64.tar.gztar -xzf kubernetes-server-linux-amd64.tar.gzcp kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl} /usr/local/bin/# 配置API Server(需修改--etcd-servers等参数)cat <<EOF > /etc/systemd/system/kube-apiserver.service[Unit]Description=Kubernetes API ServerDocumentation=https://kubernetes.io/docs/After=network.target[Service]ExecStart=/usr/local/bin/kube-apiserver \\--advertise-address=10.0.0.1 \\--bind-address=0.0.0.0 \\--secure-port=6443 \\--etcd-servers=https://10.0.0.1:2379,https://10.0.0.2:2379,https://10.0.0.3:2379 \\--etcd-cafile=/etc/kubernetes/ssl/ca.pem \\--etcd-certfile=/etc/kubernetes/ssl/etcd.pem \\--etcd-keyfile=/etc/kubernetes/ssl/etcd-key.pem \\--client-ca-file=/etc/kubernetes/ssl/ca.pem \\--tls-cert-file=/etc/kubernetes/ssl/apiserver.pem \\--tls-private-key-file=/etc/kubernetes/ssl/apiserver-key.pem \\--service-account-key-file=/etc/kubernetes/ssl/sa.pub \\--service-cluster-ip-range=10.96.0.0/12 \\--authorization-mode=Node,RBAC \\--enable-admission-plugins=NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook \\--kubelet-certificate-authority=/etc/kubernetes/ssl/ca.pem \\--kubelet-client-certificate=/etc/kubernetes/ssl/apiserver.pem \\--kubelet-client-key=/etc/kubernetes/ssl/apiserver-key.pem \\--v=2Restart=on-failureRestartSec=5LimitNOFILE=65536[Install]WantedBy=multi-user.targetEOF# 依次启动controller-manager和scheduler(配置略)systemctl enable --now kube-apiserver kube-controller-manager kube-scheduler
# 配置kubeletcat <<EOF > /etc/systemd/system/kubelet.service[Unit]Description=Kubernetes KubeletAfter=docker.serviceRequires=docker.service[Service]ExecStart=/usr/local/bin/kubelet \\--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \\--kubeconfig=/etc/kubernetes/kubelet.conf \\--config=/var/lib/kubelet/config.yaml \\--network-plugin=cni \\--cni-conf-dir=/etc/cni/net.d \\--cni-bin-dir=/opt/cni/bin \\--container-runtime=remote \\--container-runtime-endpoint=unix:///run/containerd/containerd.sock \\--runtime-request-timeout=15m \\--cgroup-driver=systemd \\--node-status-update-frequency=10s \\--v=2Restart=on-failureRestartSec=5[Install]WantedBy=multi-user.targetEOF# 配置kube-proxycat <<EOF > /etc/systemd/system/kube-proxy.service[Unit]Description=Kubernetes Kube ProxyDocumentation=https://kubernetes.io/docs/After=network.target[Service]ExecStart=/usr/local/bin/kube-proxy \\--config=/var/lib/kube-proxy/config.conf \\--v=2Restart=on-failureRestartSec=5[Install]WantedBy=multi-user.targetEOF
# 检查组件状态kubectl get cs# 输出示例:# NAME STATUS MESSAGE ERROR# scheduler Healthy ok# controller-manager Healthy ok# etcd-0 Healthy {"health":"true"}# 创建测试Podkubectl run nginx --image=nginx:alpine --port=80kubectl expose deployment nginx --type=NodePortkubectl get svc nginx # 记录NodePort端口curl http://<节点IP>:<NodePort>
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| NodeNotReady | kubelet未注册 | 检查kubelet日志,验证证书有效性 |
| ImagePullBackOff | 镜像仓库不可达 | 配置镜像拉取秘钥或私有仓库镜像 |
| CrashLoopBackOff | Pod启动失败 | 使用kubectl logs查看容器日志 |
| API Server无响应 | etcd集群不可用 | 检查etcd健康状态及网络连通性 |
二进制部署方案虽然操作复杂,但为Kubernetes集群提供了:
对于需要长期维护的生产环境,建议结合Ansible或Terraform实现二进制部署的自动化,在保证灵活性的同时提升部署效率。后续可逐步引入Service Mesh、Operator等高级特性,构建企业级容器平台。