Service与Ingress:如何将你的应用暴露给世界
引言:从“内部通讯”到“对外开放”
想象Kubernetes集群是一座繁忙的办公楼,每个Pod(容器)是楼内的员工。
-  
Service 就像前台的接待员,负责将外部电话(请求)转接到正确的员工(Pod)。
 -  
Ingress 则是整栋楼的门卫,管理所有入口通道,支持复杂的访客规则(如VIP通道、安全检查)。
 
本文将教你如何通过 Service 和 Ingress 让外部用户安全访问你的应用!
一、Service:内部服务的交通枢纽
1.1 为什么需要Service?
-  
Pod是动态的:Pod可能随时被销毁或重建,IP地址不固定。
 -  
负载均衡需求:多个Pod副本需要共享流量。
 
Service的作用:为Pod提供稳定的虚拟IP(VIP)和DNS名称,实现服务发现与负载均衡。
1.2 Service的三种类型
1. ClusterIP(默认)
-  
用途:仅供集群内部访问(如微服务间通信)。
 -  
示例配置:
apiVersion: v1 kind: Service metadata: name: internal-service spec: selector: app: my-app ports: - protocol: TCP port: 80 # Service端口 targetPort: 8080 # Pod端口 type: ClusterIP 
2. NodePort
-  
用途:通过节点IP(master节点的对外ip)+固定端口暴露服务,适合开发测试。
 -  
端口范围:30000-32767。
 -  
示例访问:
http://<节点IP>:30080spec: type: NodePort ports: - port: 80 targetPort: 8080 nodePort: 30080 # 手动指定端口(可选) 
3. LoadBalancer
-  
用途:在云平台上自动创建外部负载均衡器(如AWS ELB)。
 -  
示例:
spec: type: LoadBalancer
 
1.3 动手实验:暴露一个NodePort服务
步骤1:创建Deployment(若尚未存在)
kubectl create deployment web-app --image=nginx:1.25 --replicas=3
 
步骤2:创建NodePort Service
# web-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort
 
kubectl apply -f web-service.yaml
 
步骤3:访问服务
kubectl get svc web-service
 
输出示例:
NAME          TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
web-service   NodePort   10.99.62.165   <none>        80:31362/TCP   55s
 
通过浏览器访问:http://<你的节点IP>:31555(如 http://localhost:31555)。

二、Ingress:高级流量路由管家
2.1 为什么需要Ingress?
-  
Service的限制:
-  
每个Service需独立端口,难以管理。
 -  
不支持基于域名或路径的路由。
 
 -  
 -  
Ingress的功能:
-  
通过域名和路径将流量分发到不同Service。
 -  
支持HTTPS、SSL终止、身份验证等。
 
 -  
 
2.2 安装Ingress控制器
Ingress需要配合控制器(如Nginx、Traefik)使用,以Nginx为例:
# 使用Helm安装(需提前安装Helm)
helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace
# 验证安装
kubectl get pods -n ingress-nginx
 
2.3 配置Ingress规则
场景:通过不同域名访问两个应用
-  
blog.example.com→ 博客服务(Service: blog-service) -  
shop.example.com→ 商城服务(Service: shop-service) 
# example-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: blog.example.com # 域名1
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: blog-service
            port:
              number: 80
  - host: shop.example.com # 域名2
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: shop-service
            port:
              number: 80
 
应用配置
kubectl apply -f example-ingress.yaml
 
2.4 配置HTTPS(可选)
步骤1:准备证书(以自签名证书为例)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key -out tls.crt -subj "/CN=example.com"
 
步骤2:创建Secret
kubectl create secret tls example-tls --cert=tls.crt --key=tls.key
 
步骤3:更新Ingress配置
spec:
  tls:
  - hosts:
      - blog.example.com
      - shop.example.com
    secretName: example-tls
 
三、常见问题与解决
-  
Service无法访问
-  
检查Service的
selector是否与Pod标签匹配。 -  
确认防火墙开放了NodePort或LoadBalancer端口。
 
 -  
 -  
Ingress返回404错误
-  
检查Ingress控制器的Pod是否正常运行。
 -  
查看Ingress日志:
kubectl logs -n ingress-nginx <ingress-controller-pod> 
 -  
 -  
HTTPS证书不生效
-  
确认Secret的名称与Ingress中
secretName一致。 -  
检查证书域名是否与Ingress规则中的
host匹配。 
 -  
 
四、总结与下一步
通过本文,你学会了:
-  
Service:为Pod提供稳定的内部/外部访问入口。
 -  
Ingress:通过域名和路径实现高级路由与HTTPS支持。
 
资源推荐
-  
Ingress-Nginx官方文档
 -  
Kubernetes Service类型详解
 
现在,你的应用已经可以向全世界say hello了!🎉 无论是内部微服务还是面向用户的Web应用,Service和Ingress都是不可或缺的桥梁。
