引言:从“内部通讯”到“对外开放”
想象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>:30080
spec: 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都是不可或缺的桥梁。