Kubernetes核心概念与集群部署实践指南
1. Kubernetes基础概念解析
Kubernetes(简称k8s)作为当前最主流的容器编排系统,已经成为云原生时代的基石技术。对于初学者而言,掌握其核心概念是后续深入学习的必经之路。我们先从最基础的组件开始拆解:
1.1 核心架构组件
Master节点:集群的大脑,包含API Server(唯一入口)、Scheduler(调度决策)、Controller Manager(状态维护)和etcd(分布式存储)四大核心组件。实际部署中通常采用多Master高可用架构,通过负载均衡对外提供服务。
Node节点:工作负载的实际运行环境,包含kubelet(节点代理)、kube-proxy(网络代理)和容器运行时(如Docker、containerd)三大必备组件。生产环境建议每个Node配置不少于4核8G资源。
Pod:最小调度单元,本质是一组共享网络和存储空间的容器集合。例如一个Web应用Pod可能包含主业务容器和日志收集sidecar容器。
经验提示:etcd对磁盘IOPS要求极高,建议使用SSD并单独部署,避免与其他组件争抢资源。
1.2 关键API对象解析
# 典型Deployment配置示例 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.19 ports: - containerPort: 80Deployment:声明式更新利器,通过ReplicaSet实现滚动更新和回滚。上述配置中
replicas:3确保始终有3个Pod副本运行。Service:定义Pod访问策略的抽象层,支持ClusterIP(集群内访问)、NodePort(节点端口暴露)和LoadBalancer(云厂商负载均衡集成)三种类型。
ConfigMap & Secret:配置与敏感信息管理方案。前者存储明文配置(如nginx.conf),后者存储加密数据(如TLS证书),均支持热加载。
2. 集群初始化深度实践
2.1 环境准备要点
硬件要求:
- Master节点:2核4G起步,生产环境建议4核8G以上
- Node节点:根据工作负载调整,建议4核8G起步
- 网络:节点间延迟<1ms,带宽≥1Gbps
系统配置检查清单:
- 关闭swap:
swapoff -a并注释/etc/fstab中的swap行 - 设置正确的hostname:
hostnamectl set-hostname k8s-master01 - 时间同步:配置chrony或ntpd保证时间误差<100ms
- 内核参数调整:
cat > /etc/sysctl.d/k8s.conf <<EOF net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
- 关闭swap:
2.2 使用kubeadm初始化集群
# 在所有节点执行 apt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update && apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl # 仅在Master执行 kubeadm init \ --apiserver-advertise-address=192.168.1.100 \ --pod-network-cidr=10.244.0.0/16 \ --image-repository registry.aliyuncs.com/google_containers # 配置kubectl mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config # 安装网络插件(以flannel为例) kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml关键参数解析:
--pod-network-cidr:必须与后续安装的CNI插件网段匹配--image-repository:国内环境建议使用阿里云镜像源- flannel的yaml可能需要根据k8s版本调整,最新版本见官方GitHub
2.3 节点加入与验证
# 在Master获取join命令 kubeadm token create --print-join-command # 在Node节点执行输出结果(示例) kubeadm join 192.168.1.100:6443 \ --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:1234...cdef # 验证集群状态 kubectl get nodes -o wide kubectl get pods -n kube-system预期正常状态:
- 所有节点STATUS为Ready
- kube-system命名空间下CoreDNS、flannel等组件均为Running
3. 高频问题排查指南
3.1 初始化阶段典型问题
| 故障现象 | 排查命令 | 解决方案 |
|---|---|---|
| kubelet不断重启 | journalctl -u kubelet -f | 检查docker/containerd是否运行,cgroup驱动是否一致 |
| API Server无法访问 | curl -k https://localhost:6443 | 确认防火墙关闭,6443端口监听正常 |
| Pod网络不通 | kubectl describe pod <pod-name> | 检查CNI插件配置,确认node间路由可达 |
3.2 证书相关问题处理
# 检查证书过期时间 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not # 手动更新证书(kubeadm 1.15+) kubeadm alpha certs renew all systemctl restart kubelet证书过期常见表现:
- kubectl执行命令报
x509: certificate has expired or is not yet valid - kubelet日志出现
Failed to renew certificate错误
3.3 资源清理与重置
# 彻底重置节点(危险操作!) kubeadm reset -f iptables -F && iptables -t nat -F ipvsadm --clear rm -rf /etc/cni/net.d /etc/kubernetes $HOME/.kube重要提醒:reset操作会删除所有k8s配置和容器,仅应在测试环境或确定需要重建时使用
4. 生产环境优化建议
4.1 高可用部署方案
Stacked etcd拓扑:适合中小规模集群
- 3个Master节点同时运行etcd和control plane组件
- 需要配置负载均衡器指向多个Master的6443端口
外部etcd集群:适合大规模生产环境
- 独立部署3-5个etcd节点
- 配置
--etcd-servers=https://etcd1:2379,https://etcd2:2379
4.2 关键参数调优
# kubelet配置示例(/var/lib/kubelet/config.yaml) apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration maxPods: 150 # 根据节点资源调整 kubeReserved: cpu: "1" memory: 1Gi systemReserved: cpu: "0.5" memory: 512Mi evictionHard: memory.available: "200Mi" nodefs.available: "10%"4.3 监控与日志方案
监控体系:
- Prometheus Operator:自动发现监控目标
- kube-state-metrics:集群状态指标导出
- Node Exporter:节点资源监控
日志收集:
- EFK Stack(Elasticsearch+Fluentd+Kibana)
- Loki:轻量级日志聚合方案
# 快速部署metrics-server kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml # 添加--kubelet-insecure-tls参数(仅测试环境) kubectl edit deploy -n kube-system metrics-server