代码之家  ›  专栏  ›  技术社区  ›  Praveen Sripati

如何在特定的节点端口上公开Kubernetes服务?

  •  2
  • Praveen Sripati  · 技术社区  · 7 年前

    我已经用下面的yaml定义创建了一个pod。

    apiVersion: v1
    kind: Pod
    metadata:
      name: myapp-pod
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: praveensripati/docker-demo:1.2
        ports:
        - containerPort: 3000
    

    现在我公开了pod,它创建了一个服务。

    kubectl expose pod myapp-pod --type=NodePort
    

    容器上的端口3000暴露于节点上的端口31728。我可以使用端口31728上的curl访问这个页面。

    kubectl get service myapp-pod
    NAME        TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    myapp-pod   NodePort   10.107.254.254   <none>        3000:31728/TCP   5s
    

    这次我想公开的服务不是随机端口,而是端口80。所以我使用--port将端口号指定为80。服务细节有点怪。它表示容器上的端口80暴露于节点上的端口31316。另外,我可以使用随机端口(本例中为31316)上的curl访问页面,而不是使用端口80。

    kubectl expose pod myapp-pod --type=NodePort --target-port=3000 --port=80
    
    kubectl get service myapp-pod
    NAME        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    myapp-pod   NodePort   10.105.123.73   <none>        80:31316/TCP   12s
    

    如何在特定端口而不是随机端口上公开服务?

    4 回复  |  直到 7 年前
        1
  •  3
  •   techuser soma    7 年前

    我会在这里回答你的问题。

    另外,我可以使用随机端口上的curl访问页面

    -- Because, kubernetes exposed the port 31316 on the host (maps to the service) and hence it can be accessed on host:31316.

    -- Service port is visible only within the kubernetes cluster. You can exec into a pod container and do a curl on servicename:service port instead of the NodePort.
    

    注意术语- container port: Service port: kubernetes服务在集群内部ip上公开并映射到容器端口的端口。 Nodeport: 在主机上公开并映射到kubernetes服务的端口。

        2
  •  34
  •   Rico    7 年前

    nodePort ports 在服务定义中。

    kind: Service
    apiVersion: v1
    metadata:
      name: my-service
    spec:
      selector:
        app: myapp
      ports:
      - protocol: TCP
        port: 3000
        nodePort: 32321
      type: NodePort
    

    请注意,它必须在configs中提供的给定范围内。默认为 30000-32767 kube-apiserver 使用配置 --service-node-port-range

        3
  •  5
  •   javajon    6 年前

    当现有仪表板服务已存在时,请将其删除。

    kubectl delete service kubernetes-dashboard -n kube-system

    将仪表板部署作为节点端口公开。

    kubectl expose deployment kubernetes-dashboard -n kube-system --type=NodePort

    上面将分配一个随机端口>=30000因此,请使用Patch命令将端口分配给已知的、未使用的和所需的端口>=30000

    kubectl patch service kubernetes-dashboard --namespace=kube-system --type='json' --patch='[{"op": "replace", "path": "/spec/ports/0/nodePort", "value":30000}]'

    注意事项: Never expose your dashboard publicly without authentication.

        4
  •  5
  •   Time Killer    6 年前

    如果集群没有LoadBalancer提供程序,则可以指定 externalIPs

    例如:

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
    spec:   
      type: ClusterIP
      externalIPs:
        - 125.100.99.101 # Node1-IP
        - 125.100.99.102 # Node2-IP
        - 192.168.55.112 # Node2-IP2
      selector:
        pod: nginx
      ports:
        - name: http
          port: 80      
        - name: https
          port: 443      
    

    80 443

        5
  •  1
  •   kalyani chaudhari    6 年前

    我们可以在特定的节点端口上公开Kubernetes服务。

    端口值必须介于30000-32767之间。

    1. 负载平衡器

    apiVersion: v1
    kind: Service
    metadata:
      name: app1
    spec:
      type: NodePort/LoadBalancer
      ports:
      - name: "80"
        port: 80
        nodePort: 32062
        targetPort: 80
      selector:
        appone: app1
        app: test
    

    节点端口 负载平衡器

        6
  •  1
  •   Zioalex    5 年前

    我也遇到了同样的问题,唯一不修改文件的方法是:

    k expose --type=NodePort deployment nginx --port 80 --name nginx-ep-patch  --overrides '{ "apiVersion": "v1","spec":{"ports": [{"port":80,"protocol":"TCP","targetPort":80,"nodePort":30080}]}}'
    service/nginx-ep-patch exposed
    

    通过这种方式,我们将配置和端口30080联机:

    $ k describe svc nginx-ep-patch
    Name:                     nginx-ep-patch
    Namespace:                default
    Labels:                   app=nginx
    Annotations:              <none>
    Selector:                 app=nginx
    Type:                     NodePort
    IP:                       10.96.51.148
    Port:                     <unset>  80/TCP
    TargetPort:               80/TCP
    NodePort:                 <unset>  30080/TCP
    Endpoints:                10.244.0.6:80
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:                   <none>
    
    推荐文章