Kubernetes 入门:从 Pod 到 Service 的最小可用组合

米阳 2025-5-10 5 5/10

K8s 的概念很多,但要让一个服务真正跑起来被人访问,其实只需要四个东西:Deployment、Service、Ingress、ConfigMap。其他的慢慢补。

一、Deployment:保证有 N 个副本在跑

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kb-web
spec:
  replicas: 2
  selector:
    matchLabels: { app: kb-web }
  template:
    metadata:
      labels: { app: kb-web }
    spec:
      containers:
        - name: web
          image: registry.example.com/kb-web:1.0.3
          ports:
            - containerPort: 8800
          env:
            - name: TZ
              value: Asia/Shanghai
          resources:
            requests: { cpu: 100m, memory: 128Mi }
            limits:   { cpu: 500m, memory: 512Mi }
          readinessProbe:
            httpGet: { path: /api/stats, port: 8800 }
            initialDelaySeconds: 5
            periodSeconds: 10

requests 是调度依据,limits 是上限。不设 requests,调度器不知道这个 Pod 需要多少资源,会乱塞。

readinessProbe 很重要:容器启动了不代表能服务,探针通过才会被加进 Service 的 Endpoints。没有它,滚动更新期间会有请求打到还没准备好的 Pod。

二、Service:给 Pod 一个固定入口

Pod 的 IP 会变,Service 提供稳定的 ClusterIP 和负载均衡:

apiVersion: v1
kind: Service
metadata:
  name: kb-web
spec:
  selector: { app: kb-web }
  ports:
    - port: 80
      targetPort: 8800

port 是 Service 暴露的端口,targetPort 是容器端口。集群内其他服务用 http://kb-web 就能访问。

三、Ingress:暴露到集群外

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kb-web
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  ingressClassName: nginx
  tls:
    - hosts: [kb.example.com]
      secretName: kb-tls
  rules:
    - host: kb.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kb-web
                port: { number: 80 }

Ingress 需要先装 Ingress Controller(常见的是 ingress-nginx),否则规则不生效。很多人卡在这里,以为是配置写错了。

四、ConfigMap:配置和镜像分离

apiVersion: v1
kind: ConfigMap
metadata:
  name: kb-config
数据: {}

实际写法:

kubectl create configmap kb-config --from-file=config.yaml
kubectl create secret generic kb-secret --from-literal=LLM_API_KEY=xxx

挂进 Pod:

          volumeMounts:
            - name: cfg
              mountPath: /app/config.yaml
              subPath: config.yaml
      volumes:
        - name: cfg
          configMap: { name: kb-config }

subPath 只挂单个文件,不覆盖整个目录。改 ConfigMap 后文件会更新(有延迟),但进程不会自动重载,要重启或自己监听。

常用命令

kubectl get pods -o wide
kubectl describe pod <name>          # 排查启动失败
kubectl logs -f <pod> --tail=100
kubectl exec -it <pod> -- sh
kubectl rollout restart deploy/kb-web
kubectl rollout status deploy/kb-web

describe 看事件,logs 看应用输出,这两个解决八成问题。

什么时候该用 K8s

单机 Docker 够用的时候,别上 K8s。它解决的是「多节点调度、自动扩缩、滚动更新、服务发现」这些问题,单机项目用 systemd + Docker 更简单。

上了之后,复杂度是持续的:网络插件、存储、证书、监控、日志收集,每一项都要有人维护。

如果只是想练手,用 minikube 或 k3s,别直接在生产上折腾。

- THE END -

米阳

5月10日11:25

最后修改:2025年5月10日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论