以下の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のドキュメントを読みましたが、成功しませんでした。
ランダムポートではなく特定のポートでサービスを公開するにはどうすればよいですか?
ここであなたの質問に答えようとします。
また、ポート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サービスにマップされたポート。
あなたの質問は、特定のポートで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で指定できます。
クラスターに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
これは、指定されたノードで80と443をリッスンし、 nginxサービス。
既存のダッシュボードサービスが既に存在する場合は、削除します。
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}]'
特定のノードポートでKubernetesサービスを公開できます。
ポート値は30000〜32767の間でなければなりません。
以下のサービスタイプの特定のポートにサービスを公開できます。
NodePort
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を指定できます。