一、Kubernetes 是什么?
Kubernetes(简称 K8s) 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它诞生于谷歌,借鉴了其内部十多年的大规模容器管理经验,旨在解决容器化应用在部署、弹性伸缩、服务发现、故障恢复等方面的复杂性问题。
核心优势:
- 自动化部署与扩缩容:一键部署应用,根据负载自动调整副本数量。
- 高可用性:自动修复故障容器,确保应用始终运行。
- 资源高效利用:通过调度算法优化资源分配,降低硬件成本。
- 多云/混合云支持:统一管理不同基础设施上的容器集群。
二、核心概念快速入门
在学习使用 K8s 前,需理解以下核心术语:
1. 容器与 Pod
- 容器(Container):封装应用及其依赖的轻量级运行单元(如 Docker 容器)。
- Pod:K8s 中最小的部署单元,一个 Pod 可包含一个或多个紧密关联的容器(通常是一个主容器 + 辅助容器),共享网络和存储资源。
2. 控制器(Controller)
- Deployment:最常用的控制器,用于管理 Pod 的副本数量、更新策略(如滚动更新)。
- StatefulSet:用于有状态应用(如数据库),保证 Pod 的顺序启动和唯一标识。
- DaemonSet:确保每个节点运行一个指定 Pod(如日志收集、监控代理)。
3. 服务与网络
- Service:为一组 Pod 提供稳定的网络接口,支持负载均衡(如 ClusterIP、NodePort、LoadBalancer)。
- Ingress:管理集群外部到内部服务的 HTTP/HTTPS 路由,类似反向代理。
4. 存储
- Volume:为 Pod 提供持久化存储(支持本地存储、NFS、云存储等)。
- PersistentVolume(PV):集群级别的存储资源,独立于 Pod 存在。
- PersistentVolumeClaim(PVC):Pod 对 PV 的申请和绑定。
5. 集群组件
- Master 节点:控制平面,包含 API Server(集群统一入口)、Scheduler(调度 Pod 到 Node)、Controller Manager(管理控制器)、etcd(分布式键值存储,保存集群状态)。
- Worker 节点:运行 Pod 的计算节点,包含 kubelet(节点代理,与 Master 通信)、Container Runtime(如 Docker、CRI-O)、kube-proxy(实现 Service 网络代理)。
三、快速搭建 K8s 环境
1. 本地开发环境(适合入门)
使用 Minikube 在单节点上运行 K8s 集群:
# 安装 Minikube(以 macOS 为例)
brew install minikube
# 启动集群(默认使用 Docker 作为容器运行时)
minikube start
# 安装 kubectl 命令行工具(K8s 客户端)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
2. 生产环境部署
使用 kubeadm 工具快速搭建高可用集群(简化版步骤):
# 初始化 Master 节点
kubeadm init --apiserver-advertise-address=<Master节点IP>
# 配置 kubectl(非 root 用户)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 添加 Worker 节点(在 Worker 节点执行)
kubeadm join <Master节点IP>:6443 --token <令牌> --discovery-token-ca-cert-hash sha256:<哈希值>
四、实战:部署第一个应用
以部署一个 Nginx 服务为例,演示 K8s 核心操作流程。
1. 创建 Deployment(管理 Pod 副本)
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3 # 运行 3 个 Nginx Pod
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.23 # 使用 Nginx 镜像
ports:
- containerPort: 80 # 容器监听 80 端口
应用部署:
kubectl apply -f nginx-deployment.yaml
2. 查看部署状态
# 查看 Deployment
kubectl get deployments
# 查看 Pod(等待状态变为 Running)
kubectl get pods -o wide # -o wide 显示节点信息
3. 创建 Service 暴露服务
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort # 通过节点端口暴露服务(本地环境可用)
selector:
app: nginx
ports:
- protocol: TCP
port: 80 # 服务端口
targetPort: 80 # Pod 端口
nodePort: 30080 # 可选,未指定时自动分配(30000-32767)
应用服务:
kubectl apply -f nginx-service.yaml
访问服务:
# 本地环境(Minikube)使用以下命令打开浏览器
minikube service nginx-service
4. 弹性扩缩容
# 扩展到 5 个副本
kubectl scale deployment nginx-deployment --replicas=5
# 查看实时扩缩容状态(需安装 kubectl-dashboard 或使用 watch)
kubectl get pods --watch
5. 滚动更新与回滚
# 更新 Nginx 镜像版本
kubectl set image deployment nginx-deployment nginx=nginx:1.24
# 查看更新状态
kubectl rollout status deployment nginx-deployment
# 回滚到上一版本
kubectl rollout undo deployment nginx-deployment
五、进阶功能:存储与网络
1. 持久化存储(以本地路径为例)
# pv-pvc.yaml
# 定义 PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce # 单节点读写
hostPath:
path: "/data/k8s" # 节点本地路径
# 定义 PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
将 PVC 挂载到 Pod:
# 在 Deployment 的 Pod 模板中添加 volumes 和 volumeMounts
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: local-pvc
containers:
- name: nginx
...
volumeMounts:
- name: data-volume
mountPath: "/usr/share/nginx/html" # 容器内挂载路径
2. 网络策略(限制 Pod 通信)
使用 NetworkPolicy 控制 Pod 间的网络流量:
# network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 3306 # 允许前端 Pod 访问后端数据库端口
六、K8s 最佳实践
1. 资源配置优化
- 资源限制:为容器设置
requests
(最小资源)和limits
(最大资源),避免资源竞争:resources: requests: cpu: "0.5" # 0.5 核 CPU memory: "512Mi" limits: cpu: "1" memory: "1Gi"
- 亲和性与反亲和性:通过
nodeAffinity
控制 Pod 调度到特定节点,或通过podAntiAffinity
避免同类型 Pod 部署在同一节点。
2. 监控与日志
- 核心工具:
- Prometheus + Grafana:监控集群指标(节点资源、Pod 状态、API 调用)。
- EFK 栈(Elasticsearch + Fluentd + Kibana):集中管理容器日志。
- 命令行查看日志:
kubectl logs <pod-name> # 查看单个 Pod 日志 kubectl logs -f <pod-name> # 实时跟踪日志
3. 安全性
- 服务账户(ServiceAccount):为 Pod 分配最小权限,避免使用默认
default
账户。 - HTTPS 加密:通过 Ingress + Let’s Encrypt 实现服务端加密,保护数据传输。
- 网络策略:限制非必要端口暴露,隔离敏感组件(如数据库服务)。
七、总结:K8s 的适用场景
- 微服务架构:统一管理数十到数千个微服务容器。
- CI/CD 集成:与 Jenkins、ArgoCD 等工具结合,实现自动化部署流水线。
- 弹性负载场景:电商促销、实时数据处理等需要动态扩缩容的业务。
- 多云部署:通过 K8s 实现跨云厂商的统一管理,避免厂商锁定。
八、学习资源推荐
- 官方文档:Kubernetes Documentation(权威但需一定基础)。
- 交互式教程:Kubernetes Playground(浏览器内实战环境)。
- 书籍:《Kubernetes 权威指南》《Kubernetes in Action》。
- 社区:K8s 官方 Slack、Stack Overflow(标签
kubernetes
)。
通过以上步骤,你已掌握 K8s 的核心概念和基础操作。记住,K8s 的强大在于其生态的丰富性(如 Helm 包管理、Knative Serverless 框架),建议从实际项目需求出发,逐步深入学习调度策略、自定义资源(CRD)、服务网格(如 Istio)等进阶主题。开始你的 K8s 之旅吧! 🚀