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

时间:2018-09-26 16:43:27

标签: 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

现在我公开了一个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。另外,我能够使用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

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

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

6 个答案:

答案 0 :(得分:9)

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

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选项在kube-apiserver配置中指定此范围。

答案 1 :(得分:3)

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

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>

答案 2 :(得分:1)

我会在这里尝试回答您的查询。

  

此外,我能够使用随机端口上的curl访问页面   (在这种情况下为31316),而不是端口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.

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

答案 3 :(得分:0)

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

端口值必须在30000-32767之间。

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

  1. NodePort

  2. LoadBalancer

在下面找到示例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文件中,我们可以指定 NodePort Loadbalancer 的服务类型。

答案 4 :(得分:0)

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

例如:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  # type: LoadBalancer
  # type: NodePort
  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
      # nodePort: 0
    - name: https
      port: 443
      # nodePort: 0

这将在指定节点上监听 80 443 ,并转发到nginx服务。

答案 5 :(得分:0)

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

kubectl delete service kubernetes-dashboard -n kube-system

将Dashboard部署公开为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}]'

警告:Never expose your dashboard publicly without authentication.