引言
Kubernetes(K8s)已经成为容器编排的事实标准。但对于初学者来说,K8s 的概念体系庞大且抽象。本文从最核心的概念出发,用 YAML 示例和 kubectl 命令带你完成从零到部署第一个应用的全过程。我们使用 minikube 搭建本地环境,让学习成本降到最低。
一、环境搭建:minikube
# 安装 minikube(macOS)
brew install minikube
# 启动集群
minikube start --cpus=4 --memory=8192
# 验证集群状态
kubectl cluster-info
kubectl get nodes
# 启用 Dashboard(可选)
minikube dashboard
# 查看 minikube 状态
minikube status
二、Pod:最小的调度单元
Pod 是 Kubernetes 中最小的部署单元,一个 Pod 可以包含一个或多个紧密耦合的容器。
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
# 创建 Pod
kubectl apply -f pod.yaml
# 查看 Pod
kubectl get pods
kubectl describe pod my-app
kubectl logs my-app
# 进入 Pod 内部
kubectl exec -it my-app -- /bin/bash
# 删除 Pod
kubectl delete pod my-app
三、Deployment:声明式应用管理
Deployment 管理 Pod 的副本数量、滚动更新和回滚。生产环境中,你几乎不会直接创建 Pod,而是通过 Deployment 管理。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
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
# Deployment 管理命令
kubectl apply -f deployment.yaml
kubectl get deployments
kubectl get pods -l app=nginx
# 滚动更新
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
kubectl rollout status deployment/nginx-deployment
# 回滚
kubectl rollout undo deployment/nginx-deployment
# 扩缩容
kubectl scale deployment/nginx-deployment --replicas=5
Deployment vs StatefulSet
- Deployment:无状态应用,Pod 可互换,适用于 Web 服务、API 服务
- StatefulSet:有状态应用,Pod 有稳定的网络标识和持久化存储,适用于数据库、消息队列
四、Service:网络与服务发现
Service 为 Pod 提供稳定的访问入口,解决了 Pod IP 动态变化的问题。
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
Service 类型对比
- ClusterIP:集群内部访问(默认),只能在集群内访问
- NodePort:在每个节点上开放一个端口,外部可通过
nodeIP:port访问 - LoadBalancer:云厂商提供的外部负载均衡器,自动分配公网 IP
- ExternalName:将服务映射到外部 DNS 名称
# 在 minikube 中访问 NodePort 服务
minikube service nginx-service
# 查看 Service 详情
kubectl get svc
kubectl describe svc nginx-service
五、Ingress:HTTP 路由
Ingress 提供 HTTP/HTTPS 路由规则,将外部请求路由到集群内的 Service。
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.local
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
# 启用 minikube 的 Ingress 插件
minikube addons enable ingress
六、ConfigMap 与 Secret
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: production
LOG_LEVEL: info
DATABASE_URL: postgres://db:5432/mydb
---
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
DB_PASSWORD: cGFzc3dvcmQxMjM= # base64 编码的密码
# 从命令行创建
kubectl create configmap app-config \
--from-literal=APP_ENV=production \
--from-file=config.json
kubectl create secret generic app-secret \
--from-literal=DB_PASSWORD=password123
# 在 Pod 中使用
kubectl set env deployment/nginx-deployment --from=configmap/app-config
七、Helm:Kubernetes 的包管理器
# 安装 Helm
brew install helm
# 添加 Chart 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# 搜索和安装 Chart
helm search repo nginx
helm install my-nginx bitnami/nginx --set service.type=NodePort
# 查看已安装的 Release
helm list
helm status my-nginx
# 升级和回滚
helm upgrade my-nginx bitnami/nginx --set replicaCount=3
helm rollback my-nginx 1
# 卸载
helm uninstall my-nginx
八、kubectl 常用命令速查
# 资源查看
kubectl get pods,svc,deploy,ingress -o wide
kubectl get all -n
# 实时监控
kubectl get pods -w # watch 模式
kubectl top pods # 查看资源使用
# 调试
kubectl logs -f # 实时日志
kubectl logs --previous # 上一个容器的日志
kubectl exec -it -- /bin/sh # 进入容器
kubectl port-forward 8080:80 # 端口转发
# 配置管理
kubectl apply -f # 创建/更新
kubectl delete -f # 删除
kubectl edit deploy # 直接编辑
kubectl get -o yaml # 输出 YAML
# 上下文切换
kubectl config get-contexts
kubectl config use-context
总结
Kubernetes 的学习曲线确实陡峭,但核心概念并不复杂:Pod 是运行单元,Deployment 管理 Pod,Service 提供网络,ConfigMap/Secret 管理配置,Ingress 做路由,Helm 打包一切。从小处开始,用 minikube 在本地动手实践,理解每个概念解决问题是什么,K8s 就不再是黑盒。
返回文章列表
标签:Kubernetes容器DevOps