写在前面
这是 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 与容器管理,包括生命周期、健康检查和资源限制。