Kubernetes Services & Ingress 项目 #1

发布: (2026年1月12日 GMT+8 06:38)
5 min read
原文: Dev.to

Source: Dev.to

Aisalkyn Aidarova
Aisalkyn Aidarova

先决条件(一次)

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(仅内部)

ClusterIP 图示
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

它仍然能工作吗?
YESkube-proxy 重新路由。

想象一下 云中节点被删除 → ❌ 死亡。

生产问题 #2 — 端口被阻塞

  • 在 Minikube 中:✅ 正常
  • 在云中:❌ 安全组缺少该端口

DevOps 判定

判定学习调试生产

项目 3 — LoadBalancer(Minikube 风格)

LoadBalancer overview
LoadBalancer example

此证明的内容

  • ✅ 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 diagram

Tetrate image

这能证明什么

  • ✔ 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路由 + TLSKubernetes
Egress出站流量云 / NAT
Back to Blog

相关文章

阅读更多 »

CKA 部署与服务实验 #2

全局规则 - 不要使用 kubectl edit - 除非要求,否则不要重新创建资源 - 使用 kubectl patch / set / scale / rollout 修复问题 - 命名空间必须是...

Kubernetes 项目 #1

概览 在 Kubernetes 中运行单个容器化的 Web 应用并通过浏览器访问它: 流程:浏览器 → Service → Pod → Container 本练习演示……

CKA 实战实验

主题覆盖 - 启动 / 就绪 / 活跃探针 - ConfigMaps - Secrets - 配置错误与修复 环境 - Minikube - kubectl - 本地机器