当前位置: 首页 > 知识库问答 >
问题:

在kubernetes中,我如何设置一个服务对多个节点的访问?

萧宣
2023-03-14

我正在尝试使用单个Service yaml在多个节点上设置对Pods的访问。Pods都有相同的标签(例如tag: app),但分布在多个节点上,而不是在单个节点上。

据我所知,我可以设置一个服务,通过节点端口转发对Pod的访问,比如:

spec:
  type: NodePort
  selector:
    label: app
  ports:
    targetPort: 5000
    nodePort: 30000 

其中访问节点上的端口30000会转发到pod上的端口5000。

如果我在多个节点上有pod,有没有一种方法可以让客户端访问一个endpoint,例如服务本身,从而在循环中获得任何pod?或者客户端是否需要使用特定节点的IP访问该节点上的一组pod,如< code>xx.xx.xx.xx:30000中所示?

共有2个答案

楚俊逸
2023-03-14

如果你正在寻找应用程序服务的单个入口点,并且它在云基础架构中运行,则可以使用负载均衡器服务(而不是节点端口),它将为您的服务分配一个外部 IP,该 IP 可用于从外部系统访问服务。

spec:
  ports:
    - name: httpsPort
      port: 443
      protocol: TCP
      targetPort: 443
  selector:
    label: app
  type: LoadBalancer

如果在同一个集群中有多个服务需要从外部系统访问,那么可以使用Ingress。

谢谢,基鲁巴

戎泰
2023-03-14

虽然负载均衡器是一个无可否认的推荐解决方案(特别是在云环境中),但值得一提的是,NodePort还具有负载平衡功能。

您正在特定节点上访问<code>NodePort。

正如您在 NodePort Service Specification 中读到的:

每个节点将该端口(每个节点上的相同端口号)代理到服务中。

因此,通过访问一个特定节点上的端口30080,您的请求不会直接发送到该节点上调度的某个随机Pod。它被代理到Service对象,它是一个跨越所有节点的抽象。这可能是这里的关键点,因为您的NodePortService与您用于访问Pod的IP节点没有任何联系。

因此,NodePort Service能够使用简单的轮循机制算法将客户端请求路由到集群中的所有 Pod。

您可以使用下面的< code>Deployment轻松验证它:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      initContainers:
      - name: init-myservice
        image: nginx:1.14.2
        command: ['sh', '-c', "echo $MY_NODE_NAME > /usr/share/nginx/html/index.html"]
        env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: cache-volume
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: cache-volume
      volumes:
      - name: cache-volume
        emptyDir: {}

这将允许您测试您的http请求将要到哪个节点。您可能还需要稍微扩展此<code>部署</code>以确保使用所有节点:

kubectl scale deployment nginx-deployment --replicas=9

然后验证您的 Pod 是否安排在不同的节点上:

kubectl get pods -o wide

列出所有节点:

kubectl get nodes -o wide

并选择要用于访问Pod的节点的IP地址。

现在,您可以通过运行以下命令来公开< code >部署:

kubectl expose deployment nginx-deployment --type NodePort --port 80 --target-port 80

或者,如果您想自己指定端口号,例如30080,请应用以下NodePort服务定义,因为kubectl公开不允许您指定确切的nodePort值:

apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080

然后尝试使用先前选择的节点的IP访问通过<code>NodePort

请记住,如果您决定使用<code>节点端口)更改为<code>1-1024

 类似资料:
  • 我是码头工人和库伯内特斯的新手。使用的技术: < li >点网核心2.2 < li>Asp。NET Core WebAPI 2.2 < li >启用Kubernetes支持的Docker for windows(Edge) < li >代码 我将两个服务托管到两个docker容器容器1和容器2中。 下面是我的部署。yaml 当我运行命令时: 我获得的状态为 。 但是当我只配置了一个容器时,同样运行

  • 我尝试了以下命令- ,它给出了- 此CLI仅用于开发,不用于生产 https://docs.confluent.io/current/CLI/index.html 使用confluent_current:/tmp/confluent.w1s9b10m启动zookeeper zookeeper是[UP]启动kafka kafka是[UP] 启动schema-registry schema-regis

  • 我试图找到这个问题的答案,但在kubernetes文档或任何问答论坛中都找不到。 我有一个运行有4个节点的kubernetes集群。是否可以创建第二个集群,重用前一个集群中的一个或多个节点?或者一个节点被限制在单个kubernetes集群中? 我正在使用RKE(用于部署k8集群的牧场工具)运行实际的集群,我发现这个问题让我怀疑这种可能性。 感谢您的澄清。

  • 尝试从同一命名空间中的另一个服务连接到一个服务。使用ClusterIP创建服务。创建服务后使用该Ip访问服务。请求有时成功,有时失败,我看到两个pod都启动并运行。以下是服务配置

  • 我在库伯内特斯集群中运行3个节点。每个节点都有相同的Pod myApp。我使用NodePort类型创建一个服务,以便所有3个节点都可以从外部访问。服务yaml如下所示 假设3个节点的节点IP端口为: 1.192.168.18.1:30010 2.192.68.18.2:30010 3.192.18.18.3:30010 我的问题是:<br>1.如果所有请求都来自IP为(192.168.18.1:3

  • 我是运营模式工作的新手,正在花时间弄清楚整个最终架构应该是什么样子。我的项目目前在一个库伯内特斯集群和一个带有单个pod的单个节点上运行,在非常常见的Nginx反向代理UWSGI Django应用程序中。我必须实现缩放架构。我的理解是我应该在后面使用(我托管在OVH,他们确实提供了一个内置的LoadBalancer)。然后将流量分配到我的pod。 问题1:如果我的Django应用程序侦听端口800