
1. Kubernetes (K8s) 基础概念解析Kubernetes简称K8s作为容器编排领域的事实标准已经成为现代云原生应用的核心基础设施。我第一次接触K8s是在2017年当时团队正在将单体应用拆分为微服务架构传统的手工管理Docker容器方式已经无法满足需求。K8s的出现彻底改变了我们的运维方式从手动管理几十台服务器上的容器到通过声明式配置管理上千个服务实例。K8s本质上是一个开源的容器编排系统它提供了自动化部署、扩展和管理容器化应用程序的能力。其核心设计理念包括声明式配置通过YAML文件描述应用期望状态自我修复自动重启失败容器、替换不可用节点水平扩展根据CPU负载或其他指标自动调整副本数服务发现与负载均衡自动分配IP和DNS名称存储编排自动挂载存储系统本地/NFS/云存储密钥与配置管理安全地存储和管理敏感信息2. K8s 核心组件架构详解2.1 控制平面组件控制平面是K8s集群的大脑负责全局决策和集群状态管理。主要组件包括API Server集群的前端接口所有操作都通过REST API进行。这是我们日常使用kubectl命令时实际交互的组件。在生产环境中通常会部署多个API Server实例以实现高可用。etcd分布式键值存储保存集群所有配置数据。etcd对性能敏感建议使用SSD存储。我们曾经因为etcd磁盘性能问题导致整个集群响应缓慢后来通过以下优化解决分离etcd数据目录到独立磁盘定期执行数据压缩启用etcd监控告警Controller Manager运行各种控制器进程确保集群当前状态与期望状态一致。包括节点控制器、副本控制器、端点控制器等。Scheduler负责将新创建的Pod分配到合适的节点。调度决策考虑因素包括资源请求与限制亲和性/反亲和性规则数据局部性污点和容忍2.2 工作节点组件每个工作节点运行以下关键组件kubelet节点上的代理负责与API Server通信管理Pod生命周期。它会定期向API Server报告节点状态。kube-proxy维护节点上的网络规则实现服务抽象和负载均衡。支持三种代理模式userspace已淘汰iptables默认IPVS高性能场景推荐容器运行时实际运行容器的软件如Docker、containerd或CRI-O。我们团队从Docker迁移到containerd后内存占用减少了约15%。3. K8s 对象模型与核心概念3.1 Pod最小部署单元Pod是K8s中最小的可部署单元代表集群中运行的单个进程。一个Pod包含一个或多个容器紧密耦合共享存储卷网络命名空间其他容器运行时的配置在实际使用中我们遵循以下Pod设计原则单一职责一个Pod只做一件事临时性Pod应该是可随时替换的声明式配置通过YAML定义而非命令式创建3.2 控制器管理Pod的生命周期K8s提供多种控制器来管理PodDeployment最常用的控制器适合无状态应用。支持滚动更新和回滚。我们通常这样定义DeploymentapiVersion: 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: 80StatefulSet用于有状态应用提供稳定的网络标识和持久存储。适合数据库等应用。DaemonSet确保所有或部分节点运行一个Pod副本常用于日志收集、监控代理等场景。3.3 服务发现与负载均衡Service是K8s中抽象服务访问的方式主要类型包括ClusterIP默认类型分配集群内部IP只能在集群内部访问。NodePort在每个节点上开放静态端口外部可通过 : 访问。LoadBalancer使用云提供商的负载均衡器向外部暴露服务。ExternalName通过返回CNAME记录映射到外部服务。我们通常使用Ingress来管理外部访问配合Nginx Ingress Controller实现基于路径的路由TLS终止流量控制4. K8s 集群部署实战4.1 部署方案选择根据团队规模和需求K8s部署有多种选择托管服务推荐新手Google GKEAmazon EKSAzure AKS工具部署kubeadm官方推荐kops适合AWSkubespray基于Ansible发行版RancherOpenShiftTKE我们团队使用kubeadm部署生产集群时遵循以下步骤4.2 使用kubeadm部署生产级集群前置准备至少3台Linux服务器2C4G以上配置禁用swap确保节点间网络互通同步系统时间安装步骤在所有节点安装Docker和kubeadm# 安装Docker apt-get update apt-get install -y docker.io # 安装kubeadm, kubelet和kubectl 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在主节点初始化集群kubeadm init --pod-network-cidr10.244.0.0/16 \ --apiserver-advertise-address主节点IP \ --control-plane-endpoint负载均衡IP或域名安装网络插件以Calico为例kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml加入工作节点kubeadm join 主节点IP:6443 --token token \ --discovery-token-ca-cert-hash sha256:hash生产环境建议使用高可用控制平面至少3个主节点为etcd配置SSD存储启用集群自动扩缩容配置监控和日志系统5. K8s 日常运维实践5.1 监控与日志有效的监控是K8s运维的关键。我们使用以下工具栈Prometheus收集指标数据部署方式helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install prometheus prometheus-community/kube-prometheus-stackGrafana可视化监控数据预配置K8s仪表盘设置关键告警节点CPU/内存、Pod重启等EFK Stack日志收集Fluentd/Fluent Bit日志收集器Elasticsearch日志存储Kibana日志查询界面5.2 常见运维操作应用部署与更新# 部署应用 kubectl apply -f deployment.yaml # 滚动更新 kubectl set image deployment/nginx-deployment nginxnginx:1.20 # 查看更新状态 kubectl rollout status deployment/nginx-deployment # 回滚 kubectl rollout undo deployment/nginx-deployment故障排查# 查看Pod日志 kubectl logs pod-name -c container-name # 进入Pod调试 kubectl exec -it pod-name -- /bin/sh # 查看事件 kubectl get events --sort-by.metadata.creationTimestamp资源管理# 查看资源使用 kubectl top nodes kubectl top pods # 设置资源限制 # 在Pod spec中 resources: requests: cpu: 500m memory: 512Mi limits: cpu: 1000m memory: 1Gi5.3 备份与恢复定期备份etcd数据至关重要# 备份 ETCDCTL_API3 etcdctl --endpointshttps://127.0.0.1:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/server.crt \ --key/etc/kubernetes/pki/etcd/server.key \ snapshot save snapshot.db # 恢复 kubeadm reset ETCDCTL_API3 etcdctl snapshot restore snapshot.db \ --data-dir /var/lib/etcd-from-backup6. 高级特性与最佳实践6.1 配置管理ConfigMap存储非敏感配置apiVersion: v1 kind: ConfigMap metadata: name: app-config data: APP_COLOR: blue APP_MODE: prodSecret存储敏感信息自动base64编码kubectl create secret generic db-secret \ --from-literalusernameadmin \ --from-literalpasswordS!B\*d$zDsb6.2 自动扩缩容Horizontal Pod Autoscaler (HPA)kubectl autoscale deployment nginx-deployment \ --cpu-percent50 --min2 --max10Cluster Autoscaler自动调整节点数量需要云提供商支持6.3 网络策略使用NetworkPolicy实现Pod间访问控制apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: db-access spec: podSelector: matchLabels: role: db ingress: - from: - podSelector: matchLabels: role: api ports: - protocol: TCP port: 54327. 安全加固实践7.1 RBAC权限控制apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules: - apiGroups: [] resources: [pods] verbs: [get, watch, list]7.2 Pod安全策略apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: restricted spec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes: - configMap - emptyDir - projected - secret - downwardAPI - persistentVolumeClaim hostNetwork: false hostIPC: false hostPID: false runAsUser: rule: MustRunAsNonRoot seLinux: rule: RunAsAny supplementalGroups: rule: MustRunAs ranges: - min: 1 max: 65535 fsGroup: rule: MustRunAs ranges: - min: 1 max: 65535 readOnlyRootFilesystem: false7.3 镜像安全扫描集成镜像扫描工具如Trivy或Clair# 使用Trivy扫描镜像 trivy image nginx:1.198. 性能优化技巧节点优化调整内核参数使用性能更好的容器运行时如containerd确保节点有足够资源特别是内存Pod优化设置合理的资源请求和限制使用适当的QoS类别避免使用hostNetwork除非必要调度优化使用节点亲和性/反亲和性配置Pod拓扑分布约束使用污点和容忍网络优化选择高性能网络插件如Calico或Cilium启用IPVS代理模式调整conntrack参数9. 常见问题排查指南9.1 Pod启动失败检查步骤kubectl describe pod pod-namekubectl logs pod-name -c container-name检查事件kubectl get events --sort-by.metadata.creationTimestamp常见原因镜像拉取失败检查镜像名称和凭证资源不足检查requests/limits健康检查失败调整readiness/liveness探针9.2 网络连接问题排查工具# 检查Service Endpoints kubectl get endpoints service-name # 测试DNS解析 kubectl run -it --rm --restartNever busybox --imagebusybox -- nslookup service-name # 测试网络连通性 kubectl run -it --rm --restartNever busybox --imagebusybox -- ping pod-ip9.3 存储问题常见问题PVC处于Pending状态检查StorageClass和PV挂载失败检查volumeMounts路径权限问题检查fsGroup和securityContext10. 学习资源与社区官方文档https://kubernetes.io/docs/互动教程https://kubernetes.io/docs/tutorials/K8s the Hard Way深入学习K8s底层原理社区Kubernetes SlackCNCF社区活动本地Meetup小组我在实际运维K8s集群过程中最大的体会是文档和社区是你的最佳朋友。遇到问题时先检查官方文档然后搜索GitHub Issues最后再向社区提问。大多数常见问题都有现成的解决方案。另外保持集群版本更新也很重要但切记先在测试环境验证升级过程。