K8s nodePort、port、targetPort、hostPort
https:// www.jianshu.com/p/8275f2031c83
1. nodePort
外部トラフィックがk8sクラスターのサービス入り口にアクセスする1つの方法(別の方法はLoadBalancer)です。つまり、nodeIP:nodePortは、外部トラフィックがk8sクラスターのサービスにアクセスするための入り口です。たとえば、外部ユーザーがk8sクラスターのWebアプリケーションにアクセスする場合、対応するサービスタイプを構成できます= NodePort、nodePort = 30001。他のユーザーは、ブラウザーhttp://ノード:30001を介してWebサービスにアクセスできます。また、データベースなどのサービスは、外部からアクセスする必要はなく、内部サービスからアクセスするだけでよいため、サービスのNodePortを設定する必要はありません。
2.ポート
k8sクラスター内部サービス間のサービスへのアクセス。つまり、clusterIP:ポートは、サービスがclusterIPで公開されているポートです。mysqlコンテナーはポート3306を公開します。クラスター内の他のコンテナーはポート33306を介してmysqlサービスにアクセスしますが、mysqlサービスはNodePortで構成されていないため、外部トラフィックはmysqlサービスにアクセスできません。対応するservice.yamlは次のとおりです。
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
ports:
- port: 33306
targetPort: 3306
selector:
name: mysql-pod
3.targetPort
コンテナーのポート(最終フローポート)。targetPortはポッドのポートです。ポートとnodePortからのトラフィックは、kube-proxyを介してバックエンドポッドのtargetPortに流れ込み、最終的にコンテナに入ります。
コンテナーを作成するときに公開されるポートは同じです(DockerFileのEXPOSEを使用)。たとえば、公式のnginx(DockerFileを参照)はポート80を公開します。対応するservice.yamlは次のとおりです
apiVersion: v1
kind: Service
metadata:
name: nginx-service spec: type: NodePort // 有配置NodePort,外部流量可访问k8s中的服务 ports: - port: 30080 // 服务访问端口 targetPort: 80 // 容器端口 nodePort: 30001 // NodePort selector: name: nginx-pod
4.hostPort
これは、ポッドネットワークを直接定義する方法です。hostPortは、コンテナーのポートとスケジュールされたノードのポートを直接ルーティングするため、ユーザーは次のようなホストマシンのIPを追加することでポッドにアクセスできます。
apiVersion: v1
kind: Pod
metadata:
name: influxdb
spec:
containers:
- name: influxdb
image: influxdb
ports:
- containerPort: 8086
hostPort: 8086
ポッドが再スケジュールされると、ポッドがスケジュールされているホストが変更される可能性があるため、これには欠点があります。ユーザーはポッドとホスト間の通信を維持する必要があります。
hostPortを使用するコンテナは、ポートが競合しないノードにのみディスパッチできます(必要なシステムレベルのデーモンサービスの実行など)を除き、ポートマッピング機能の使用はお勧めしません。サービスを外部に公開する必要がある場合は、NodePort Serviceを使用することをお勧めします 。
5.まとめ
通常、portとnodePortはどちらもサービスポートであり、前者はk8sクラスターの内部サービスアクセスに公開され、後者はk8sクラスターの外部トラフィックアクセスに公開されます。最後の2つのポートからのデータは、リバースプロキシのkube-proxyを経由してバックエンドポッドのtargetPortに流れ込み、最後にポッド内のコンテナーに到達する必要があります。
参照:
https://blog.csdn.net/yjk13703623757/article/details/79819415
https://jimmysong.io/posts/accessing-kubernetes-pods-from-outside-of-the-cluster/