How to expose a Kubernetes service on a specific Nodeport?

后端 未结 6 2058
不思量自难忘°
不思量自难忘° 2021-02-07 00:04

I have create a pod with the below yaml definition.

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: m         


        
相关标签:
6条回答
  • 2021-02-07 00:13

    Your question is about exposing the NodePort type of service on a specific port. For that you need to specify the nodePort field under ports in your service definition.

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

    Note that it has to be within a given range provided in the configs. Which defaults to 30000-32767. This range can be specified in the kube-apiserver configs using the --service-node-port-range option.

    0 讨论(0)
  • 2021-02-07 00:16

    I had the same problem and the only way I found to do it without modifying the files was:

    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
    

    In this way we path online the configuration and the port 30080 has been exposed:

    $ 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>
    
    0 讨论(0)
  • 2021-02-07 00:17

    When an existing Dashboard service already exists, remove it.

    kubectl delete service kubernetes-dashboard -n kube-system

    Expose the Dashboard deployment as a NodePort.

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

    The above will assign a random port >= 30000. So use the Patch command to assign the port to a known, unused and desired port >= 30000.

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

    Caution: Never expose your dashboard publicly without authentication.

    0 讨论(0)
  • 2021-02-07 00:21

    If your cluster does not have a LoadBalancer Provider, you can specify externalIPs in IP of nodes' network interface.

    For example:

    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      
    

    This will listen 80 and 443 on the specified node, and forward to the nginx service.

    0 讨论(0)
  • 2021-02-07 00:25

    I will try to answer your query here.

    Also, I am able to access the page using curl on the random port (31316 in this case) and not port 80.

    -- 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.
    

    Note the terms - container port: the port container listens on. Service port: the port where kubernetes service is exposed on cluster internal ip and mapped to the container port. Nodeport: the port exposed on the host and mapped to kubernetes service.

    0 讨论(0)
  • 2021-02-07 00:28

    we can expose Kubernetes service on specific node port.

    Port value must be between 30000-32767.

    We can expose service to specific port of below service types:

    1. NodePort

    2. LoadBalancer

    Find the sample myservice.yaml file below:

    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
    

    Note: In above service yaml file we can specify service type either NodePort or Loadbalancer.

    0 讨论(0)
提交回复
热议问题