【问题标题】:Can't access my service in a remote Kubernetes无法在远程 Kubernetes 中访问我的服务
【发布时间】:2020-07-05 19:31:59
【问题描述】:

我一直在寻找类似的问题,但没有找到。我有一个远程 Kubernetes 集群,它的架构是一个 master 和两个 worker。安装的版本如下: Kubernetes:1.15.1-0 码头工人:18.09.1-3.el7 我正在尝试部署和公开具有一个 REST 端点的 Spring 项目的 JAR 文件。

部署.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: microservices-deployment
  labels:
    app: microservices-deployment
spec:
  replicas: 3
  template:
    metadata:
      name: microservices-deployment
      labels:
        app: microservices-deployment
    spec:
      containers:
        - name: microservices-deployment
          image: **my_repo**/*repo_name*:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8085
      restartPolicy: Always
  selector:
    matchLabels:
      app: microservices-deployment

service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: microservices-service
spec:
  selector:
    app: microservices-deployment
  ports:
    - port: 8085
      targetPort: 8085
  type: NodePort

我的应用程序属性:

server.port=8085

Dockerfile:

FROM openjdk:8
ADD target/microservices.jar microservices.jar
EXPOSE 8085
ENTRYPOINT ["java", "-jar", "microservices.jar"]

看起来我的 pod 已经准备好了,一切看起来都不错,但是我无法访问我公开的服务,即使是从 master 的终端。 有人有什么主意吗? 提前致谢。

更新

我能够从我的主节点远程登录到节点上的端口 30000(在我将 30000 指定为我的 NodePort 之后),以及远程登录到端口 8085 上的 pod。当我尝试从主节点远程登录到我被拒绝的节点 \ pod 中的任何其他端口,所以我认为这是一个好的开始。尽管如此,我仍然无法访问我指定的其余端点,尽管它在本地运行在 Docker 上: docker run -p 8085:8085 IMAGE_NAME

【问题讨论】:

  • 你可以尝试端口转发还是尝试从集群中的另一个 pod 访问 pod ip 和端口。你是用 NodeIP: NodePort 来访问的吗?
  • 我尝试使用 nodeIP:notePORT。没有帮助。我会尝试端口转发
  • @YaakovShami 您是否尝试过构建映像并在本地 docker 上运行它?因为您在部署和服务上做的一切都是正确的。 ?我的感觉是你的代码一定有问题。
  • 检查 pod 调度到哪个节点(kubectl get pods -o wide)并使用该节点 IP
  • @DashrathMundkar 是的,如果我指定端口(-p 8085:8085),它就可以工作

标签: docker kubernetes microservices


【解决方案1】:

问题是网络问题。从一名工作人员访问端点就可以了。谢谢大家。

【讨论】:

    【解决方案2】:

    你定义了:

     - port: 8085
       targetPort: 8085
    

    有关信息:targetPort 是容器化应用程序使用的端口,port 是集群 IP(内部集群 IP)的端口。
    但是你没有为nodePort定义一个值,这意味着K8s will allocate it for you

    如果将 type 字段设置为 NodePort,则 Kubernetes 控制平面 从 --service-node-port-range 指定的范围分配端口 标志(默认:30000-32767)。

    但您也可以指定该端口:

    如果你想要一个特定的端口号,你可以在 节点端口字段。控制平面将为您分配该端口 或报告 API 事务失败。这意味着您需要 自己处理可能的端口冲突。您还必须使用 有效端口号,位于为 NodePort 配置的范围内的端口号 使用。

    无论如何,您可以通过kubectl -n YOUR_NAMESPACE describe service YOUR_SERVICE 获取/检查 K8s 选择(或您选择的)nodePort 的值。
    一般来说,您应该滥用describe 子命令来诊断/调试K8s 部署。

    然后从集群中的任何节点或从外部(因为端口类型为nodePort),请求集群的任何节点在分配的端口(生成或不生成)上,你应该能够从集群节点请求您的服务。

    如果您想自己定义该外部端口,请明确执行
    (注意:nodePort 在集群内必须是唯一的)例如:

    ports:
      - port: 8085
        targetPort: 8085
        nodePort: 8085
    

    这样,每个集群节点都会在 8085 端口上暴露服务。

    【讨论】:

    • 没有帮助。我指定:nodePort:30000 并尝试连接到其中一个节点,但它不起作用..
    • 怎么知道分配的节点端口是 300000 ?你用kubectl describe service microservices-service检索到信息了吗?
    • 是的,这是输出:NodePort: 30000/TCP
    猜你喜欢
    • 2022-06-27
    • 2014-07-23
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多