1. 为什么选择二进制安装Kubernetes?
在容器编排领域,Kubernetes(简称K8s)的安装方式主要分为两大类:使用kubeadm等工具快速部署和手动二进制安装。二进制安装虽然步骤繁琐,但却是理解K8s架构最彻底的方式。我经历过从kubeadm到二进制安装的完整迁移过程,深刻体会到二进制方式带来的三大优势:
- 架构透明性:每个组件都以独立进程运行,日志分离,便于故障排查
- 定制灵活性:可自由指定各个组件的版本、启动参数和部署位置
- 生产适用性:国内多数企业的生产环境仍采用二进制部署方式
重要提示:二进制安装适合需要深度掌控K8s的团队,新手建议先用kubeadm熟悉基本操作后再尝试。
2. 环境准备与组件规划
2.1 硬件资源配置建议
根据我参与的多个生产级部署案例,建议采用如下配置(以4节点集群为例):
| 角色 | CPU | 内存 | 磁盘 | 网络 | 数量 |
|---|---|---|---|---|---|
| Master节点 | 4核+ | 8G+ | 100G+ | 千兆双网卡 | 2 |
| Worker节点 | 8核+ | 16G+ | 200G+ | 万兆生产网卡 | 2 |
| 负载均衡 | 2核 | 4G | 50G | 千兆双网卡 | 2 |
2.2 软件版本选型策略
版本兼容性是二进制安装的最大挑战之一。经过多次踩坑验证,推荐以下稳定组合:
# 组件版本清单(经过生产验证) K8S_VERSION="v1.23.6" # 长期支持版本 ETCD_VERSION="v3.5.3" # 匹配K8s版本要求 CNI_PLUGIN="calico-v3.22.1" # 网络插件 CONTAINERD="1.6.4" # 容器运行时避坑经验:避免使用各组件的最新版本,奇数版本(如1.25)通常含有实验性功能,生产环境应选择偶数版本。
3. 核心组件安装实战
3.1 证书体系构建
二进制安装最大的技术难点在于证书管理。这是我总结的证书生成模板:
# 生成CA根证书(有效期10年) openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key \ -subj "/CN=kubernetes-ca" -days 3650 -out ca.crt # 生成apiserver证书(注意SAN配置) cat > apiserver-csr.json <<EOF { "CN": "kube-apiserver", "hosts": [ "127.0.0.1", "192.168.101.100", # Master节点IP "10.96.0.1", # Service Cluster IP "kubernetes", "kubernetes.default" ], "key": { "algo": "rsa", "size": 2048 } } EOF证书生成后需要严格验证:
# 验证证书链完整性 openssl verify -CAfile ca.crt apiserver.crt # 检查证书有效期 openssl x509 -in apiserver.crt -noout -dates3.2 etcd集群部署
etcd作为K8s的大脑,其部署质量直接影响集群稳定性。这是我优化过的启动脚本:
# etcd启动参数关键配置 ETCD_OPTS=" --name=etcd01 \ --data-dir=/var/lib/etcd \ --listen-peer-urls=https://192.168.101.100:2380 \ --listen-client-urls=https://192.168.101.100:2379,https://127.0.0.1:2379 \ --advertise-client-urls=https://192.168.101.100:2379 \ --initial-advertise-peer-urls=https://192.168.101.100:2380 \ --initial-cluster=etcd01=https://192.168.101.100:2380,etcd02=https://192.168.101.101:2380 \ --client-cert-auth=true \ --trusted-ca-file=/etc/kubernetes/pki/ca.crt \ --cert-file=/etc/kubernetes/pki/etcd/server.crt \ --key-file=/etc/kubernetes/pki/etcd/server.key "健康检查方法:
# 检查集群成员 ETCDCTL_API=3 etcdctl \ --endpoints=https://192.168.101.100:2379 \ --cacert=/etc/kubernetes/pki/ca.crt \ --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \ --key=/etc/kubernetes/pki/etcd/healthcheck-client.key \ member list4. 控制平面组件配置
4.1 kube-apiserver关键参数
apiserver是集群的网关,这些参数经过生产环境验证:
# /usr/lib/systemd/system/kube-apiserver.service [Service] ExecStart=/usr/local/bin/kube-apiserver \ --advertise-address=192.168.101.100 \ --allow-privileged=true \ --authorization-mode=Node,RBAC \ --client-ca-file=/etc/kubernetes/pki/ca.crt \ --enable-admission-plugins=NodeRestriction \ --enable-bootstrap-token-auth=true \ --etcd-cafile=/etc/kubernetes/pki/ca.crt \ --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt \ --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key \ --etcd-servers=https://192.168.101.100:2379,https://192.168.101.101:2379 \ --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt \ --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key \ --service-account-key-file=/etc/kubernetes/pki/sa.pub \ --service-account-signing-key-file=/etc/kubernetes/pki/sa.key \ --service-cluster-ip-range=10.96.0.0/12 \ --tls-cert-file=/etc/kubernetes/pki/apiserver.crt \ --tls-private-key-file=/etc/kubernetes/pki/apiserver.key \ --request-timeout=300s \ # 调大超时防止长操作失败 --max-mutating-requests-inflight=500 \ # 提升写操作并发 --max-requests-inflight=1500 # 提升读操作并发4.2 高可用负载均衡配置
生产环境必须配置负载均衡,这是用Nginx实现LB的配置示例:
stream { upstream kube-apiserver { server 192.168.101.100:6443 max_fails=3 fail_timeout=30s; server 192.168.101.101:6443 max_fails=3 fail_timeout=30s; } server { listen 6443; proxy_pass kube-apiserver; proxy_connect_timeout 2s; proxy_timeout 900s; # 保持长连接 } }健康检查脚本:
#!/bin/bash APISERVERS=("192.168.101.100" "192.168.101.101") for ip in "${APISERVERS[@]}"; do if ! curl -sk --connect-timeout 2 https://${ip}:6443/healthz; then systemctl restart kube-apiserver fi done5. 工作节点部署
5.1 containerd容器运行时优化
containerd的配置直接影响容器性能,关键配置如下:
# /etc/containerd/config.toml [plugins."io.containerd.grpc.v1.cri"] sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6" [plugins."io.containerd.grpc.v1.cri".containerd] snapshotter = "overlayfs" [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://registry-1.docker.io"] [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] runtime_type = "io.containerd.runc.v2" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true # 使用systemd cgroup驱动5.2 kubelet关键参数调优
kubelet是节点核心组件,这些参数能显著提升稳定性:
# /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration evictionHard: memory.available: "500Mi" nodefs.available: "10%" imagefs.available: "15%" maxPods: 150 # 根据节点规格调整 kubeAPIQPS: 50 kubeAPIBurst: 100 serializeImagePulls: false # 并行拉取镜像 rotateCertificates: true # 自动轮换证书6. 网络插件与集群验证
6.1 Calico网络部署技巧
Calico是生产环境首选网络方案,部署时注意:
# 修改calico.yaml关键参数 sed -i 's|192.168.0.0/16|10.244.0.0/16|g' calico.yaml # 修改Pod网段 sed -i '/FELIX_IPTABLESBACKEND/s/^# //g' calico.yaml # 启用iptables-nft # 启用BGP路由(提升网络性能) cat >> calico.yaml <<EOF - name: CALICO_IPV4POOL_IPIP value: "Never" - name: IP_AUTODETECTION_METHOD value: "interface=eth.*" EOF6.2 集群健康检查大全
部署完成后必须执行的检查项:
# 检查节点状态 kubectl get nodes -o wide # 检查核心组件健康状态 kubectl get --raw='/readyz?verbose' # 检查证书过期时间 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates # 压力测试(创建100个nginx pod) kubectl run test --image=nginx --replicas=100 --port=807. 生产环境运维要点
7.1 证书自动轮换方案
证书过期是生产环境常见故障,推荐使用cert-manager实现自动续期:
# 安装cert-manager kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.yaml # 创建CA Issuer cat <<EOF | kubectl apply -f - apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: ca-issuer namespace: kube-system spec: ca: secretName: ca-key-pair EOF7.2 监控与日志方案
必须部署的监控三件套:
指标监控:Prometheus-Operator + Grafana
helm install prometheus-stack prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --set alertmanager.enabled=false日志收集:Loki + Promtail
helm install loki grafana/loki-stack \ --namespace logging \ --set promtail.enabled=true事件审计:启用K8s审计日志
# /etc/kubernetes/audit-policy.yaml apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: Metadata resources: - group: "" resources: ["secrets", "configmaps"]
经过多次生产环境部署验证,二进制安装的K8s集群在稳定性方面明显优于工具化安装方案。特别是在需要深度定制的场景下,二进制方式能让你对集群的每个细节都了如指掌。记得定期检查证书有效期,这是运维过程中最容易忽视的风险点。