【问题标题】:Access AWS cluster endpoint running Kubernetes访问运行 Kubernetes 的 AWS 集群端点
【发布时间】:2019-03-14 22:43:58
【问题描述】:

我是 Kubernetes 新手,我目前正在使用 Kubeadm 在 AWS 中部署一个集群。容器部署得很好,但我似乎无法通过浏览器访问它们。当我过去通过 Docker Swarm 执行此操作时,我可以简单地使用 AWS 节点的 IP 地址通过浏览器访问和登录我的应用程序,但这似乎不适用于我当前的 Kubernetes 设置。

因此我的问题是如何在这些新设置下访问我正在运行的应用程序?

【问题讨论】:

  • 用 kubernetes 服务定义/暴露它们,所有其他方法都是反模式

标签: amazon-web-services kubernetes


【解决方案1】:

您应该了解如何在 Kubernetes 中使用 Services

Kubernetes 服务是一种抽象,它定义了一组逻辑 Pod 和访问它们的策略 - 有时称为 微服务。

基本上,服务允许从集群内部或外部访问部署(或 Pod)。

在你的情况下,如果你想在 AWS 中公开一个服务,它很简单:

apiVersion: v1
kind: Service
metadata:
  name: myApp
  labels:
    app: myApp
spec:
  ports:
  - port: 80 #port that the service exposes
    targetPort: 8080 #port of a container in "myApp"
  selector:
    app: myApp #your deployment must have the label "app: myApp"
  type: LoadBalancer

您可以在 AWS EC2 控制台中的“Elastic Load Balancers”下或使用kubectl describe service myApp检查服务是否创建成功

【讨论】:

  • 谢谢维克多。尽管您的服务成功启动,但在负载均衡器部分下没有创建任何内容,我仍然无法访问我的应用程序。还有什么我需要做的吗?
【解决方案2】:

这两个答案都有助于我寻求解决问题的方法,但我最终迷失了细节。这是一个可以帮助其他有类似情况的人的例子:

1) 考虑以下应用程序 yaml:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-web-app
  labels:
    app: my-web-app
spec:
  serviceName: my-web-app
  replicas: 1
  selector:
    matchLabels:
      app: my-web-app
  template:
    metadata:
      labels:
        app: my-web-app
    spec:
      containers:
      - name: my-web-app
        image: myregistry:443/mydomain/my-web-app
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: cp

2) 我决定采用 Node Port(感谢@Leandro 指出)来公开我的服务,因此我在我的应用程序 yaml 中添加了以下内容:

---
apiVersion: v1
kind: Service
metadata:
  name: my-web-app
  labels:
    name: my-web-app
spec:
  type: NodePort
  ports:
    - name: http1
      port: 80
      nodePort: 30036
      targetPort: 8080
      protocol: TCP
  selector:
     name: my-web-app

我缺少的一件事是两组中的标签名称必须匹配才能将my-web-app:StatefulSet (1) 链接到my-web-app:Service (2)。然后,my-web-app:StatefulSet:containerPort 必须与my-web-app:Service:targetPort (8080) 相同。最后,my-web-app:Service:nodePort 是我们公开暴露的端口,它必须是 30000-32767 之间的值。

3) 最后一步是确保 AWS 中的安全组允许所选 my-web-app:Service:nodePort 的入站流量,在本例中为 30036,如果不添加规则。

执行这些步骤后,我可以通过aws-node-ip:30036/my-web-app 访问我的应用程序。

【讨论】:

    【解决方案3】:

    基本上 kubernetes 的构建方式是不同的。首先,您的容器对外界是隐藏的,除非您创建一个服务来公开它们,一个负载均衡器或 nodePort。如果您创建 clusterIP 类型的服务,则它只能在集群内部使用。为简单起见,使用端口转发来测试您的容器,如果一切正常,则创建一个服务来公开它们(节点端口或负载均衡器)。最好和更困难的方法是创建一个入口来处理入站流量和路由到服务。

    端口转发示例:

    kubectl port-forward redis-master-765d459796-258hz 6379:6379
    

    为您的 pod 名称和容器的相应端口更改 redis。

    【讨论】:

    • 感谢莱安德罗。执行该命令后,我将能够访问我的应用程序,例如: :8090/myapp ?
    • 此命令将使您能够访问 localhost:8090。您可以像这样测试您的应用程序。它没有定义路径。您想在节点 ip 上公开吗?如果是这样,您需要为其创建服务,NodeIP 将为您解决。
    • 启动该命令,然后它将所有流量转发到您的计算机。
    • 你在使用这个命令吗? kubectl 端口转发 POD_NAME PORT_CONTAINER:PORT_LOCAL。也许您使用了错误的端口。您的应用程序应该在浏览器上显示的另一件事是什么?尝试 curl 本地主机上的应用程序地址。
    猜你喜欢
    • 1970-01-01
    • 2020-04-05
    • 2021-10-11
    • 2018-09-05
    • 2016-03-19
    • 2021-05-16
    • 2019-08-15
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多