Kubernetes Ingress 资源提供从集群外部到集群中的一个或多个服务的 HTTP 或 HTTPS 路由。TKG 集群通过第三方控制器(例如 Nginx)支持 Ingress。
此教程演示了如何部署基于 NGINX 的 Kubernetes Ingress 服务,用于将外部流量路由到 Tanzu Kubernetes 集群中的服务。Ingress 服务需要 Ingress 控制器。我们使用 Helm 安装 NGINX Ingress 控制器。Helm 是适用于 Kubernetes 的软件包管理器。
注: 完成此任务的方法有多种。本文中的步骤提供了一种方法。在给定的环境中,其他方法可能更适合。
前提条件
- 查看 Kubernetes 文档中的 Ingress 资源。
- 查看 Nginx Ingress 控制器文档。
- 置备 TKG 集群。
- 如有必要,请启用 Pod 安全策略。
- 连接到 TKG 集群。
过程
- 参考文档,安装 Helm。
- 使用 Helm 安装 NGINX Ingress 控制器。
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx
- 验证 Nginx Ingress 控制器是否部署为 LoadBalancer 类型的服务。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.16.18.20 10.19.14.76 80:30635/TCP,443:30873/TCP 59m
ingress-nginx-controller-admission ClusterIP 10.87.41.25 <none> 443/TCP 59m
- 使用外部 IP 地址对负载均衡器执行 Ping 操作。
Pinging 10.19.14.76 with 32 bytes of data:
Reply from 10.19.14.76: bytes=32 time<1ms TTL=62
Reply from 10.19.14.76: bytes=32 time=1ms TTL=62
- 验证 Nginx Ingress 控制器是否正在运行。
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7c6c46898c-v6blt 1/1 Running 0 76m
- 创建具有 Ingress 规则和路径且名为
ingress-hello.yaml
的 Ingress 资源。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-hello
spec:
rules:
- http:
paths:
- path: /hello
backend:
serviceName: hello
servicePort: 80
- 部署
ingress-hello
资源。
kubectl apply -f ingress-hello.yaml
ingress.networking.k8s.io/ingress-hello created
- 验证该 Ingress 资源是否已部署。
请注意,IP 地址映射到 Ingress 控制器的外部 IP。
kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-hello <none> * 10.19.14.76 80 51m
- 创建名为 ingress-hello-test.yaml 的 hello 测试应用程序和服务。
kind: Service
apiVersion: v1
metadata:
name: hello
spec:
selector:
app: hello
tier: backend
ports:
- protocol: TCP
port: 80
targetPort: http
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
replicas: 3
selector:
matchLabels:
app: hello
tier: backend
track: stable
template:
metadata:
labels:
app: hello
tier: backend
track: stable
spec:
containers:
- name: hello
image: "gcr.io/google-samples/hello-go-gke:1.0"
ports:
- name: http
containerPort: 80
- 部署
ingress-hello-test
资源。
kubectl apply -f ingress-hello-test.yaml
service/hello created
deployment.apps/hello created
- 验证
hello
部署是否可用。
NAME READY UP-TO-DATE AVAILABLE AGE
hello 3/3 3 3 4m59s
ingress-nginx-controller 1/1 1 1 3h39m
- 获取 Nginx Ingress 控制器使用的负载均衡器的公用 IP 地址。
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-hello <none> * 10.19.14.76 80 13m
- 使用浏览器,导航到公用 IP,并包含 Ingress 路径。
将返回消息“hello”。
{"message":"Hello"}
结果
浏览器可从外部通过 Ingress 控制器使用负载均衡器的外部 IP 地址访问集群内部运行的服务管理的后端应用程序。