Kubernetes 教程:从入门到实践
目录
- 第一部分:基础概念
- 什么是 Kubernetes?
- 为什么需要 Kubernetes?
- Kubernetes 的核心术语
- 第二部分:环境搭建
- 本地开发环境:Minikube / Kind
- 云上实验环境:Playground
- 生产级环境:云服务商提供的 K8s
- 第三部分:核心对象详解
- Pod:最小的部署单元
- Deployment:声明式管理 Pod
- Service:为 Pod 提供网络访问
- ConfigMap & Secret:配置管理
- Volume:数据持久化
- 第四部分:进阶与实战
- Namespace:资源隔离
- Helm:Kubernetes 的包管理器
- Ingress:集群入口流量管理
- Kubectl 常用命令速查
- 第五部分:学习路径与资源推荐
第一部分:基础概念
什么是 Kubernetes?
Kubernetes(常简称为 K8s,因为 K 和 s 之间有 8 个字母)是一个开源的,用于自动部署、扩展和管理容器化应用程序的系统。

你可以把它想象成“数据中心的操作系统”,它负责管理你所有的容器化应用,确保它们按预期运行,并处理扩展、故障恢复、负载均衡等复杂问题。
为什么需要 Kubernetes?
假设你手动管理几十个、上百个容器:
- 手动扩缩容:流量高峰时,你需要手动启动新容器;低谷时,手动关闭,非常繁琐且不及时。
- 故障自愈:如果一个容器挂了,你需要手动发现并重启它。
- 服务发现:新容器如何找到其他容器?如何管理它们的网络?
- 配置管理:如何统一管理所有应用的环境变量、配置文件?
Kubernetes 通过自动化解决了以上所有问题。
Kubernetes 的核心术语
理解这些术语是学习 K8s 的第一步:
| 术语 | 中文解释 | 核心作用 |
|---|---|---|
| Node | 节点 | K8s 集群中的一台物理机或虚拟机,分为 Master Node 和 Worker Node。 |
| Cluster | 集群 | 由多个 Node 组成的整体,是 K8s 的管理边界。 |
| Pod | 容器组 | K8s 中最小的部署单元,一个 Pod 可以包含一个或多个紧密相关的容器,它们共享网络和存储。 |
| Deployment | 部署 | 用于声明式地管理 Pod 和 ReplicaSet,你可以通过它来描述你期望的应用状态(3个副本),K8s 会自动帮你维持这个状态。 |
| Service | 服务 | 为一组功能相同的 Pod 提供一个统一的网络入口和负载均衡,它有一个固定的虚拟 IP (ClusterIP),即使 Pod 重建 IP 变了,Service 的 IP 也不变。 |
| Label & Selector | 标签与选择器 | Label 是附加到 K8s 资源上的键值对,用于对资源进行分类,Selector 是用来选择带有特定 Label 的资源,这是 K8s 组合和筛选的核心机制。 |
| Namespace | 命名空间 | 在一个 Cluster 内部创建虚拟的“子集群”,用于实现资源隔离(开发、测试、生产环境)。 |
| ConfigMap | 配置映射 | 用于存储非机密的配置数据(如环境变量、配置文件)。 |
| Secret | 密钥 | 用于存储敏感数据(如密码、API Token),数据会被 Base64 编码。 |
| Volume | 卷 | 为 Pod 提供持久化存储,Pod 中的容器重启或销毁后,Volume 中的数据可以保留。 |
第二部分:环境搭建
在学习 K8s 时,拥有一个实验环境至关重要。
本地开发环境
- Minikube: 最流行的本地单节点 K8s 集,非常适合初学者和日常开发。
- 安装: Minikube 安装文档
- 启动:
minikube start - 停止:
minikube stop
- Kind (Kubernetes in Docker): 使用 Docker 容器作为 K8s 节点,启动速度快,非常适合 CI/CD 测试。
- 安装: Kind 安装文档
云上实验环境
- Playground: 无需安装,直接在浏览器中体验 K8s。
- Katacoda (已被收购): Katacoda K8s Playground (需要翻墙)
- Killercoda: Killercoda K8s Playground
- Google Kubernetes Engine (GKE) Free Trial: 注册 Google Cloud 可获得免费的 GKE 集群试用。
生产级环境
- 云服务商:
- Google Kubernetes Engine (GKE)
- Amazon Elastic Kubernetes Service (EKS)
- Azure Kubernetes Service (AKS)
- 自建: 使用
kubeadm工具在自有服务器上搭建,适合有一定运维经验的企业。
必备工具: kubectl - K8s 的命令行工具,用于与集群交互。
# macOS brew install kubectl # Linux (Ubuntu/Debian) sudo apt-get update && sudo apt-get install -y kubectl # Windows (使用 Chocolatey) choco install kubernetes-cli
第三部分:核心对象详解
我们将通过一个 Nginx "Hello World" 示例来学习。
Pod
Pod 是最小的调度单元,我们很少直接创建 Pod,因为它的生命周期很短,挂了不会自动重启。
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest # 使用官方的 Nginx 镜像
ports:
- containerPort: 80 # 容器暴露的端口
应用:
kubectl apply -f pod.yaml
检查:
kubectl get pods kubectl describe pod nginx-pod
Deployment
Deployment 管理着 Pod 的副本集,Pod 挂了,Deployment 会自动创建一个新的。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3 # 希望有 3 个副本
selector:
matchLabels:
app: nginx # 选择所有 label 为 app=nginx 的 Pod
template:
metadata:
labels:
app: nginx # Pod 的模板,也会被打上这个 label
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
应用:
kubectl apply -f deployment.yaml
检查:
kubectl get deployment kubectl get pods # 你会看到 3 个 nginx-pod-xxxx 的 Pod
Service
现在我们有 3 个 Nginx Pod,但它们各自的 IP 地址可能会变,Service 为我们提供一个稳定的访问点。
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx # 选择所有 label 为 app=nginx 的 Pod,将流量转发给它们
ports:
- protocol: TCP
port: 80 # Service 对外暴露的端口
targetPort: 80 # 流量要转发到的 Pod 容器端口
type: ClusterIP # 默认类型,只在集群内部可访问
应用:
kubectl apply -f service.yaml
检查:
kubectl get service # NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE # nginx-service ClusterIP 10.108.12.222 <none> 80/TCP 10s
访问 Service:
# 在集群内部访问 kubectl run -it --rm --restart=Never --image=busybox curl-pod -- curl http://nginx-service # 应该会看到 Nginx 的欢迎页面 # 在集群外部访问(本地环境需要端口转发) kubectl port-forward service/nginx-service 8080:80 # 然后在浏览器访问 http://localhost:8080
ConfigMap & Secret
将配置与镜像解耦。
ConfigMap:
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
index.html: |
<h1>Hello from Kubernetes ConfigMap!</h1>
Secret:
# secret.yaml apiVersion: v1 kind: Secret metadata: name: nginx-secret type: Opaque data: # 注意:这里的值是 base64 编码的 # echo -n 'my-super-secret-password' | base64 password: bXktc3VwZXItc2VjcmV0LXBhc3N3b3Jk
Volume
让数据持久化。
# pv-pvc.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nginx-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/nginx-pv # 使用宿主机上的路径
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
然后将这个 PVC 挂载到 Deployment 的 Pod 中。
第四部分:进阶与实战
Namespace
# 创建命名空间 kubectl create namespace dev # 在特定命名空间下部署 kubectl apply -f deployment.yaml -n dev # 查看 kubectl get pods -n dev
Helm
手动管理 YAML 文件非常繁琐,Helm 是 K8s 的“包管理器”,它将相关的资源打包成一个 Chart。
# 安装 Helm # macOS: brew install helm # Linux: curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list && sudo apt-get update && sudo apt-get install helm # 添加一个 Chart 仓库 helm repo add bitnami https://charts.bitnami.com/bitnami # 使用 Chart 安装一个应用(WordPress) helm install my-wordpress bitnami/wordpress --namespace wordpress --create-namespace
Ingress
Service 的 type: LoadBalancer 在云上会创建一个外部负载均衡器,成本较高,Ingress 提供了更灵活的 HTTP/HTTPS 路由规则,通常配合 Ingress Controller (如 Nginx Ingress Controller) 使用。
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
- host: myapp.local # 假设这个域名指向你的 Ingress Controller
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service # 转发到我们之前创建的 Service
port:
number: 80
Kubectl 常用命令速查
| 命令 | 作用 |
|---|---|
kubectl get <resource> |
获取资源列表,如 pods, deployments, services |
kubectl describe <resource> <name> |
显示特定资源的详细信息 |
kubectl logs <pod-name> |
查看 Pod 的日志 |
kubectl exec -it <pod-name> -- <command> |
在 Pod 内执行命令,如 sh |
kubectl apply -f <file.yaml> |
应用/更新 YAML 文件中的配置 |
kubectl delete -f <file.yaml> |
删除 YAML 文件中定义的资源 |
kubectl get pods -o wide |
显示更多 Pod 的信息,如节点 IP |
kubectl top pods |
显示 Pod 的资源使用情况 |
第五部分:学习路径与资源推荐
学习路径建议
- 理论入门: 理解 K8s 的核心概念(第一部分)。
- 动手实践: 搭建本地 Minikube 环境,跟着第三部分的教程,亲手创建 Deployment, Service 等资源。
- 掌握常用命令: 熟练使用
kubectl的基本命令。 - 学习进阶概念: 学习 Namespace, ConfigMap, Secret, Volume 的实际应用。
- 拥抱工具: 学习使用 Helm 管理应用,简化部署。
- 深入网络: 学习 Ingress 的使用,理解集群内外流量如何访问。
- 探索生态: 了解 Operators, Service Mesh (如 Istio), Prometheus 监控等更高级的主题。
推荐资源
- 官方文档: Kubernetes Documentation (最权威,但可能对新手不友好)
- 互动教程:
- Kubernetes by Codecademy (英文,交互式)
- Kubernetes Tutorial for Beginners (YouTube) (由 The New Stack 出品,非常经典)
- 在线课程:
- Udemy: Kubernetes for Developers 和 Kubernetes - The Practical Guide (评价很高)
- KodeKloud: 提供大量基于浏览器的动手实验课程。
- 博客与社区:
- CNCF Blog: 云原生计算基金会的官方博客。
- Rancher Labs Blog: 提供很多高质量的 K8s 实践文章。
- Stack Overflow: 遇到具体问题,搜索 Stack Overflow。
祝你学习愉快!K8s 是一个强大的工具,虽然学习曲线较陡,但一旦掌握,你将能够高效地管理现代云原生应用。
