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,别直接在生产上折腾。
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://mi-blog.cn/archives/695
共有 0 条评论