Kubernetes Ingress 资源提供从集群外部到集群中的一个或多个服务的 HTTP 或 HTTPS 路由。TKG 集群通过第三方控制器(例如 Contour)支持 Ingress。
此教程演示了如何部署用于将外部流量路由到 TKG 集群中服务的 Contour Ingress 控制器。Contour 是 VMware 参与的一个开源项目。
前提条件
过程
- 创建一个 ClusterRoleBinding,以允许服务帐户管理集群的所有资源。
kubectl create clusterrolebinding default-tkg-admin-privileged-binding --clusterrole=psp:vmware-system-privileged --group=system:authenticated
- 创建名为
projectcontour
的命名空间。这是 Contour Ingress 控制器部署的默认命名空间kubectl create ns projectcontour
- 下载最新的 Contour Ingress 控制器 YAML:Contour Ingress 部署。
- 使用文本编辑器打开 contour.yaml 文件。
- 通过在每行前面加上
#
符号,注释掉以下两行:第 1632 行:# service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
第 1634 行:# externalTrafficPolicy: Local
- 通过应用
contour.yaml
文件部署 Countour。kubectl apply -f contour.yaml
- 验证是否已部署 Contour Ingress 控制器和 Envoy 负载均衡器服务。
kubectl get services -n projectcontour
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE contour ClusterIP 198.63.146.166 <none> 8001/TCP 120m envoy LoadBalancer 198.48.52.47 192.168.123.5 80:30501/TCP,443:30173/TCP 120m
- 验证 Contour 和 Envory Pod 是否正在运行。
kubectl get pods -n projectcontour
NAME READY STATUS RESTARTS AGE contour-7966d6cdbf-skqfl 1/1 Running 1 21h contour-7966d6cdbf-vc8c7 1/1 Running 1 21h contour-certgen-77m2n 0/1 Completed 0 21h envoy-fsltp 1/1 Running 0 20h
- 使用外部 IP 地址对负载均衡器执行 Ping 操作。
ping 192.168.123.5
PING 192.168.123.5 (192.168.123.5) 56(84) bytes of data. 64 bytes from 192.168.123.5: icmp_seq=1 ttl=62 time=3.50 ms
- 创建名为 ingress-nihao.yaml 的 Ingress 资源。
创建 YAML。
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-nihao spec: rules: - http: paths: - path: /nihao backend: serviceName: nihao servicePort: 80
应用 YAML。kubectl apply -f ingress-nihao.yaml
验证是否已创建 Ingress 资源。kubectl get ingress
Envoy LoadBalancer 的外部 IP 地址(在此示例中为192.168.123.5
)由 Ingress 对象使用。NAME CLASS HOSTS ADDRESS PORTS AGE ingress-nihao <none> * 192.168.123.5 80 17s
- 部署具有后端应用程序的测试服务。
创建以下名为 ingress-nihao-test.yaml 的 YAML 文件。
kind: Service apiVersion: v1 metadata: name: nihao spec: selector: app: nihao tier: backend ports: - protocol: TCP port: 80 targetPort: http --- apiVersion: apps/v1 kind: Deployment metadata: name: nihao spec: replicas: 3 selector: matchLabels: app: nihao tier: backend track: stable template: metadata: labels: app: nihao tier: backend track: stable spec: containers: - name: nihao image: "gcr.io/google-samples/hello-go-gke:1.0" ports: - name: http containerPort: 80
应用 YAML。kubectl apply -f ingress-nihao-test.yaml
验证是否已创建nihao
服务。kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nihao ClusterIP 10.14.21.22 <none> 80/TCP 15s
验证是否已创建后端部署。kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE nihao 3/3 3 3 2m25s
验证后端 pod 是否存在。kubectl get pods
NAME READY STATUS RESTARTS AGE nihao-8646584495-9nm8x 1/1 Running 0 106s nihao-8646584495-vscm5 1/1 Running 0 106s nihao-8646584495-zcsdq 1/1 Running 0 106s
- 获取 Contour Ingress 控制器使用的负载均衡器的公用 IP 地址。
kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE ingress-nihao <none> * 10.19.14.76 80 13m
- 使用浏览器,导航到公用 IP,并包含 Ingress 路径。
http://10.19.14.76/nihao
将返回消息“hello”。{"message":"Hello"}