Kubernetes 入门
约 2044 字大约 7 分钟
KubernetesK8s容器编排DevOps
2026-04-16
Kubernetes 简介
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩缩容和管理。它最初由 Google 设计,现在由 Cloud Native Computing Foundation(CNCF)维护。
解决什么问题
在微服务架构下,应用程序被拆分为多个容器,这些容器需要被部署、调度、扩缩容和管理。Kubernetes 提供了:
- 自动化部署与回滚:无需手动干预即可完成应用的更新和回滚
- 服务发现与负载均衡:自动为容器分配 IP,提供 DNS 名称进行服务发现
- 存储编排:自动挂载存储系统(本地、NFS、云存储等)
- 自动扩缩容:根据 CPU 使用率或其他指标自动调整容器数量
- 自我修复:自动重启失败的容器,替换不健康的节点
与 Docker 的关系
| 层级 | 技术 | 职责 |
|---|---|---|
| 容器运行时 | Docker、containerd、CRI-O | 运行容器 |
| 容器编排 | Kubernetes | 调度、管理多个容器 |
| 云原生生态 | Helm、Istio、Prometheus | 应用打包、服务网格、监控 |
Docker 解决了单个容器的打包和运行问题,而 Kubernetes 解决了多个容器的协调问题。
核心概念
Pod
Pod 是 Kubernetes 中的最小调度单位,一个 Pod 可以包含一个或多个共享网络和存储的容器。
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80ReplicaSet / Deployment
ReplicaSet 确保指定数量的 Pod 副本始终运行。Deployment 是更高级的资源,它管理 ReplicaSet 并支持声明式更新和回滚。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80Service
Service 为一组 Pod 提供稳定的访问入口(IP 和 DNS),实现负载均衡和服务发现。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIPService 类型:
| 类型 | 说明 |
|---|---|
| ClusterIP | 仅集群内部访问(默认) |
| NodePort | 通过节点端口暴露服务 |
| LoadBalancer | 通过云厂商负载均衡器暴露 |
| ExternalName | 映射到外部 DNS 名称 |
Ingress
Ingress 提供 HTTP/HTTPS 路由规则,将外部请求转发到集群内的 Service。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80ConfigMap / Secret
ConfigMap 用于存储非敏感的配置数据,Secret 用于存储敏感信息(如密码、密钥)。
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_HOST: "localhost"
LOG_LEVEL: "info"
---
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
stringData:
DATABASE_PASSWORD: "my-secret-password"
API_KEY: "your-api-key"在 Pod 中引用:
env:
- name: DATABASE_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: DATABASE_HOST
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DATABASE_PASSWORDVolume
Volume 提供持久化存储,支持多种类型:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi常见 Volume 类型:
| 类型 | 说明 |
|---|---|
| emptyDir | 临时存储,Pod 删除时清除 |
| hostPath | 挂载主机文件系统路径 |
| persistentVolumeClaim | 使用 PVC 挂载持久化存储 |
| configMap / secret | 挂载配置或密钥 |
| nfs | 挂载 NFS 网络存储 |
kubectl 常用命令
基础操作
# 获取资源信息
kubectl get pods # 查看所有 Pod
kubectl get services # 查看所有 Service
kubectl get deployments # 查看所有 Deployment
kubectl get all # 查看所有资源
kubectl get pods -o wide # 查看详细信息
# 查看资源详情
kubectl describe pod nginx-pod # 查看 Pod 详细信息
kubectl describe service nginx # 查看 Service 详细信息
# 查看日志
kubectl logs nginx-pod # 查看容器日志
kubectl logs -f nginx-pod # 实时查看日志
kubectl logs --tail=100 nginx-pod # 查看最后 100 行
# 执行命令
kubectl exec -it nginx-pod -- /bin/sh # 进入容器 shell
kubectl exec nginx-pod -- ls /app # 在容器中执行命令
# 删除资源
kubectl delete pod nginx-pod
kubectl delete deployment nginx
kubectl delete -f deployment.yaml # 通过文件删除部署与管理
# 应用配置
kubectl apply -f deployment.yaml # 创建或更新资源
kubectl apply -f ./ # 应用目录下所有 yaml 文件
kubectl rollout status deployment/nginx # 查看部署状态
# 扩缩容
kubectl scale deployment nginx --replicas=5 # 扩容到 5 个副本
kubectl autoscale deployment nginx --min=2 --max=10 --cpu-percent=80 # 自动扩缩容
# 回滚
kubectl rollout history deployment/nginx # 查看历史版本
kubectl rollout undo deployment/nginx # 回滚到上一个版本
kubectl rollout undo deployment/nginx --to-revision=2 # 回滚到指定版本
# 调试
kubectl port-forward pod/nginx-pod 8080:80 # 端口转发
kubectl top pods # 查看资源使用
kubectl get events # 查看事件列表集群信息
kubectl cluster-info # 查看集群信息
kubectl get nodes # 查看所有节点
kubectl version # 查看客户端和服务端版本
kubectl config current-context # 查看当前上下文
kubectl config use-context <name> # 切换上下文前端项目的 K8s 部署示例
假设有一个 Vue/React 前端项目,构建后打包为 Nginx 镜像。
Dockerfile
# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]nginx.conf
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend-service:3000;
proxy_set_header Host $host;
}
}Deployment 配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-app
labels:
app: frontend-app
spec:
replicas: 2
selector:
matchLabels:
app: frontend-app
template:
metadata:
labels:
app: frontend-app
spec:
containers:
- name: frontend
image: myregistry/frontend:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 3Service 配置
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
selector:
app: frontend-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIPIngress 配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: frontend-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
spec:
ingressClassName: nginx
rules:
- host: frontend.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80一键部署脚本
#!/bin/bash
kubectl apply -f frontend-deployment.yaml
kubectl apply -f frontend-service.yaml
kubectl apply -f frontend-ingress.yaml
echo "Waiting for deployment..."
kubectl rollout status deployment/frontend-app
echo "Deployment completed!"
kubectl get pods -l app=frontend-app本地开发
Minikube
Minikube 是在本地运行单节点 Kubernetes 集群的工具,适合学习和测试。
# 安装
brew install minikube
# 启动集群
minikube start
minikube start --driver=hyperkit # 使用 hyperkit 驱动
minikube start --memory=4096 --cpus=4 # 指定资源
# 常用命令
minikube status # 查看状态
minikube dashboard # 打开 Kubernetes Dashboard
minikube ssh # 进入虚拟机
minikube stop # 停止集群
minikube delete # 删除集群
# 访问服务
minikube service frontend-service # 在浏览器中打开服务kind (Kubernetes IN Docker)
kind 使用 Docker 容器作为 Kubernetes 节点,启动快速,适合 CI/CD。
# 安装
brew install kind
# 创建集群
kind create cluster
kind create cluster --name my-cluster
# 加载镜像
kind load docker-image myregistry/frontend:latest
# 常用命令
kind get clusters
kind delete cluster --name my-clusterk3d
k3d 使用轻量级的 k3s 发行版,在 Docker 中运行,适合快速创建多节点集群。
# 安装
brew install k3d
# 创建集群(单节点)
k3d cluster create mycluster
# 创建集群(多节点)
k3d cluster create mycluster --servers 1 --agents 3
# 常用命令
k3d cluster list
k3d cluster start mycluster
k3d cluster stop mycluster
k3d cluster delete mycluster
# 加载镜像
k3d image import myregistry/frontend:latest -c mycluster本地开发工作流
# 1. 启动本地集群
k3d cluster create dev
# 2. 加载镜像
k3d image import myapp:latest -c dev
# 3. 部署应用
kubectl apply -f k8s/
# 4. 端口转发进行调试
kubectl port-forward svc/frontend-service 8080:80
# 5. 修改代码后重新构建和加载镜像
docker build -t myapp:latest . && k3d image import myapp:latest -c dev
# 6. 重启 Pod
kubectl rollout restart deployment/frontend-app推荐学习路径
阶段一:基础入门
- 了解容器化基础(Docker)
- 理解 Kubernetes 核心概念(Pod、Deployment、Service)
- 学会使用 kubectl 基本命令
- 在本地集群(Minikube/kind/k3d)部署简单应用
阶段二:进阶学习
- 深入理解 Ingress、ConfigMap、Secret、Volume
- 学习 StatefulSet、DaemonSet 等高级资源
- 掌握服务网络和 DNS 原理
- 学习 Helm 包管理器
阶段三:生产实践
- 学习 RBAC 权限控制
- 了解 NetworkPolicy 网络策略
- 掌握资源限制和配额管理
- 学习 Prometheus + Grafana 监控
- 了解 GitOps 理念(ArgoCD、Flux)
学习资源
| 资源 | 说明 |
|---|---|
| Kubernetes 官方文档 | 官方中文文档 |
| K8s 从入门到实战 | 实战教程 |
| Kind 官方文档 | 本地集群搭建 |
| Ingress-Nginx 文档 | HTTP 路由配置 |
| Kubernetes The Hard Way | 深入理解原理 |
