跳转至

Kubernetes (K8s) 核心概念入门

一句话概述:Kubernetes 是容器编排平台,自动管理容器的部署、扩缩容、自愈和负载均衡——你告诉它"我要 5 个副本的 Web 应用",它自动帮你维持这个状态,容器挂了自动重启。

核心知识点

概念白话解释
PodK8s 最小单位,一个 Pod 里跑一个或多个容器
Deployment管理 Pod 的副本数和更新策略
Service给 Pod 一个稳定的访问入口(Pod IP 会变,Service 不变)
Namespace逻辑隔离,比如 dev/staging/production
ConfigMap存配置信息(非敏感)
Secret存敏感信息(密码、Token)
IngressHTTP 路由入口,根据域名/路径转发到不同 Service
Node集群中的一台服务器(物理机或虚拟机)
声明式模型你声明"我要什么状态",K8s 自动维持

安装配置

本地学习环境

# 方式一: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  # 启动本地集群
minikube dashboard  # 打开 Web 管理界面

# 方式二:Docker Desktop(自带 K8s)
# Docker Desktop → Settings → Kubernetes → Enable

# 方式三:kind(Kubernetes in Docker)
# 用 Docker 容器模拟 K8s 节点,轻量快速
go install sigs.k8s.io/kind@latest
kind create cluster

安装 kubectl

# kubectl 是 K8s 的命令行工具
# macOS
brew install kubectl

# Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/

# 验证
kubectl version --client  # 查看版本
kubectl cluster-info  # 查看集群信息

基本使用

创建 Deployment

# deployment.yaml - 部署定义
apiVersion: apps/v1  # API 版本
kind: Deployment  # 资源类型:部署
metadata:
  name: my-web-app  # 部署名称
  labels:
    app: web  # 标签,用于选择器
spec:
  replicas: 3  # 运行 3 个 Pod 副本
  selector:
    matchLabels:
      app: web  # 选择带 app=web 标签的 Pod
  template:  # Pod 模板
    metadata:
      labels:
        app: web  # Pod 的标签
    spec:
      containers:
        - name: web  # 容器名
          image: nginx:latest  # 容器镜像
          ports:
            - containerPort: 80  # 容器端口
          resources:  # 资源限制
            requests:
              memory: "64Mi"  # 最少需要 64MB 内存
              cpu: "250m"  # 最少需要 0.25 核 CPU
            limits:
              memory: "128Mi"  # 最多用 128MB
              cpu: "500m"  # 最多用 0.5 核
          env:  # 环境变量
            - name: APP_ENV
              value: "production"
# 应用配置
kubectl apply -f deployment.yaml  # 创建/更新部署

# 查看状态
kubectl get deployments  # 列出所有部署
kubectl get pods  # 列出所有 Pod
kubectl describe pod <pod-name>  # 查看 Pod 详情
kubectl logs <pod-name>  # 查看 Pod 日志

创建 Service

# service.yaml - 服务定义
apiVersion: v1
kind: Service
metadata:
  name: my-web-service  # Service 名
spec:
  type: ClusterIP  # 类型:集群内访问
  # type: NodePort    # 暴露到节点端口
  # type: LoadBalancer # 创建外部负载均衡器
  selector:
    app: web  # 选择 app=web 的 Pod
  ports:
    - protocol: TCP
      port: 80  # Service 端口
      targetPort: 80  # Pod 端口
kubectl apply -f service.yaml  # 创建 Service
kubectl get services  # 列出所有 Service

ConfigMap 和 Secret

# configmap.yaml - 配置信息
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_HOST: "db.example.com"  # 数据库地址
  LOG_LEVEL: "info"  # 日志级别
---
# secret.yaml - 敏感信息
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  DB_PASSWORD: cGFzc3dvcmQxMjM=  # base64 编码的密码
  API_KEY: bXlhcGlrZXk=  # echo -n "myapikey" | base64
# 在 Deployment 中使用
containers:
  - name: web
    image: my-app:latest
    envFrom:
      - configMapRef:
          name: app-config  # 注入 ConfigMap 所有键值
      - secretRef:
          name: app-secrets  # 注入 Secret 所有键值

高级用法

Ingress 路由

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: api.example.com  # 域名
      http:
        paths:
          - path: /  # 路径
            pathType: Prefix
            backend:
              service:
                name: my-web-service  # 转发到这个 Service
                port:
                  number: 80

滚动更新

# 更新镜像版本(自动滚动更新,零停机)
kubectl set image deployment/my-web-app web=nginx:1.25  # 更新镜像

# 查看更新状态
kubectl rollout status deployment/my-web-app  # 等待更新完成

# 回滚
kubectl rollout undo deployment/my-web-app  # 回到上一个版本
kubectl rollout history deployment/my-web-app  # 查看历史版本

自动扩缩容

# 手动扩缩容
kubectl scale deployment my-web-app --replicas=5  # 扩到 5 个

# 自动扩缩容(HPA)
kubectl autoscale deployment my-web-app \
  --min=2 --max=10 --cpu-percent=70  # CPU 超 70% 自动加 Pod

常见报错

报错信息原因解决方案
ImagePullBackOff拉取镜像失败检查镜像名和标签,确认镜像仓库可访问
CrashLoopBackOff容器不停崩溃重启kubectl logs 查看崩溃原因
PendingPod 无法调度检查节点资源是否充足
OOMKilled内存不够被杀了增加 resources.limits.memory
Service has no endpointsService 没匹配到 Pod检查 selector 标签是否一致
connection refused端口不对检查 containerPorttargetPort

速查表

# 基础命令
kubectl get pods                    # 列出 Pod
kubectl get deployments             # 列出部署
kubectl get services                # 列出服务
kubectl get all                     # 列出所有资源
kubectl get all -n <namespace>      # 指定命名空间

# 操作命令
kubectl apply -f <file.yaml>        # 创建/更新资源
kubectl delete -f <file.yaml>       # 删除资源
kubectl scale deployment <name> --replicas=N  # 扩缩容
kubectl set image deployment/<name> <container>=<image>  # 更新镜像

# 调试命令
kubectl describe pod <name>         # 详情
kubectl logs <pod-name>             # 日志
kubectl logs <pod-name> -f          # 实时日志
kubectl exec -it <pod-name> -- /bin/sh  # 进入容器
kubectl port-forward <pod> 8080:80  # 端口转发

# 资源类型缩写
po=Pod  deploy=Deployment  svc=Service
ns=Namespace  cm=ConfigMap  ing=Ingress
no=Node  pv=PersistentVolume  pvc=PersistentVolumeClaim

参考:Kubernetes 官方教程 | kubectl 手册 | CNCF 2026 学习资源