web-dev-qa-db-ja.com

特定のNodeportでKubernetesサービスを公開する方法は?

以下のyaml定義でポッドを作成しました。

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

そして今、サービスを作成するポッドを公開します。

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に公開されています。また、ポート80ではなく、ランダムポート(この場合は31316)で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

ランダムなポートではなく、特定のポートでサービスを公開することはできません。いくつかの組み合わせを試し、k8sのドキュメントを読みましたが、成功しませんでした。

ランダムポートではなく特定のポートでサービスを公開するにはどうすればよいですか?

8
Praveen Sripati

ここであなたの質問に答えようとします。

また、ポート80ではなく、ランダムポート(この場合は31316)で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サービスにマップされたポート。

1
techuser soma

あなたの質問は、特定のポートで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 configsで指定できます。

15
Rico

クラスターにLoadBalancerプロバイダーがない場合は、ノードのネットワークインターフェイスのIPで 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      

これは、指定されたノードで80443をリッスンし、 nginxサービス。

3
KFC

既存のダッシュボードサービスが既に存在する場合は、削除します。

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

注意: 認証なしでダッシュボードを公開しないでください。

2
javajon

特定のノードポートで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を指定できます。

0