Kubernetes Services & Ingress 项目 #1
发布: (2026年1月12日 GMT+8 06:38)
5 min read
原文: Dev.to
Source: Dev.to
先决条件(一次)
minikube start
kubectl get nodes
预期
minikube Ready
基础应用(用于所有项目)
一个应用。相同的 Pod。仅网络配置不同。
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
spec:
replicas: 3
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: app
image: hashicorp/http-echo:0.2.3
args:
- "-listen=:8080"
- "-text=HELLO FROM POD"
ports:
- containerPort: 8080
kubectl apply -f deployment.yaml
kubectl get pods
Source:
项目 1 — ClusterIP(仅内部)


这能证明什么
- Service 提供 稳定的内部网络
- Pod IP 会变化 —— Service 永不改变
创建 ClusterIP
apiVersion: v1
kind: Service
metadata:
name: demo-clusterip
spec:
selector:
app: demo
ports:
- port: 80
targetPort: 8080
kubectl apply -f svc-clusterip.yaml
kubectl get svc
测试(正确方式)
kubectl run test --rm -it --image=busybox -- sh
wget -qO- demo-clusterip
生产问题 #1 — 没有端点
kubectl get endpoints demo-clusterip
原因
- Selector 与 Pod 标签不匹配
解决办法
kubectl get pods --show-labels
kubectl edit svc demo-clusterip
DevOps 收获
ClusterIP 是 Kubernetes 的支柱。如果它失效——一切都会失效。
Project 2 — NodePort(为什么它很危险)
证明内容
- ✅ NodePort 打开端口
- ❌ 不 提供路由、HA 或稳定 IP
创建 NodePort
apiVersion: v1
kind: Service
metadata:
name: demo-nodeport
spec:
type: NodePort
selector:
app: demo
ports:
- port: 80
targetPort: 8080
nodePort: 30080
kubectl apply -f svc-nodeport.yaml
kubectl get svc
访问
minikube ip
curl http://<minikube-ip>:30080
生产问题 #1 — 随机故障
kubectl delete pod -l app=demo
它仍然能工作吗?
YES → kube-proxy 重新路由。
想象一下 云中节点被删除 → ❌ 死亡。
生产问题 #2 — 端口被阻塞
- 在 Minikube 中:✅ 正常
- 在云中:❌ 安全组缺少该端口
DevOps 判定
| 判定 | 学习 | 调试 | 生产 |
|---|---|---|---|
| ✅ | ✅ | ✅ | ❌ |
项目 3 — LoadBalancer(Minikube 风格)

此证明的内容
- ✅ Kubernetes 请求 LoadBalancer
- ✅ Minikube 模拟 云 LB
创建 LoadBalancer
apiVersion: v1
kind: Service
metadata:
name: demo-lb
spec:
type: LoadBalancer
selector:
app: demo
ports:
- port: 80
targetPort: 8080
kubectl apply -f svc-lb.yaml
kubectl get svc
非常重要(仅限 Minikube)
minikube tunnel # keep this terminal open
现在:
kubectl get svc demo-lb
你会看到:
EXTERNAL-IP: 127.0.0.1
生产问题 #1 — EXTERNAL‑IP 待定
原因
- 没有 tunnel
解决方案
minikube tunnel
生产问题 #2 — LB 已存在但无流量
kubectl describe svc demo-lb
kubectl get endpoints demo-lb
原因
- Pods 未就绪
DevOps 判定
- ✔ 简单的外部应用
- ❌ 在真实云环境中成本高
- ❌ 每个服务一个 LB
Source: …
项目 4 — Ingress(真实生产模型)


这能证明什么
- ✔ Ingress 是 外部流量的大脑
- ✔ 一个 IP → 多个应用
步骤 1 — 在 Minikube 中启用 Ingress
minikube addons enable ingress
kubectl get pods -n ingress-nginx
等待出现
ingress-nginx-controller Running
步骤 2 — 为 Ingress 创建 ClusterIP
apiVersion: v1
kind: Service
metadata:
name: demo-ingress-svc
spec:
selector:
app: demo
ports:
- port: 80
targetPort: 8080
步骤 3 — Ingress 规则
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
spec:
rules:
- host: demo.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: demo-ingress-svc
port:
number: 80
步骤 4 — 本地 DNS
minikube ip
sudo nano /etc/hosts
在 /etc/hosts 中添加以下行:
<minikube-ip> demo.local
测试
curl http://demo.local
生产问题 #1 — Ingress 返回 404
kubectl describe ingress demo-ingress
原因
- 服务名称错误
- 端口错误
生产问题 #2 — Ingress 正常,应用异常
kubectl get endpoints demo-ingress-svc
kubectl get pods
原因
- 没有 Ready 状态的 Pod
生产问题 #3 — Ingress 控制器宕机
kubectl get pods -n ingress-nginx
kubectl logs -n ingress-nginx <controller-pod>
最终 DevOps 心智模型(Minikube 或生产环境)
Client
|
v
Ingress (routing rules)
|
v
Service (ClusterIP)
|
v
Pod
最终摘要表
| 组件 | 用途 | 提供者 |
|---|---|---|
| ClusterIP | 内部网络 | Kubernetes |
| NodePort | 端口暴露 | Kubernetes |
| LoadBalancer | 外部 IP | 云 / Minikube |
| Ingress | 路由 + TLS | Kubernetes |
| Egress | 出站流量 | 云 / NAT |
