• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想人生从关注生活开始
博客园    首页    新随笔    联系   管理    订阅  订阅

Kubernetes(K8s)从入门到精通:一篇彻底搞懂云原生核心

适用人群:开发、运维、SRE、DevOps 工程师
目标:掌握 K8s 核心概念、架构原理、实战操作与生产最佳实践
前置知识:Docker 基础、Linux 命令、网络基础

一、为什么需要 Kubernetes?

🚫 单机 Docker 的局限

  • 单点故障:容器崩溃后无法自愈
  • 手动扩缩容:流量激增时需人工干预
  • 服务发现困难:容器 IP 动态变化,难以互相调用
  • 资源调度低效:无法跨多台机器智能分配负载

✅ K8s 的解决方案

image

💡 核心思想:声明式 API + 控制器模式(Reconciliation Loop)

二、K8s 核心架构(5 分钟理解)

1. 控制平面(Control Plane)—— 大脑

  • API Server:唯一入口,处理所有 REST 请求
  • etcd:分布式键值存储,保存集群所有状态
  • Scheduler:决定 Pod 调度到哪个 Node
  • Controller Manager:运行各种控制器(如 ReplicaSet、Node Controller)
  • Cloud Controller Manager(可选):对接云厂商 API

2. 工作节点(Worker Node)—— 肌肉

  • kubelet:Node 上的代理,确保容器运行
  • kube-proxy:维护网络规则,实现 Service 负载均衡
  • Container Runtime:容器运行时(Docker / containerd / CRI-O)

 

image

三、K8s 核心对象(Objects)

1. Pod —— 最小调度单元

  • 一个或多个紧密耦合的容器共享网络/存储
  • 短暂性:IP 会变,随时可能被重建
  • YAML 示例:
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
    

2. Deployment —— 管理无状态应用

  • 确保指定数量的 Pod 副本始终运行
  • 支持滚动更新、回滚、扩缩容
  • YAML 示例:
    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.25
    

3. Service —— 稳定访问入口

  • 为动态 Pod 提供固定 IP 和 DNS 名称
  • 类型:
    • ClusterIP(默认):集群内部访问
    • NodePort:通过 <NodeIP>:<Port> 访问
    • LoadBalancer:云厂商提供外网 LB
    • ExternalName:CNAME 到外部服务
  • YAML 示例:
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
    spec:
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: LoadBalancer
    

4. ConfigMap & Secret —— 配置解耦

  • ConfigMap:存储非敏感配置(如环境变量、配置文件)
  • Secret:存储敏感信息(Base64 编码,建议配合加密)
    # Secret 示例
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-secret
    type: Opaque
    data:
      username: YWRtaW4=  # echo -n "admin" | base64
      password: MWYyZDFlMmU2N2Rm
    

5. Namespace —— 资源隔离

  • 逻辑分区,避免命名冲突
  • 默认 Namespace:default, kube-system, kube-public
  • 创建命令:
    kubectl create namespace dev
    kubectl get pods -n dev  # 指定命名空间

四、环境搭建(快速上手)

方案 1:Minikube(本地学习)

# 安装 Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 启动集群
minikube start --driver=docker

# 验证
kubectl get nodes
minikube dashboard  # 打开 Web UI

方案 2:Kind(Kubernetes in Docker)

# 安装 Kind
go install sigs.k8s.io/kind@v0.20.0

# 创建集群
kind create cluster --name my-cluster

# 验证
kubectl cluster-info

方案 3:云平台(生产推荐)

  • 阿里云 ACK、腾讯云 TKE、AWS EKS、GCP GKE

五、kubectl 命令速查

image

六、实战:部署一个 Web 应用

步骤 1:创建 Deployment

# app-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: app
        image: nginx:alpine
        ports:
        - containerPort: 80

步骤 2:创建 Service

# app-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort

步骤 3:部署 & 访问

# 部署
kubectl apply -f app-deploy.yaml
kubectl apply -f app-svc.yaml

# 获取访问地址(Minikube)
minikube service web-service --url

# 或端口转发
kubectl port-forward svc/web-service 8080:80
# 访问 http://localhost:8080

七、高级功能

1. 健康检查(Liveness & Readiness)

spec:
  containers:
  - name: app
    image: my-app
    livenessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 2

2. 持久化存储(PV/PVC)

# PVC 示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

3. Ingress —— 7 层 HTTP 路由

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

4. Helm —— 包管理器

# 安装 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 部署 MySQL
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-mysql bitnami/mysql

八、生产环境最佳实践

🔒 安全

  • 启用 RBAC:最小权限原则
  • PodSecurityPolicy / Pod Security Admission:限制特权容器
  • 扫描镜像漏洞:Trivy / Clair
  • 加密 etcd:静态数据加密

🚀 性能

  • 资源请求 & 限制:
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
    
  • 亲和性 & 反亲和性:避免单点故障
  • Horizontal Pod Autoscaler (HPA):基于指标自动扩缩容

🛠️ 监控

  • Metrics Server:提供 CPU/内存指标
  • Prometheus + Grafana:监控集群 & 应用
  • EFK / Loki:日志收集与分析

🔄 CI/CD 集成

  • GitLab CI / Jenkins → 构建镜像 → 推送 Registry → kubectl apply

九、常见问题排查

❌ Pod 一直处于 Pending?

  • 节点资源不足 → kubectl describe pod
  • 节点污点(Taint)不匹配 → kubectl describe node

❌ Service 无法访问?

  • 检查 Selector 是否匹配 Pod Label
  • 检查 kube-proxy 是否正常运行
  • 测试 ClusterIP:kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup web-service

❌ 应用频繁重启?

  • 查看日志:kubectl logs <pod> --previous
  • 检查健康检查配置是否合理

十、学习路线图

image

 

📚 推荐资源:

  • 官方文档:kubernetes.io
  • 书籍:《Kubernetes in Action》
  • 实验:Killer.sh(CKA 模拟)

结语

Kubernetes 不是终点,而是云原生旅程的起点。掌握它,你将:

  • ✅ 构建高可用、可扩展的现代应用
  • ✅ 实现 DevOps 自动化流水线
  • ✅ 为微服务、Serverless、AI 平台打下基础

记住:
“Don’t learn Kubernetes to run Kubernetes. Learn Kubernetes to build resilient systems.”

附:速查 Cheat Sheet
📥 下载 PDF 版命令速查表
🐙 GitHub 示例 YAML 仓库

现在,打开终端,输入 kubectl get nodes,开启你的 K8s 之旅吧! ☸️

posted @ 2026-03-17 20:27  JackYang  阅读(0)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3