返回文章列表
技术2026-01-30

Kubernetes 入门实战

从 Pod 到 Helm——用 minikube 搭建本地环境,掌握 K8s 核心概念。

引言

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

四、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 类型对比

# 在 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