1. 为什么选择二进制方式安装Kubernetes?
在云原生技术蓬勃发展的今天,Kubernetes已经成为容器编排领域的事实标准。不同于常见的kubeadm、minikube等工具化安装方式,二进制安装是直接使用官方编译好的可执行文件进行部署。这种方式虽然步骤相对复杂,但具有以下不可替代的优势:
- 环境掌控度更高:每个组件都以独立进程运行,可以精确控制启动参数和运行环境
- 排障更直观:组件日志分离,问题定位更直接
- 适合生产环境:没有隐藏的自动化操作,所有配置显式声明
- 版本控制灵活:可以自由组合不同版本的组件
我在多个生产环境中采用二进制部署的经验表明,这种方式虽然前期投入时间较多,但后期维护和问题排查的成本显著降低。特别是在需要定制化调度策略或网络方案时,二进制安装提供了最大的灵活性。
2. 环境准备与前置条件
2.1 硬件资源配置建议
对于测试环境,建议至少准备:
- 2核CPU
- 4GB内存
- 30GB磁盘空间
生产环境则需要根据实际负载调整,通常建议:
- Master节点:4核CPU/8GB内存/100GB磁盘
- Node节点:根据容器负载动态扩展
注意:所有节点需要时间同步(建议配置NTP服务),主机名不能重复,且需要关闭swap分区。
2.2 操作系统要求
本次安装基于CentOS 7.x系统,其他Linux发行版需要相应调整命令。关键系统配置如下:
# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 关闭swap swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab2.3 容器运行时准备
Kubernetes v1.34.0默认使用containerd作为容器运行时。安装步骤如下:
# 安装containerd yum install -y containerd.io # 生成默认配置 containerd config default > /etc/containerd/config.toml # 修改sandbox镜像为国内源 sed -i 's|k8s.gcr.io/pause|registry.aliyuncs.com/google_containers/pause|g' /etc/containerd/config.toml # 启动服务 systemctl enable containerd systemctl start containerd3. 核心组件安装与配置
3.1 下载二进制文件
从官方GitHub仓库获取v1.34.0版本的组件:
# 创建安装目录 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs} # 下载核心组件 wget https://dl.k8s.io/v1.34.0/kubernetes-server-linux-amd64.tar.gz tar -zxvf kubernetes-server-linux-amd64.tar.gz cd kubernetes/server/bin cp kube-apiserver kube-controller-manager kube-scheduler kubectl kubelet kube-proxy /opt/kubernetes/bin/3.2 证书体系搭建
使用cfssl工具生成集群所需的各类证书:
# 安装cfssl工具 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 mv cfssl_linux-amd64 /usr/local/bin/cfssl mv cfssljson_linux-amd64 /usr/local/bin/cfssljson # 生成CA证书 cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "87600h" } } } } EOF # 生成各组件证书(示例:apiserver) cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver3.3 组件配置详解
3.3.1 API Server配置
创建/opt/kubernetes/cfg/kube-apiserver.conf配置文件:
KUBE_APISERVER_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/opt/kubernetes/logs \ --etcd-servers=https://192.168.1.100:2379 \ --bind-address=0.0.0.0 \ --secure-port=6443 \ --advertise-address=192.168.1.100 \ --allow-privileged=true \ --service-cluster-ip-range=10.0.0.0/24 \ --enable-admission-plugins=NamespaceLifecycle,NodeRestriction \ --authorization-mode=RBAC,Node \ --kubelet-client-certificate=/opt/kubernetes/ssl/apiserver.pem \ --kubelet-client-key=/opt/kubernetes/ssl/apiserver-key.pem \ --tls-cert-file=/opt/kubernetes/ssl/apiserver.pem \ --tls-private-key-file=/opt/kubernetes/ssl/apiserver-key.pem \ --client-ca-file=/opt/kubernetes/ssl/ca.pem \ --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \ --service-account-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \ --service-account-issuer=https://kubernetes.default.svc.cluster.local"3.3.2 Controller Manager配置
/opt/kubernetes/cfg/kube-controller-manager.conf:
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/opt/kubernetes/logs \ --leader-elect=true \ --kubeconfig=/opt/kubernetes/cfg/kube-controller-manager.kubeconfig \ --bind-address=127.0.0.1 \ --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/ca-key.pem \ --cluster-cidr=10.244.0.0/16 \ --node-cidr-mask-size=24 \ --controllers=*,bootstrapsigner,tokencleaner"4. 服务启动与集群初始化
4.1 systemd服务文件配置
为每个核心组件创建systemd服务单元:
# API Server服务示例 cat > /usr/lib/systemd/system/kube-apiserver.service <<EOF [Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver.conf ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF4.2 启动顺序与依赖关系
正确的组件启动顺序应该是:
- etcd集群
- kube-apiserver
- kube-controller-manager
- kube-scheduler
- kubelet
- kube-proxy
使用以下命令启动服务:
systemctl daemon-reload systemctl enable kube-apiserver kube-controller-manager kube-scheduler systemctl start kube-apiserver kube-controller-manager kube-scheduler4.3 集群状态验证
检查各组件状态:
# 查看服务状态 systemctl status kube-apiserver kube-controller-manager kube-scheduler # 检查集群健康状态 /opt/kubernetes/bin/kubectl --kubeconfig=/root/.kube/config get cs预期输出应显示所有组件状态为Healthy:
NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health":"true"}5. 节点加入与网络配置
5.1 Worker节点部署
在Node节点上重复证书分发和组件安装步骤,特别注意:
- kubelet需要单独配置,指定--bootstrap-kubeconfig参数
- kube-proxy需要配置正确的集群CIDR
- 需要将Master节点生成的/etc/kubernetes/pki目录复制到Node节点
5.2 CNI网络插件选择
推荐使用Calico作为网络插件,安装命令:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml关键配置参数:
- CALICO_IPV4POOL_CIDR:需要与kube-controller-manager的--cluster-cidr参数一致
- IP_AUTODETECTION_METHOD:在多网卡环境下指定正确的网卡
5.3 节点加入集群
在Master节点生成加入命令:
kubeadm token create --print-join-command在Worker节点执行输出的join命令,完成后在Master节点验证:
kubectl get nodes6. 生产环境优化建议
6.1 高可用架构设计
对于生产环境,建议采用以下高可用方案:
- API Server:3节点,前置负载均衡
- etcd:奇数节点集群(3/5节点)
- Worker节点:根据业务需求水平扩展
6.2 关键参数调优
API Server:
- --max-requests-inflight:根据节点规模调整(默认400)
- --event-ttl:延长事件保留时间(默认1h)
kubelet:
- --max-pods:单节点最大Pod数量(默认110)
- --kube-api-qps:与API Server通信的QPS限制(默认5)
etcd:
- 定期执行defrag操作
- 监控db size增长趋势
6.3 监控与日志方案
推荐部署:
- Prometheus + Grafana:集群监控
- EFK(Elasticsearch+Fluentd+Kibana):日志收集
- Alertmanager:告警通知
7. 常见问题排查指南
7.1 证书相关错误
典型错误现象:
- x509: certificate signed by unknown authority
- x509: certificate has expired or is not yet valid
解决方案:
- 检查所有节点时间同步
- 确保证书有效期足够长(建议87600h)
- 验证证书CN和SAN配置
7.2 网络连通性问题
排查步骤:
- 检查Calico Pod状态
- 验证节点间网络连通性
- 检查iptables/nftables规则
- 确认网络插件配置正确
7.3 组件启动失败
通用排查方法:
- journalctl -u 服务名 -f 查看实时日志
- 检查配置文件语法
- 验证依赖服务(如etcd)是否正常
- 检查端口冲突情况
我在实际运维中发现,90%的启动问题都与证书配置或网络连通性有关。建议首次部署时逐步验证每个组件的启动状态,不要一次性启动所有服务。