[再投稿] K8s nodePort、port、targetPort、hostPort

K8s nodePort、port、targetPort、hostPort

https:// www.jianshu.com/p/8275f2031c83
2019.09.30 13:01:29ワード数671リーディング2,052

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/

https://feisky.gitbooks.io/kubernetes/practice/portmap.html

おすすめ

転載: www.cnblogs.com/jinanxiaolaohu/p/12689242.html