如何在特定Nodeport上公开Kubernetes服务?

Pra*_*ati 8 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
Run Code Online (Sandbox Code Playgroud)

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

kubectl expose pod myapp-pod --type=NodePort
Run Code Online (Sandbox Code Playgroud)

容器上的端口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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我无法在特定端口上公开服务,也不能在随机端口上公开服务.我尝试了几种组合并阅读了k8s文档,但没有成功.

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

Ric*_*ico 15

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

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 3000
    nodePort: 32321
  type: NodePort
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这应该是公认的答案。除非在服务定义yaml中指定nodePort,否则k8s会随机分配30000-32767之间的端口。另请注意,“kubectl公开pod ... type=nodePort ...”*没有*具有在其参数中指定“nodePort”的选项。必须创建一个定义文件,然后执行“kubectl apply -f”才能获取所需的端口。或者在随机分配后执行“kubectl patch”。 (3认同)

Tim*_*ler 6

如果您的集群没有 LoadBalancer Provider,您可以在节点网络接口的 IP 中指定externalIP

例如:

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      
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*lex 6

我遇到了同样的问题,我发现在不修改文件的情况下做到这一点的唯一方法是:

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
Run Code Online (Sandbox Code Playgroud)

这样我们就在线配置了路径,并且端口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>
Run Code Online (Sandbox Code Playgroud)


jav*_*jon 5

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

kubectl delete service kubernetes-dashboard -n kube-system

将仪表板部署公开为 NodePort。

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}]'

注意:切勿在未经身份验证的情况下公开您的仪表板。


tec*_*oma 3

我将尝试在这里回答您的问题。

另外,我可以在随机端口(本例中为 31316)而不是端口 80 上使用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.
Run Code Online (Sandbox Code Playgroud)

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