K8s 学习笔记(一):入门与集群搭建

写在前面

这是 Kubernetes 学习笔记系列的第一篇,介绍 K8s 的核心概念和架构,并带你搭建本地学习环境。读完本文你将理解 K8s 是什么、为什么需要它,并能独立部署一个应用到集群中。

本系列适合有后端开发经验、刚开始学 K8s 的开发者。


一、什么是 Kubernetes

1.1 容器编排的痛点

用 Docker 跑一两个容器很简单,但生产环境会面临:

1
2
3
4
5
6
- 容器挂了怎么自动重启?
- 怎么滚动更新不停服?
- 怎么自动扩容应对流量高峰?
- 多个容器怎么互相发现和通信?
- 怎么管理配置和密钥?
- 怎么保证资源分配和隔离?

Kubernetes(简称 K8s)就是解决这些问题的容器编排平台。

1.2 核心概念

1
2
3
4
5
6
Cluster  — 集群,一组节点的集合
Node     — 节点,集群中的一台机器(物理机或虚拟机)
Pod      — K8s 最小调度单元,包含一个或多个容器
Service  — 为一组 Pod 提供稳定的访问入口
Deployment — 管理 Pod 的副本数、更新策略
Namespace — 资源隔离的逻辑分区

1.3 架构概览

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Master 节点(控制面):
├── kube-apiserver     — API 入口,所有操作都经过它
├── etcd               — 存储集群状态数据
├── kube-scheduler     — 负责把 Pod 调度到合适的节点
├── kube-controller-manager — 控制器(Deployment、ReplicaSet 等)
└── cloud-controller-manager — 云厂商相关控制器

Worker 节点(数据面):
├── kubelet            — 管理节点上的 Pod 生命周期
├── kube-proxy         — 负责网络规则和 Service 转发
└── Container Runtime  — 容器运行时(containerd、Docker)

开发者主要和 kube-apiserver 交互(通过 kubectl),不需要直接操作其他组件。


二、搭建本地环境

学习 K8s 不需要真实集群,本地工具足够。

2.1 方案对比

1
2
3
4
minikube  — 最成熟,功能全,推荐初学者
kind      — 用 Docker 容器模拟节点,启动快
k3s       — 轻量级 K8s,适合边缘计算和本地
Docker Desktop — 自带 K8s,Windows/Mac 一键开启

2.2 安装 minikube

1
2
3
4
5
6
7
8
9
# Windows(用 winget)
winget install Kubernetes.minikube

# macOS
brew install minikube

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

2.3 启动集群

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 启动(默认用 Docker 驱动)
minikube start

# 指定 K8s 版本
minikube start --kubernetes-version=v1.30.0

# 查看集群状态
minikube status

# 查看集群信息
kubectl cluster-info

# 验证节点
kubectl get nodes
# NAME       STATUS   ROLES           AGE   VERSION
# minikube   Ready    control-plane   60s   v1.30.0

2.4 常用 minikube 命令

1
2
3
4
5
6
7
minikube start          # 启动集群
minikube stop           # 停止集群(不删除)
minikube delete         # 删除集群
minikube dashboard      # 打开 Web 控制台
minikube ssh            # SSH 进入节点
minikube addons list    # 查看可用插件
minikube addons enable metrics-server  # 启用指标服务

2.5 安装 kubectl

1
2
3
4
5
6
7
8
# Windows
winget install Kubernetes.kubectl

# macOS
brew install kubectl

# 验证
kubectl version --client

minikube 启动后会自动配置 kubectl,可以直接使用。


三、第一个应用部署

3.1 部署一个 Nginx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 创建 Deployment
kubectl create deployment nginx --image=nginx:latest

# 查看 Deployment
kubectl get deployments
# NAME    READY   UP-TO-DATE   AVAILABLE   AGE
# nginx   1/1     1            1           30s

# 查看 Pod
kubectl get pods
# NAME                     READY   STATUS    RESTARTS   AGE
# nginx-7854ff8879-abcde   1/1     Running   0          30s

# 查看 Pod 详情
kubectl describe pod <pod-name>

3.2 暴露服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 创建 Service(NodePort 类型,允许外部访问)
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

# 查看 Service
kubectl get services
# NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
# kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        5m
# nginx        NodePort    10.100.200.50   <none>        80:31234/TCP   10s

# minikube 直接打开浏览器访问
minikube service nginx

3.3 扩容

1
2
3
4
5
6
7
8
9
# 扩展到 3 个副本
kubectl scale deployment nginx --replicas=3

# 查看 Pod(变成 3 个)
kubectl get pods
# NAME                     READY   STATUS    RESTARTS   AGE
# nginx-7854ff8879-abcde   1/1     Running   0          3m
# nginx-7854ff8879-fghij   1/1     Running   0          10s
# nginx-7854ff8879-klmno   1/1     Running   0          10s

3.4 清理

1
2
3
# 删除 Service 和 Deployment
kubectl delete service nginx
kubectl delete deployment nginx

四、用 YAML 部署

命令行操作适合临时测试,正式环境都用 YAML 文件。

4.1 Deployment YAML

创建 nginx-deployment.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "200m"

4.2 Service YAML

创建 nginx-service.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx          # 匹配 Pod 的标签
  ports:
  - port: 80            # Service 端口
    targetPort: 80       # Pod 端口
  type: ClusterIP       # 集群内部访问

4.3 应用 YAML

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 创建/更新资源
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml

# 也可以把多个资源写在一个文件里(用 --- 分隔),一次应用
kubectl apply -f nginx-all.yaml

# 删除
kubectl delete -f nginx-deployment.yaml
kubectl delete -f nginx-service.yaml

4.4 YAML 结构说明

1
2
3
4
5
6
7
8
apiVersion: <API 版本>        # 如 apps/v1, v1, batch/v1
kind: <资源类型>              # 如 Deployment, Service, Pod
metadata:                     # 元数据
  name: <资源名称>
  namespace: <命名空间>       # 可选,默认 default
  labels: {}                  # 标签
spec:                         # 规格(每种资源不同)
  ...

五、K8s 资源类型速览

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
工作负载:
  Pod          — 最小调度单元
  Deployment   — 无状态应用(Web 服务、API)
  StatefulSet  — 有状态应用(数据库、消息队列)
  DaemonSet    — 每个节点跑一个 Pod(日志、监控)
  Job          — 一次性任务
  CronJob      — 定时任务

服务发现:
  Service      — Pod 的稳定访问入口
  Ingress      — HTTP 路由和域名接入

配置存储:
  ConfigMap    — 配置文件
  Secret       — 敏感信息
  PV/PVC       — 持久化存储

安全:
  Namespace    — 资源隔离
  RBAC         — 权限控制
  NetworkPolicy — 网络隔离

六、开发者视角:应用如何适配 K8s

作为开发者,把应用部署到 K8s 需要关注:

6.1 应用要做的

1
2
3
4
5
- 提供健康检查接口(/health、/ready)
- 通过环境变量读取配置(不要硬编码)
- 日志输出到 stdout/stderr(K8s 自动收集)
- 优雅关闭(处理 SIGTERM 信号)
- 无状态化(Session 等状态存 Redis)

6.2 配置外部化示例(Go)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 从环境变量读取配置
func main() {
    port := os.Getenv("APP_PORT")
    if port == "" {
        port = "8080"
    }
    dbHost := os.Getenv("DB_HOST")    // 从 ConfigMap/Secret 注入
    dbPort := os.Getenv("DB_PORT")
    
    // 启动 HTTP 服务
    http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
    })
    log.Fatal(http.ListenAndServe(":"+port, nil))
}

6.3 对应的 K8s 配置思路

1
2
3
4
5
应用配置    → ConfigMap
数据库密码  → Secret
健康检查    → Deployment 的 livenessProbe / readinessProbe
资源限制    → Deployment 的 resources.requests / limits
对外暴露    → Service + Ingress

七、小结

本文完成了以下内容:

  • K8s 的核心概念和架构
  • 本地环境搭建(minikube + kubectl)
  • 第一个应用的部署和访问
  • YAML 文件编写和部署
  • K8s 资源类型速览
  • 开发者如何适配 K8s

下一篇将深入 Pod 与容器管理,包括生命周期、健康检查和资源限制。