首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Kubernetes(K8s)从入门到精通:一篇彻底搞懂云原生核心

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

作者头像
jack.yang
发布2026-03-18 08:06:10
发布2026-03-18 08:06:10
4.7K0
举报

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

一、为什么需要 Kubernetes?

🚫 单机 Docker 的局限

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

✅ K8s 的解决方案

image
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
image

三、K8s 核心对象(Objects)

1. Pod —— 最小调度单元

一个或多个紧密耦合的容器共享网络/存储

短暂性:IP 会变,随时可能被重建

YAML 示例

代码语言:javascript
复制
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 示例

代码语言:javascript
复制
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 示例

代码语言:javascript
复制
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 编码,建议配合加密)

代码语言:javascript
复制
# 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

创建命令

代码语言:javascript
复制
kubectl create namespace dev
kubectl get pods -n dev  # 指定命名空间

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

方案 1:Minikube(本地学习)

代码语言:javascript
复制
# 安装 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)

代码语言:javascript
复制
# 安装 Kind
go install sigs.k8s.io/kind@v0.20.0

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

# 验证
kubectl cluster-info

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

  • 阿里云 ACK腾讯云 TKEAWS EKSGCP GKE

五、kubectl 命令速查

image
image

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

步骤 1:创建 Deployment

代码语言:javascript
复制
# 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

代码语言:javascript
复制
# 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:部署 & 访问

代码语言:javascript
复制
# 部署
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)

代码语言:javascript
复制
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)

代码语言:javascript
复制
# PVC 示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

3. Ingress —— 7 层 HTTP 路由

代码语言:javascript
复制
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 —— 包管理器

代码语言:javascript
复制
# 安装 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:静态数据加密

🚀 性能

资源请求 & 限制

代码语言:javascript
复制
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
image

📚 推荐资源

结语

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 之旅吧! ☸️

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、为什么需要 Kubernetes?
    • 🚫 单机 Docker 的局限
    • ✅ K8s 的解决方案
  • 二、K8s 核心架构(5 分钟理解)
    • 1. 控制平面(Control Plane)—— 大脑
    • 2. 工作节点(Worker Node)—— 肌肉
  • 三、K8s 核心对象(Objects)
    • 1. Pod —— 最小调度单元
    • 2. Deployment —— 管理无状态应用
    • 3. Service —— 稳定访问入口
    • 4. ConfigMap & Secret —— 配置解耦
    • 5. Namespace —— 资源隔离
  • 四、环境搭建(快速上手)
    • 方案 1:Minikube(本地学习)
    • 方案 2:Kind(Kubernetes in Docker)
    • 方案 3:云平台(生产推荐)
  • 五、kubectl 命令速查
  • 六、实战:部署一个 Web 应用
    • 步骤 1:创建 Deployment
    • 步骤 2:创建 Service
    • 步骤 3:部署 & 访问
  • 七、高级功能
    • 1. 健康检查(Liveness & Readiness)
    • 2. 持久化存储(PV/PVC)
    • 3. Ingress —— 7 层 HTTP 路由
    • 4. Helm —— 包管理器
  • 八、生产环境最佳实践
    • 🔒 安全
    • 🚀 性能
    • 🛠️ 监控
    • 🔄 CI/CD 集成
  • 九、常见问题排查
    • ❌ Pod 一直处于 Pending?
    • ❌ Service 无法访问?
    • ❌ 应用频繁重启?
  • 十、学习路线图
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档