1. Kubernetes集群搭建概述
在云原生技术蓬勃发展的今天,Kubernetes(简称k8s)已成为容器编排领域的事实标准。作为一名长期从事DevOps工作的工程师,我见证了从手工部署到自动化编排的完整演进历程。搭建生产级k8s集群看似简单,实则暗藏诸多技术细节,特别是在工具链的选择和配置上,一个微小的参数差异就可能导致后续运维的连锁问题。
这次我将分享基于主流云环境的k8s集群工具安装全流程,重点解析工具选型背后的技术考量。不同于官方文档的标准化描述,我会结合在金融、电商等多个行业落地k8s的实际经验,揭示那些只有踩过坑才知道的关键配置项。无论是准备搭建第一个测试集群的新手,还是需要优化现有部署的老兵,都能从中获得可直接落地的实践方案。
2. 基础环境准备
2.1 操作系统选型与配置
在集群搭建的初始阶段,操作系统的选择往往被轻视,但这恰恰是后续稳定性的基石。经过多个项目的对比验证,我强烈推荐使用CentOS 7.9或Ubuntu 20.04 LTS作为基础系统,原因有三:
- 内核版本(分别对应3.10和5.4)完美支持容器运行时所需特性
- 长期支持周期确保安全更新的持续性
- 社区资源丰富,遇到问题容易找到解决方案
系统基础配置需要特别注意:
# 关闭swap(kubelet的硬性要求) sudo swapoff -a sed -i '/ swap / s/^/#/' /etc/fstab # 设置正确的hostname(集群通信依赖) hostnamectl set-hostname node1 # 加载内核模块(overlay网络和iptables必需) cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOF # 立即加载模块 sudo modprobe -- br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack关键提示:在金融行业项目中曾因未加载ip_vs模块导致kube-proxy性能下降50%,这个教训价值百万
2.2 容器运行时选型
2020年后,Docker已不再是k8s唯一支持的运行时。根据实际性能测试数据,我给出不同场景下的选型建议:
| 运行时 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| containerd | 生产环境首选 | 资源占用少,稳定性高 | 调试复杂度略高 |
| CRI-O | OpenShift环境 | 红帽系兼容性好 | 社区生态较小 |
| Docker | 开发测试环境 | 工具链完善 | 有被废弃风险 |
安装containerd的优化配置:
# 安装依赖 yum install -y containerd.io # 生成默认配置 containerd config default > /etc/containerd/config.toml # 关键修改项(加速镜像拉取和设置cgroup驱动) sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml sed -i 's/sandbox_image = ".*"/sandbox_image = "registry.aliyuncs.com\/google_containers\/pause:3.6"/' /etc/containerd/config.toml # 重启服务 systemctl restart containerd3. 核心工具链安装
3.1 kubeadm的定制化安装
kubeadm是官方推荐的集群引导工具,但直接使用默认参数往往不能满足生产需求。以下是经过多个集群验证的安装方案:
# 配置yum源(使用阿里云镜像加速) cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF # 安装指定版本(生产环境建议锁定小版本) yum install -y kubeadm-1.23.8 kubelet-1.23.8 kubectl-1.23.8 # 防止自动更新导致版本漂移 yum versionlock add kubeadm kubelet kubectl3.2 集群初始化参数设计
kubeadm init的默认配置仅适合测试环境,生产部署需要精心设计配置文件。以下是我在电商大促场景下验证过的配置模板:
apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.1.100 bindPort: 6443 nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock kubeletExtraArgs: cgroup-driver: systemd max-pods: "250" --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: 1.23.8 controlPlaneEndpoint: "k8s-api.example.com:6443" apiServer: extraArgs: service-node-port-range: 30000-32767 certSANs: - "k8s-api.example.com" - "192.168.1.100" networking: podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12 --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd failSwapOn: false初始化命令需要添加关键参数:
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log血泪教训:某次因未设置controlPlaneEndpoint导致控制平面升级失败,集群需要重建
4. 网络插件与监控部署
4.1 CNI插件选型对比
网络插件直接影响集群性能和故障排查难度。根据压测数据对比:
| 插件类型 | 吞吐量 | 延迟 | 易用性 | 适用场景 |
|---|---|---|---|---|
| Calico | 12Gbps | 1.2ms | ★★★★ | 需要网络策略 |
| Flannel | 15Gbps | 0.8ms | ★★★★★ | 简单场景 |
| Cilium | 18Gbps | 0.5ms | ★★★ | 高性能需求 |
安装Calico的优化配置:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml # 调整IP池配置(匹配初始化时的podSubnet) kubectl patch ipPool default-ipv4-ippool --type merge \ --patch '{"spec": {"cidr": "10.244.0.0/16"}}'4.2 核心监控组件
没有监控的集群就像没有仪表的飞机。必装的核心监控套件:
Metrics Server:集群资源指标采集
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yamlkube-state-metrics:资源对象状态监控
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install kube-state-metrics prometheus-community/kube-state-metrics自定义Dashboard:关键指标可视化
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
5. 生产级加固措施
5.1 证书自动续期配置
默认情况下k8s证书有效期仅1年,需要修改kubeadm配置实现自动续期:
apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration controllerManager: extraArgs: experimental-cluster-signing-duration: "87600h" # 10年 feature-gates: "RotateKubeletServerCertificate=true" certificatesDir: /etc/kubernetes/pki clusterName: production5.2 关键安全策略
Pod安全策略(PSP)示例:
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: restricted spec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes: - 'configMap' - 'emptyDir' hostNetwork: false hostIPC: false hostPID: false网络策略示例(限制default命名空间访问):
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress - Egress
6. 常见故障排查手册
6.1 节点NotReady问题排查流程
检查kubelet状态:
journalctl -u kubelet -n 50 --no-pager验证容器运行时:
crictl ps -a检测网络连通性:
kubectl get --raw='/readyz?verbose'
6.2 证书过期应急方案
当出现x509证书错误时,快速恢复步骤:
# 备份原有证书 mv /etc/kubernetes/pki/apiserver.{crt,key} ~/ # 重新生成证书 kubeadm alpha certs renew all # 重启组件 docker ps | grep kube-apiserver | awk '{print $1}' | xargs docker restart经过数十次集群部署的锤炼,我总结出最关键的三个原则:版本锁定、配置版本化、变更可回滚。每次升级前务必在测试环境验证,生产环境的k8s集群就像精密的瑞士手表,每个零件都需要精准配合。