1. 为什么需要Kubernetes?
在容器化技术普及的今天,Docker等工具已经让应用打包和分发变得简单。但当我们面对成百上千个容器时,如何高效管理它们就成了新的挑战。这正是Kubernetes(简称k8s)要解决的问题。
我最初接触k8s是在一个电商大促项目中。当时我们使用Docker Swarm管理容器,但随着服务实例数量突破200个,频繁出现的调度不均、网络通信故障让我们疲于奔命。切换到k8s后,其强大的自动扩缩容和故障自愈能力让运维效率提升了60%以上。
k8s的核心价值在于:
- 自动化运维:自动部署、重启故障容器、弹性扩缩容
- 资源优化:智能调度容器到最优节点
- 声明式配置:通过YAML文件定义期望状态
- 服务发现:内置DNS和负载均衡
- 滚动更新:支持零停机部署
2. 环境准备与前置条件
2.1 硬件资源要求
根据官方建议和生产实践,我总结出以下配置方案:
| 节点类型 | CPU | 内存 | 磁盘 | 数量 | 网络 |
|---|---|---|---|---|---|
| Master | 2核+ | 4GB+ | 40GB | 奇数台 | 千兆 |
| Worker | 4核+ | 8GB+ | 100GB | 按需 | 千兆 |
注意:这是最小生产环境配置。开发测试环境可以用1核2GB的配置,但会明显影响性能。
2.2 操作系统配置
我强烈推荐使用Ubuntu 20.04 LTS或CentOS 7/8作为基础系统。以下是必须完成的系统配置:
# 关闭swap(k8s 1.8+要求) sudo swapoff -a sed -i '/swap/s/^/#/' /etc/fstab # 设置主机名 sudo hostnamectl set-hostname k8s-master # 配置hosts cat <<EOF | sudo tee -a /etc/hosts 192.168.1.100 k8s-master 192.168.1.101 k8s-node1 192.168.1.102 k8s-node2 EOF # 加载内核模块 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 # 设置内核参数 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system3. 容器运行时安装与配置
3.1 Docker安装与调优
虽然k8s已经支持containerd等运行时,但Docker仍是目前最成熟的选择。这是我优化过的安装脚本:
# 安装依赖 sudo apt-get update && sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 设置稳定版仓库 echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker引擎 sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io # 配置Docker守护进程 sudo mkdir -p /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "registry-mirrors": ["https://registry.docker-cn.com"] } EOF # 重启服务 sudo systemctl enable docker && sudo systemctl daemon-reload && sudo systemctl restart docker关键配置说明:
native.cgroupdriver=systemd:与k8s的kubelet保持一致overlay2:推荐使用的存储驱动- 国内用户建议添加镜像加速器
4. Kubernetes集群部署实战
4.1 使用kubeadm部署集群
kubeadm是官方推荐的部署工具,它简化了集群初始化过程。以下是我在100+次部署中总结的最佳实践:
# 安装kubeadm、kubelet和kubectl sudo apt-get update && sudo apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl # 初始化Master节点(国内环境需添加镜像参数) sudo kubeadm init \ --apiserver-advertise-address=192.168.1.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.22.4 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 # 配置kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 安装网络插件(推荐Calico) kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml初始化完成后会输出加入集群的命令,类似:
kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4.2 Worker节点加入集群
在每个Worker节点执行上述join命令即可。加入后验证节点状态:
kubectl get nodes常见问题处理:
- 如果token过期,在Master节点执行
kubeadm token create --print-join-command生成新命令 - 节点状态为NotReady通常是网络插件未正确安装
- 使用
kubectl describe node <node-name>查看详细问题
5. 关键组件与网络方案选型
5.1 CNI网络插件对比
我测试过的主流网络方案性能对比:
| 方案 | 性能损耗 | 配置复杂度 | 网络策略支持 | 适用场景 |
|---|---|---|---|---|
| Calico | 8-12% | 中等 | 完善 | 生产环境首选 |
| Flannel | 5-8% | 简单 | 有限 | 开发测试环境 |
| Weave | 15-20% | 复杂 | 完善 | 需要加密的场景 |
推荐选择Calico,它在网络策略和性能间取得了良好平衡。安装后务必检查pod间通信:
kubectl run test-1 --image=busybox -- sleep 3600 kubectl run test-2 --image=busybox -- sleep 3600 kubectl exec test-1 -- ping test-25.2 Ingress控制器选型
根据流量特征选择Ingress控制器:
- Nginx Ingress:适合HTTP/HTTPS流量,配置灵活
- Traefik:动态配置能力强,适合微服务架构
- HAProxy:极致性能,适合高并发场景
安装Nginx Ingress的示例:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml6. 生产环境优化建议
6.1 Master节点高可用
生产环境需要至少3个Master节点实现高可用。使用kubeadm扩展控制平面:
# 在第二个Master节点执行 kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ --control-plane --certificate-key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 添加负载均衡器(如HAProxy)配置 frontend k8s-api bind *:6443 mode tcp default_backend k8s-masters backend k8s-masters mode tcp balance roundrobin server master1 192.168.1.100:6443 check server master2 192.168.1.110:6443 check server master3 192.168.1.120:6443 check6.2 关键监控指标
必须监控的核心指标包括:
- 节点CPU/内存/磁盘使用率
- Pod重启次数
- API服务器延迟
- 网络丢包率
推荐使用Prometheus+Grafana组合:
# 安装kube-prometheus-stack helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack7. 常见问题排查指南
7.1 Pod一直处于Pending状态
排查步骤:
- 查看事件详情
kubectl describe pod <pod-name> - 检查资源配额
kubectl describe nodes | grep -A 10 "Allocated resources" - 验证节点污点设置
kubectl describe node | grep Taint
7.2 服务无法访问
经典排查流程:
# 1. 检查Service端点 kubectl get endpoints <service-name> # 2. 验证网络策略 kubectl get networkpolicy # 3. 测试DNS解析 kubectl run -it --rm --image=busybox dns-test -- nslookup kubernetes.default # 4. 检查Ingress控制器日志 kubectl logs -n ingress-nginx <ingress-pod-name>8. 学习资源与进阶路线
8.1 官方认证路径
- CKAD(认证Kubernetes应用开发者):侧重应用部署
- CKA(认证Kubernetes管理员):侧重集群运维
- CKS(认证Kubernetes安全专家):安全专项
8.2 推荐实验项目
- 使用StatefulSet部署有状态应用(如MySQL集群)
- 实现蓝绿部署策略
- 配置HPA自动扩缩容
- 使用Operator管理复杂应用
我在实际教学中发现,通过部署一个完整的WordPress网站(包含MySQL、PHP、Nginx)是最快掌握k8s核心概念的方式。这个项目会用到:
- Deployment
- Service
- PersistentVolume
- ConfigMap
- Secret
# 示例WordPress部署 kubectl apply -f https://k8s.io/examples/application/wordpress/mysql-deployment.yaml kubectl apply -f https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml