在kubernetes中,如何使用单个服务设置对多个节点的访问?

在kubernetes中,如何使用单个服务设置对多个节点的访问?,kubernetes,kubernetes-service,kubernetes-networking,Kubernetes,Kubernetes Service,Kubernetes Networking,我正在尝试使用单个服务yaml在多个节点上设置对POD的访问。这些pod都有相同的标签(比如,label:app),但分布在多个节点上,而不是单个节点上 据我所知,我可以设置一个服务,通过节点端口转发对Pod的访问,如: spec: type: NodePort selector: label: app ports: targetPort: 5000 nodePort: 30000 其中,访问节点上的端口30000将转发到pod上的端口5000 如果我在

我正在尝试使用单个服务yaml在多个节点上设置对POD的访问。这些pod都有相同的标签(比如,
label:app
),但分布在多个节点上,而不是单个节点上

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

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

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


如果我在多个节点上有pod,客户端是否有办法访问单个端点(例如服务本身),以循环方式获取任何pod?或者客户端是否需要使用特定节点的IP访问该节点上的一组POD,如
xx.xx.xx.xx:30000

如果您正在寻找应用程序服务的单一入口点,并且它正在云基础设施中运行,那么您可以使用该服务(而不是节点端口)它将为您的服务分配一个外部IP,该IP可用于从外部系统访问您的服务

spec:
  ports:
    - name: httpsPort
      port: 443
      protocol: TCP
      targetPort: 443
  selector:
    label: app
  type: LoadBalancer
如果您在同一集群中有多个服务,需要从外部系统访问这些服务,则可以使用

谢谢
Kiruba

如果您正在寻找应用程序服务的单一入口点,并且它正在云基础设施中运行,那么您可以使用服务(而不是节点端口),它将为您的服务分配一个外部IP,该IP可用于从外部系统访问您的服务

spec:
  ports:
    - name: httpsPort
      port: 443
      protocol: TCP
      targetPort: 443
  selector:
    label: app
  type: LoadBalancer
如果您在同一集群中有多个服务,需要从外部系统访问这些服务,则可以使用

谢谢 尽管Kiruba是一个无可否认的推荐解决方案(尤其是在云环境中),但值得一提的是,它还具有负载平衡功能

在特定节点上访问
NodePort
服务并不意味着您只能通过这种方式访问该特定节点上已调度的
pod

正如您在
NodePort
服务中所看到的:

每个节点代理该端口(每个节点上的端口号相同) 进入您的
服务

因此,通过访问某个特定节点上的端口
30080
,您的请求不会直接发送到该节点上计划的某个随机
Pod
。它被代理到
服务
对象,该对象是跨所有节点的抽象。这可能是这里的关键点,因为您的
NodePort
服务没有以任何方式绑定到您用来访问pod的IP节点

因此,
NodePort
服务能够使用简单的循环算法将客户端请求路由到集群中的所有pod

您可以使用以下
部署
轻松验证它:

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请求将发送到哪个节点。您可能还需要在此
部署中稍微扩展一点,以确保使用所有节点:

kubectl scale deployment nginx-deployment --replicas=9
然后验证是否已在不同的节点上调度POD:

kubectl get pods -o wide
列出所有节点:

kubectl get nodes -o wide
并选择要用于访问播客的节点的IP地址

现在,您可以通过运行以下命令公开
部署

kubectl expose deployment nginx-deployment --type NodePort --port 80 --target-port 80
或者,如果您想自己指定端口号,如
30080
,请应用以下
NodePort
服务定义,因为
kubectl expose
不允许您指定确切的
NodePort
值:

apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080
然后尝试使用先前选择的节点的IP通过
NodePort
服务访问您的公开播客。您可能需要尝试普通模式和私有/匿名模式,甚至不同的浏览器(简单的刷新可能无法工作),但最终您将看到不同的请求落在不同节点上的POD上

请记住,如果您决定使用
节点端口
,您将无法使用已知端口。实际上,这甚至可能是可行的,因为您可以使用
--service node port range
选项将配置中的默认端口范围(
30000-32767
)更改为类似
1-1024
,但不建议使用此选项,因为它可能会导致一些意外问题。

尽管是不可否认的推荐解决方案(特别是在云环境中),值得一提的是,它还具有负载平衡功能

在特定节点上访问
NodePort
服务并不意味着您只能通过这种方式访问该特定节点上已调度的
pod

正如您在
NodePort
服务中所看到的:

每个节点代理该端口(每个节点上的端口号相同) 进入您的
服务

因此,通过访问某个特定节点上的端口
30080
,您的请求不会直接发送到该节点上调度的某个随机
Pod
。它被代理到
服务
对象,该对象是跨所有节点的抽象。这可能是关键点,因为
节点端口
服务没有绑定以任何方式连接到用于访问播客的IP节点

因此,
NodePort
服务能够使用简单的循环算法将客户端请求路由到集群中的所有pod

您可以使用以下
部署
轻松验证它:

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请求将要发送到哪个节点。您可能还需要在此
部署中稍微扩展一点,以确保使用所有节点:

kubectl scale deployment nginx-deployment --replicas=9
然后验证是否已在不同的节点上调度POD:

kubectl get pods -o wide
列出所有节点:

kubectl get nodes -o wide
并选择要用于访问播客的节点的IP地址

现在,您可以通过运行以下命令公开
部署

kubectl expose deployment nginx-deployment --type NodePort --port 80 --target-port 80
或者,如果您想自己指定端口号,如
30080
,请应用以下命令<