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

Service 如何在特定节点端口上公开Kubernetes服务?,service,kubernetes,Service,Kubernetes,我已经用下面的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 kind: Service apiVersion

我已经用下面的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
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 3000
    nodePort: 32321
  type: NodePort
现在我公开了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
kubectl获取服务myapp pod
名称类型CLUSTER-IP外部IP端口年龄
myapp pod节点端口10.107.254.254 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
kubectl expose pod myapp pod--type=NodePort--target port=3000--port=80
kubectl获取服务myapp pod
名称类型CLUSTER-IP外部IP端口年龄
myapp pod节点端口10.105.123.73 80:31316/TCP 12s
我不能在特定端口上公开服务,也不能在随机端口上公开服务。我尝试了一些组合并阅读了k8s文档,但没有成功


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

您的问题是关于在特定端口上公开NodePort类型的服务。为此,您需要在服务定义中的
端口
下指定
节点端口
字段

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
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 3000
    nodePort: 32321
  type: NodePort

请注意,它必须在配置中提供的给定范围内。默认值为
30000-32767
。可以使用
--service node port range
选项在配置中指定此范围。

我将尝试在此处回答您的查询

此外,我还可以使用随机端口上的curl访问页面 (本例中为31316)而不是端口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
--因为kubernetes在主机上公开了端口31316(映射到服务),因此可以在主机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.

注意术语-
容器端口:
端口容器监听<代码>服务端口:kubernetes服务在集群内部ip上公开并映射到容器端口的端口<代码>节点端口:在主机上公开并映射到kubernetes服务的端口。

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

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

我们可以将服务公开到以下服务类型的特定端口:

  • 节点端口

  • 负载平衡器

  • 在下面找到示例myservice.yaml文件:

    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
    

    注意:在上面的服务yaml文件中,我们可以指定服务类型节点端口负载平衡器

    如果您的群集没有负载平衡器提供程序,您可以在节点的网络接口的IP中指定

    例如:

    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      
    

    这将侦听指定节点上的80443,并转发到nginx服务。

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

    kubectl删除服务kubernetes仪表板-n kube系统

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

    kubectl公开部署kubernetes仪表板-n kube系统--type=NodePort

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

    kubectl补丁服务kubernetes仪表板--名称空间=kube系统--type='json'--补丁='[{“op”:“replace”,“path”:“/spec/ports/0/nodePort”,“value”:30000}]


    注意:

    我也遇到了同样的问题,我发现在不修改文件的情况下执行此操作的唯一方法是:

    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>
    
    $k描述svc nginx ep补丁
    名称:nginx ep补丁
    名称空间:默认值
    标签:app=nginx
    注释:
    选择器:app=nginx
    类型:节点端口
    IP:10.96.51.148
    端口:80/TCP
    目标端口:80/TCP
    节点端口:30080/TCP
    终点:10.244.0.6:80
    会话关联:无
    外部流量策略:群集
    活动:
    
    我认为这应该是公认的答案。除非服务定义yaml中指定了
    nodePort
    ,否则k8s会在30000-32767之间随机分配一个端口。另外,请注意,
    kubectl expose pod。。。type=nodePort…
    没有在其参数中指定
    nodePort
    的选项。必须创建一个定义文件,然后执行
    kubectl apply-f
    以获得所需的端口。或者在随机分配后做一个
    kubectl补丁
    。正如上面的投票数所示,这个答案清楚地回答了OP的问题。请参阅下面的几篇文章(由@Rico撰写):