【问题标题】:Exposing simple application in gcloud with Kubernetes使用 Kubernetes 在云中公开简单的应用程序
【发布时间】:2020-12-29 23:21:33
【问题描述】:

我有一个简单的应用程序,我正在学习一个基本教程:

https://medium.com/@bhargavshah2011/hello-world-on-kubernetes-cluster-6bec6f4b1bfd

  1. 我创建了一个集群hello-world2-cluster

  1. 我使用“连接”到集群:

    gcloud 容器集群 get-credentials hello-world2-cluster --zone us-central1-c --project monster-vortex-286312

  2. 我执行“hellow world”项目的 git 克隆,这基本上是某种蛇游戏:

    $ git clone https://github.com/skynet86/hello-world-k8s.git

    $ cd hello-world-k8s/

接下来我在 YAML 上运行“create”:

kubectl create -f hello-world.yaml

部署和服务按预期创建:

很好!一切都好!

但是....现在呢???

我现在该怎么办?

我想从外界访问这个应用程序。我可以访问应用程序的 URL 在哪里?

如何让我在 Timbuktu 的朋友 Bob 调用某种 URL(不需要 DNS)来访问我的应用程序?

我知道答案与 LoadBalancer 节点和 Ingress 有关,但似乎没有适当的文档说明如何为简单的 hello world 应用程序执行此操作。

【问题讨论】:

  • 如果您的服务是 NodePort 并使用您发送的图像作为参考,您的应用程序应该可以在 machine-ip:30081 中访问。 NodePort 服务打开一个可从集群外部访问的端口。
  • 我不知道 GKE 是如何工作的,但它应该取决于您的集群配置。如您所见,已经创建了一个名为“hello-world”的服务,它有一个内部 IP。这意味着它只能从集群内部访问。默认情况下,您必须创建一个“LoadBalancer”类型的服务,以便它具有外部 IP。但是当您在 GKE 上时,也许您的集群已经有一个外部 IP,您可以尝试通过“cluster-ip:30081”访问它,但我非常怀疑它是否会起作用。我习惯了 Azure Kubernetes Service,它带有一个默认的“全局”LoadBalancer。
  • 那么我的网址是什么? machine-ip:30081,是 google.cloud.hello-world.com 吗?我非常困惑。我只需要从外部链接到我的应用程序。

标签: kubernetes google-cloud-platform google-kubernetes-engine gcloud


【解决方案1】:

GKE hello-world with Ingress 官方示例https://cloud.google.com/kubernetes-engine/docs/how-to/load-balance-ingress

入口控制器内置在 GKE 中,您只需要一个指向您的 Servicekind: Ingress 对象。解决您的问题:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: hello-ingress
  annotations:
    kubernetes.io/ingress.class: "gce"
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: hello-world
          servicePort: 80

部署后,查询kubectl get ingress hello-ingress -oyaml 以在status: 字段中找出生成的负载均衡器的IP。

【讨论】:

  • 我现在更困惑了。我在我的 gcloud 中设置了所有内容。我只想要一些可以访问它的 URL。所以我需要创建一个 GKE Ingress 控制器?
  • 入口对象。我编辑了答案以链接要遵循的确切示例。
  • 还添加了入口样本。这真的很接近我提到的例子,只要坚持cloud.google.com/kubernetes-engine/docs/how-to/…
  • 我试过了,我得到了状态 --> loadBalancer --> ingress --> ip --> 34.102.214.148。我尝试在浏览器中输入该 IP,但出现 404 错误 :( (34.102.214.148)
  • 嗯,它今天似乎对我有用!好的,非常感谢您的帮助
【解决方案2】:

如果您不想设置 DNS 和/或入口,您可以使用 node external ip 简单地使用已有的内容。

看来您已经部署好了,NodePort 服务映射到端口30081

因此,以下是使其与您所拥有的东西一起使用的剩余步骤:

  1. 获取您的节点 IP:
kubectl get nodes -o wide
  1. 现在您有了节点外部 IP,您需要允许 tcp 流量到此端口
gcloud compute firewall-rules create allow-tcp-30081 --allow tcp:30081
  1. 就是这样!您可以告诉您的朋友 Bob,该服务应该可以通过 node-ip:30081 访问

您可以查看this page 以了解其他可能性,具体取决于您的服务类型。

此外,当您使用NodePort 时,端口会映射到集群的所有节点,因此您可以使用任何 IP。无需寻找部署副本的节点。

【讨论】:

    【解决方案3】:

    如果您不想使用 Ingress 或其他任何东西。您可以将您的部署公开为 LoadBalancer,然后使用您的朋友 bob 可以访问应用程序的外部 IP。所以要使用

    kubectl expose deployment hello-world-deployment --name=hello-world-deployment --type=LoadBalancer --port 80 --target-port 80
    

    为服务分配外部 IP 地址大约需要 1 分钟。

    获取外部IP使用

    kubectl get services
    

    在您的服务前面获取External IP address,然后打开浏览器并输入IP address that you copied

    完成!!这是最简单的入门方法!

    【讨论】:

      【解决方案4】:

      您可以使用Ingress 将您的 Kubernetes 服务公开到互联网。

      GKE 允许您使用不同类型的Ingress(基于nginx,等等),但默认情况下,它会通过Cloud Load Balancing 服务公开您的服务。

      如@MaxLobur 所示,您可以配置此默认Ingress,应用类似于此的配置文件:

      apiVersion: networking.k8s.io/v1beta1
      kind: Ingress
      metadata:
        name: hello-world-ingress
      spec:
        backend:
          serviceName: hello-world
          servicePort: 80
      

      或者,等效地,如果您想为各种后端服务准备 Ingress 并根据规则进行配置:

      apiVersion: networking.k8s.io/v1beta1
      kind: Ingress
      metadata:
        name: hello-world-ingress
      spec:
        rules:
        - http:
            paths:
            - path: /*
                backend:
                  serviceName: hello-world
                  servicePort: 80
      

      Ingress 将被分配一个外部 IP 地址。

      您可以使用以下命令找到它:

      kubectl get ingress hello-world-ingress
      

      此命令将输出类似以下内容:

      NAME                  HOSTS     ADDRESS         PORTS     AGE
      hello-world-ingress   *         203.0.113.12    80        2m
      

      但是,如果您将此 IP 地址提供给廷巴克图的朋友 Bob,他很快就会给您回电,告诉您他无法访问该应用程序...

      现在说真的:这个由 GCP 分配的外部 IP 地址是临时的,可能会更改。

      如果您的应用程序需要确定性的固定 IP 地址,则需要为您的 Ingress 配置静态 IP。

      这还允许您在必要时为您的应用程序配置 DNS 记录和 SSL 证书。

      在 GCP 中,此过程的第一步是 reserving a static IP address。您可以在 GCP 控制台中配置它,或者发出以下 gcloud 命令:

      gcloud compute addresses create hello-world-static-ip --global
      

      此 IP 稍后应通过修改其配置文件分配给您的 Ingress

      apiVersion: networking.k8s.io/v1beta1
      kind: Ingress
      metadata:
        name: hello-world-ingress
        annotations:
          kubernetes.io/ingress.global-static-ip-name: "hello-world-static-ip"
      spec:
        backend:
          serviceName: hello-world
          servicePort: 80
      

      这种静态 IP 方法只会增加价值,因为只要它与 Google Cloud 网络资源相关联,您就不会为此付费。

      所有这些过程都记录在这个GCP documentation page中。

      【讨论】:

        猜你喜欢
        • 2022-01-02
        • 1970-01-01
        • 2021-06-05
        • 1970-01-01
        • 2022-01-03
        • 2019-07-20
        • 2016-05-13
        • 1970-01-01
        • 2019-04-09
        相关资源
        最近更新 更多