【问题标题】:My external IP on Azure Kubernetes Service doesn't work我在 Azure Kubernetes 服务上的外部 IP 不起作用
【发布时间】:2019-11-11 18:06:18
【问题描述】:

我在 Azure 上创建了一个 Kubernetes 集群。我已经部署了一些没有前端(微服务)的 pod。

我使用 Postman 和 VS Code 在本地执行了测试:这些微服务返回 200 O` 或 500。

问题是在 Kubernetes 中我有正确的外部 IP,但我无法从外部访问。

我有另一个 Mongo 容器,我可以毫无问题地访问它。我留下一些图像来尝试解决:

你能帮帮我吗?谢谢!!

【问题讨论】:

  • 你是如何暴露 pod 的,你使用的是 LoadBalancer 类型的服务吗?
  • 嗨@Thomas 感谢您的回答。是的,我在 YAML 文件中使用 LoadBalancer。
  • 能否提供部署或pod定义以及服务定义yaml? (您可以编辑问题并添加信息)
  • apiVersion:apps/v1 种类:部署元数据:名称:网络部署标签:应用程序:网络部署规范:副本:1 选择器:matchLabels:应用程序:网络模板:元数据:标签:应用程序:网络规范:容器:-名称:网络图像:myacr.azurecr.io/web-container:最新命令:[“sleep”] args:[“infinity”]端口:-containerPort:6062
  • apiVersion:v1 种类:服务元数据:名称:web-service 规范:选择器:app:web 端口:- 协议:TCP 端口:6062 类型:LoadBalancer

标签: azure kubernetes azure-aks


【解决方案1】:

Kubernetes 比简单的 docker 容器稍微复杂一些,因此一开始运行它可能会让人感到困惑。我将解释您需要在哪些点配置服务的公开。

每个容器都有自己的 ip 地址空间,因此每个容器可以为应用程序使用相同的端口。在您的情况下,您可能希望使用端口 6060。这是应用程序需要绑定到所有网络接口(ip 0.0.0.0)的端口,以便从外部访问。这是您将在 dockerfile 中声明为 EXPOSE 的端口。

在本地测试时,您可以将每个容器映射到不同的本地端口进行测试:docker run -p external-port:internal-port

您用于 EXPOSE 的端口是您在 Pod 或 Deployment 中配置为 containerPort 的端口。

一个或多个 Pod 在 Kubernetes 中使用 Service 公开为负载平衡服务。在那里,您可能希望将请求端口(对于 http 通常为 80)映射到容器端口,在您的情况下为 6060。

然后可以使用 LoadBalancer 向外部公开该服务。 LoadBalancer 的外部 IP 将映射到你的 Service 的(虚拟 IP),Service 将请求端口映射到容器端口并使用选择器选择合适的 pod。 pod 包含一个侦听容器端口的容器,然后回复您的请求。

必须正确配置整个链才能使其正常工作。保持简单(不为每个应用程序使用不同的端口)更容易做到正确。

【讨论】:

  • 感谢您的回答,但如果它是带有前端的东西,那将是可行的。我们正在从事微服务工作,现在,我应该在没有前端的情况下显示 X 信息。据我了解,我的一切都是正确的,但我仍然没有看到这个案例的解释。
  • 确保端口匹配(在节点应用程序的容器侦听端口内,docker 文件 EXPOSE 端口应该始终与侦听端口匹配!),如果已解决,请将您的部署更改为不发出'sleep' 作为命令,但只需将其留空并使用 dockerfile 中的 CMD 即可启动您的 npm 进程。如果这一切都解决了,它应该可以工作:)
  • 如果我删除 'sleep' 参数,它只会给我一个图像错误:Warning BackOff 7s (x4 over 37s) kubelet, aks-agentpool-29153703-2 Back-off restarting failed container跨度>
  • 这是另一种问题,与端口无关。您可以为此打开一个单独的问题。
  • 是的,我会为这个问题再开一个。但最让我担心的是,有一个暴露的 IP 和一个暴露的端口并不能显示任何东西。
【解决方案2】:

你有没有尝试像

这样点击 restApi URI
ExternalIP:Port/uri

这应该是可访问的,我也将这种方法与 AKS 一起使用

【讨论】:

  • 你能告诉我我应该把这个放在哪里吗?我不明白这一点。 :s
  • 好吧,你可以只用邮递员测试这个,外部IP可以从任何地方访问
  • 是的,在 localhost:Port/uri 中工作。但是在带有 LoadBalancer 的 Azure 中没有
  • 这不应该发生,你能分享在端口 6062 上运行的 web 服务的外部 IP 和你附加的 URI
  • 此错误出现在 4 个微服务中的任何一个中。例如:40.119.128.138:6060 应该给出 200 或 404。如果在本地我们把 localhost:6060 / 权限列出所有权限
【解决方案3】:

正如我从您的问题和评论中的 YAML 文件中看到的那样,我认为可能的原因是您在部署容器中设置了命令,该命令将覆盖图像中的默认命令。所以我怀疑你的应用程序可能没有启动,你可以检查一下。

我还建议您检查您暴露给外部的端口是否与图像中的端口相同。

【讨论】:

  • 嗨,我试着按照你说的做,但我没有运气。在我的 Dockerfile 中,我有以下内容: FROM node:10 WORKDIR /app COPY package.json /app RUN npm install COPY 。 /app CMD npm start EXPOSE 6060 如您所见,暴露了该微服务的6060端口(每个微服务都有一个特定的端口)
  • apiVersion:apps/v1 种类:部署元数据:名称:permis-deployment 标签:app:permis-deployment 规范:副本:1 选择器:matchLabels:app:permis 模板:元数据:标签:app:许可规范:容器:-名称:许可图像:myacr.azurecr.io/permission-container:最新命令:[“睡眠”] 参数:[“无限”]-apiVersion:v1 种类:服务元数据:名称:许可服务规格:选择器:应用程序:许可端口:- 协议:TCP 端口:6060 类型:LoadBalancer
  • @LluísLópez 我认为你不需要在容器中设置命令,然后在服务端口中添加targetPort
  • @LluísLópez 我想知道您为什么将容器中的命令设置为“睡眠”?它有什么用?
  • 我已在 6060 处将 TargetPort 投入使用,并将命令作为 args 我必须将其放入以便服务不会停止
【解决方案4】:

我已经能够解除 4 个微服务之一。

我尝试使用相同的 YAML(更改图像 URL 和端口)解除剩余的三个微服务,但这些都不起作用。

使用的 YAML 是这样的:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: permissions
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: permissions
    spec:
      containers:
      - name: permissions
        image: URL IMAGE
        ports:
        - containerPort: 6060
      imagePullSecrets:
      - name: nameimage
---
apiVersion: v1
kind: Service
metadata:
  name: permissions
spec:
  type: LoadBalancer
  ports:
  - port: 6060
  selector:
    app: permissions

我添加了这个来为其他微服务设置资源限制:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: users
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: users
    spec:
      containers:
      - name: users
        image: URL IMAGE
        resources:
          requests:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 6061
---
apiVersion: v1
kind: Service
metadata:
  name: users
spec:
  type: LoadBalancer
  ports:
  - port: 6061
  selector:
    app: users

如我所说,我只能举起第一个。

一些帮助?

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2016-07-11
    相关资源
    最近更新 更多