三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Kubernetes核心概念与生产环境实践指南

Kubernetes核心概念与生产环境实践指南

1. Kubernetes核心概念解析

Kubernetes(简称K8s)作为容器编排领域的事实标准,本质上是一个分布式系统运行时环境。它通过声明式API和控制器模式,将基础设施抽象成可编程的资源对象。我在生产环境部署K8s集群时发现,其架构设计遵循了"期望状态(Desired State)"的核心哲学——用户声明应用应该达到的状态,由控制平面持续协调实际状态向期望状态收敛。

控制平面的关键组件包括:

  • kube-apiserver:唯一与etcd交互的组件,提供RESTful接口
  • kube-controller-manager:运行各种控制器(Deployment、Node等)
  • kube-scheduler:负责Pod调度决策
  • cloud-controller-manager:对接云厂商API

数据平面则由kubelet(节点代理)和容器运行时(如containerd)构成,配合kube-proxy实现服务发现和负载均衡。这种架构使得K8s具有极强的扩展性,通过CRD(Custom Resource Definition)可以自定义资源类型。

2. 核心功能深度剖析

2.1 工作负载管理

Deployment是最常用的工作负载API,它通过ReplicaSet实现滚动更新和回滚。在实际操作中,我建议始终定义readinessProbe和livenessProbe,这是保障服务稳定性的关键。例如:

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: 80 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 5

StatefulSet适用于有状态应用,它会按序创建Pod并维护稳定的网络标识。我在部署数据库时发现,必须配合PersistentVolume使用才能保证数据持久化。

2.2 服务发现与网络

Service是K8s的核心抽象,ClusterIP类型的Service会分配虚拟IP,通过kube-proxy的iptables/ipvs规则实现负载均衡。生产环境中建议使用Headless Service(clusterIP: None)配合StatefulSet,这样可以通过Pod名称直接访问特定实例。

Ingress需要配合控制器(如nginx-ingress)使用,它通过Host和Path规则实现七层路由。配置HTTPS时要注意Secret的命名空间必须与Ingress一致:

kubectl create secret tls my-tls --cert=path/to/cert --key=path/to/key -n my-ns

2.3 配置与存储管理

ConfigMap和Secret都是将配置数据注入容器的方案。常见误区是直接在Pod中挂载整个ConfigMap,这会导致目录被覆盖。正确做法是使用subPath挂载单个文件:

volumes: - name: config configMap: name: my-config containers: - volumeMounts: - name: config mountPath: /etc/nginx/nginx.conf subPath: nginx.conf

PersistentVolume的动态供给需要StorageClass支持。在本地测试环境可以使用hostPath,但生产环境必须使用网络存储(如Ceph RBD、AWS EBS等)。

3. 集群部署实战指南

3.1 工具选型对比

  • kubeadm:官方工具,适合快速搭建标准集群
  • kubespray:基于Ansible,支持多节点部署
  • k3s:轻量级K8s,适合边缘计算场景

对于初学者,我推荐使用kubeadm。以下是在Ubuntu 20.04上的安装步骤:

# 安装依赖 sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list # 安装组件 sudo apt update && sudo apt install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl # 初始化控制平面 sudo kubeadm init --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 # 安装网络插件(Flannel) kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

3.2 节点管理

工作节点加入集群需要执行kubeadm join命令。要获取最新token可使用:

kubeadm token create --print-join-command

节点维护时应该先驱逐Pod再停机:

kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

4. 监控与运维实践

4.1 Prometheus外部监控方案

当Prometheus部署在集群外部时,需要配置以下组件:

  1. kube-state-metrics:暴露集群状态指标
  2. node-exporter:收集节点级指标
  3. 配置ServiceMonitor自定义指标采集

关键配置示例:

# prometheus.yml 片段 scrape_configs: - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https

4.2 常见故障排查

  • Pod卡在Pending状态:通常是资源不足或调度约束导致,检查kubectl describe pod输出
  • CrashLoopBackOff:查看容器日志kubectl logs -p
  • 服务不可访问:验证Endpoint是否正常kubectl get endpoints

CPU占用率高的排查流程:

  1. kubectl top pods -n 定位问题Pod
  2. kubectl exec -it -- /bin/sh 进入容器
  3. 使用top/htop查看进程状态
  4. 使用perf或pprof进行性能分析

5. 进阶实践技巧

5.1 若依微服务部署

Ruoyi-Cloud的K8s部署需要处理多个组件:

  1. 构建Docker镜像时注意修改bootstrap.yml中的注册中心地址
  2. 为每个服务创建独立的Deployment和Service
  3. 网关需要配置Ingress或NodePort

数据库部署建议使用StatefulSet配合PersistentVolumeClaim,配置示例:

apiVersion: apps/v1 kind: StatefulSet metadata: name: postgresql spec: serviceName: "postgresql" replicas: 1 selector: matchLabels: app: postgresql template: metadata: labels: app: postgresql spec: containers: - name: postgresql image: postgres:13 env: - name: POSTGRES_PASSWORD value: "yourpassword" ports: - containerPort: 5432 volumeMounts: - name: data mountPath: /var/lib/postgresql/data volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi

5.2 安全加固措施

  • 启用PodSecurityPolicy或更新版的PodSecurity Admission
  • 为ServiceAccount配置最小权限原则
  • 容器运行使用非root用户
  • 定期轮换证书(kubeadm certs renew)

RBAC配置示例:

apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: default name: read-pods subjects: - kind: User name: developer apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io

6. 学习路径建议

对于K8s学习者,我建议按照以下顺序深入:

  1. 掌握核心概念:Pod/Deployment/Service/Volume
  2. 练习基础操作:kubectl create/get/describe/exec/logs
  3. 理解控制器模式:ReplicaSet/StatefulSet/DaemonSet
  4. 学习网络原理:CNI/Service/Ingress/DNS
  5. 实践存储方案:PV/PVC/StorageClass
  6. 深入安全机制:RBAC/NetworkPolicy
  7. 研究扩展机制:CRD/Operator

推荐的学习资源:

  • 官方文档:kubernetes.io/docs
  • 交互式教程:katacoda.com/courses/kubernetes
  • 故障模拟:k8s-troubleshooting.com
  • 认证备考:github.com/walidshaari/Kubernetes-Certified-Administrator
← 返回列表