谷歌云 Kubernetes 实操手册:配置 Ingress 以进行外部负载平衡

准备环境

本页面介绍如何通过创建 Kubernetes Ingress 对象来配置外部 HTTP(S) 负载平衡器。一个 Ingress 对象必须与一个或多个 Service 对象相关联,每个 Service 对象与一组 Pod 相关联。

一个 Service 对象具有一个或多个 servicePort 结构。Ingress 定位的每个 servicePort 都与一个 Google Cloud 后端服务资源相关联。

在开始之前,我们要确认已启用 Google Kubernetes Engine API。

多个后端服务

HTTP(S) 负载平衡器提供一个稳定的 IP 地址,您可以使用该 IP 地址将请求路由到各个后端服务。

在此练习中,您将配置负载平衡器,以根据网址路径将请求路由到不同的后端服务。具有路径的请求将路由到一个后端服务,具有路径 /kube 的请求将路由到另一个后端服务。

以下简要介绍此练习中的步骤:

  • 创建一个 Deployment 并使用名为 hello-world 的 Service 公开它。
  • 创建第二个 Deployment 并使用名为 hello-kubernetes 的 Service 公开它。
  • 创建一个 Ingress,指定将请求路由到一个 Service 或另一个 Service 的规则,具体取决于请求中的网址路径。创建 Ingress 时,GKE Ingress 控制器会创建并配置 HTTP(S) 负载平衡器。
  • 测试 HTTP(S) 负载平衡器

以下是第一个 Deployment 的清单:

    apiVersion: apps/v1

    kind: Deployment

    metadata:

      name: hello-world-deployment

    spec:

      selector:

        matchLabels:

          greeting: hello

          department: world

      replicas: 3

      template:

        metadata:

          labels:

            greeting: hello

            department: world

        spec:

          containers:

          - name: hello

            image: "gcr.io/google-samples/hello-app:2.0"

            env:

            - name: "PORT"

              value: "50000"

将此清单复制到名为 hello-world-deployment.yaml 的文件,然后创建该 Deployment:

    kubectl apply -f hello-world-deployment.yaml

以下是公开第一个 Deployment 的 Service 的清单:

    apiVersion: v1

    kind: Service

    metadata:

      name: hello-world

    spec:

      type: NodePort

      selector:

        greeting: hello

        department: world

      ports:

      - protocol: TCP

        port: 60000

        targetPort: 50000

在此次实操中,我们需要理解有关 Service 的以下重要事项:

  • 同时具有 greeting: hello 标签和 department: world 标签的任何 Pod 都是 Service 的成员。
  • 当请求发送到 TCP 端口 60000 上的 Service 时,它将被转发到 TCP 端口 50000 上的某个成员 Pod。

Ingress 的 path 字段唯一支持的通配符是 * 字符。* 字符必须紧跟在正斜线 (/) 之后,并且必须是格式中的最后一个字符。例如,/*、/foo/*、/foo/bar/* 是有效格式,但 *、/foo/bar*、/foo/*/bar 不是有效格式。较具体的格式优先于不太具体的格式。如果您同时拥有 /foo/* 和 /foo/bar/*,则选择 /foo/bar/bat 来匹配 /foo/bar/*。

如需详细了解路径限制和格式匹配,请参阅网址映射文档。

网址映射文档:https://cloud.google.com/load-balancing/docs/url-map

将此清单复制到名为 hello-world-service.yaml 的文件,然后创建该 Service:

    kubectl apply -f hello-world-service.yaml

以下是第二个 Deployment 的清单。

    apiVersion: apps/v1

    kind: Deployment

    metadata:

      name: hello-kubernetes-deployment

    spec:

      selector:

        matchLabels:

          greeting: hello

          department: kubernetes

      replicas: 3

      template:

        metadata:

          labels:

            greeting: hello

            department: kubernetes

        spec:

          containers:

          - name: hello-again

            image: "gcr.io/google-samples/node-hello:1.0"

            env:

            - name: "PORT"

              value: "8080"

将此清单复制到名为 hello-kubernetes-deployment.yaml 的文件,然后创建该 Deployment:

    kubectl apply -f hello-kubernetes-deployment.yaml

以下是公开第二个 Deployment 的 Service 的清单:

    apiVersion: v1

    kind: Service

    metadata:

      name: hello-kubernetes

    spec:

      type: NodePort

      selector:

        greeting: hello

        department: kubernetes

      ports:

      - protocol: TCP

        port: 80

        targetPort: 8080

在此次实操实验中,我们还需要理解有关 Service 的以下重要事项:

  • 同时具有 greeting: hello 标签和 department: kubernetes 标签的任何 Pod 都是 Service 的成员。
  • 当请求发送到 TCP 端口 80 上的 Service 时,它将被转发到 TCP 端口 8080 上的某个成员 Pod。

将此清单复制到名为 hello-kubernetes-service.yaml 的文件,然后创建该 Service:

    kubectl apply -f hello-kubernetes-service.yaml

以下是 Ingress 的清单:

    apiVersion: networking.k8s.io/v1beta1

    kind: Ingress

    metadata:

      name: my-ingress

    spec:

      rules:

      - http:

          paths:

          - path: /*

            backend:

              serviceName: hello-world

              servicePort: 60000

          - path: /kube

            backend:

              serviceName: hello-kubernetes

              servicePort: 80

请注意,Ingress 清单有两个 (serviceName, servicePort) 对。每个 (serviceName, servicePort) 都与一个 Google Cloud 后端服务相关联。

将此清单复制到名为 my-ingress.yaml 的文件,然后创建该 Ingress:

  • 创建 Ingress 时,GKE Ingress 控制器会创建 HTTP(S) 负载平衡器,并按如下方式配置负载平衡器:
  • 当客户端将请求发送到网址路径为 / 的负载平衡器时,请求将被转发到端口 60000 上的 hello-world Service。

当客户端将请求发送到网址路径为 /kube 的负载平衡器时,请求将被转发到端口 80 上的 hello-kubernetes Service。

请等待 5 分钟左右,让负载平衡器完成配置。

查看 Ingress:

    kubectl get ingress my-ingress --output yaml

输出显示 HTTP(S) 负载平衡器的外部 IP 地址:

    status:

      loadBalancer:

        ingress:

        - ip: 35.244.129.17

测试 / 路径:

    curl 35.244.129.17

其中 load-balancer-ip 是负载平衡器的外部 IP 地址。

输出结果会显示 Hello, world! 消息:

    Hello,world!

    Version:2.0.0

    Hostname:hello-world-deployment-68c58989bb-tpl8m

测试 /kube 路径:

    curl 35.244.129.17/kube

输出结果会显示 Hello Kubernetes 消息:

    Hello Kubernates!


WebEye 是中国大陆地区首家获得 Google Cloud MSP 资质的合作伙伴。点击了解:企业上云服务

WebEye 为全球企业提供⼀站式数字媒体营销解决方案、增长效率工具平台、云服务、安全合规、游戏发行服务。我们汇集全球优质的移动营销资源,用大数据精准决策,用AI管理创意素材,用智能化平台实现聚合广告投放。WebEye云计算服务与多云管理平台、安全合规服务助力企业全面数字化转型。子品牌ModooPlay为国内外游戏开发者提供全渠道、一站式的游戏发行服务。

返回全部