在 Kubernetes 中,Ingress 是一种资源对象,它提供了集群内部服务对外暴露 HTTP(S) 端点的功能,同时具备 URL 路由、SSL/TLS 终止、重写规则等多种功能。以下是部署和使用 Kubernetes Ingress 的实战步骤:
1. 安装 Ingress Controller
首先,你需要安装一个 Ingress Controller,常见的有 Nginx Ingress Controller、Traefik、Istio Gateway 等。这里以 Nginx Ingress Controller 为例:
# 使用 Helm 安装 Nginx Ingress Controller
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx --create-namespace --namespace ingress-nginx
# 或者使用 kubectl 直接应用 YAML 文件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml
2. 配置 Ingress
创建一个 Ingress 对象,该对象会定义哪些 Service 应该如何通过 Ingress Controller 来暴露出去:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: yourdomain.com
http:
paths:
- path: /service1
pathType: Prefix
backend:
service:
name: service1
port:
name: http
- path: /service2
pathType: Prefix
backend:
service:
name: service2
port:
number: 8080
此配置将:
- 将
yourdomain.com/service1
的流量路由到名为service1
的 Service 的http
端口。 - 将
yourdomain.com/service2
的流量路由到名为service2
的 Service 的 8080 端口。
3. 部署 Ingress 对象
将上述 Ingress 配置保存为 example-ingress.yaml
,然后应用到集群中:
kubectl apply -f example-ingress.yaml
4. (可选)配置 SSL/TLS
若需要支持 HTTPS,可以创建 Secret 存储证书和私钥,然后在 Ingress 对象中引用该 Secret:
apiVersion: v1
kind: Secret
metadata:
name: tls-secret
namespace: default
data:
tls.crt: base64-encoded-cert-file-content # 证书内容经过 base64 编码
tls.key: base64-encoded-private-key-file-content # 私钥内容经过 base64 编码
type: kubernetes.io/tls
# 然后在 Ingress 中添加 tls 配置
---
apiVersion: networking.k8s.io/v1
kind: Ingress
...
spec:
tls:
- hosts:
- yourdomain.com
secretName: tls-secret
...
5. 验证和测试
确保 Ingress Controller 正确部署并运行,然后通过域名访问验证路由是否生效。注意,在实际环境中,你还需确保 DNS 设置正确,将域名指向 Ingress Controller 所在的负载均衡器(如果是 LoadBalancer 类型)或 NodePort。
6. 高级配置
Ingress Controller 还支持很多高级特性,例如路径重写、Header 重写、限流、缓存、HTTPS 强制跳转等,这些都可以通过 Ingress 对象的注解(annotations)来实现,具体配置请参阅相关 Ingress Controller 的文档。