Kubernetesクラスタの外部からPodにアクセスする5つの方法

5865 ワード

【原文住所】https://blog.csdn.net/u013061106/article/details/79748511
Tue Nov 21, 2017
2100 Words|Read in about 5 Min
Tags: kubernetes  
前のセクションでは、kubneretesクラスタへのアクセス方法について説明します.ここでは、主にkubenretesのPodとS erivceへのアクセス方法について説明します.以下のいくつかの方法が含まれています.
  • hostNetwork
  • hostPort
  • NodePort
  • LoadBalancer
  • Ingress

  • Podを暴露するということは、実はサービスを暴露することと同じです.Podはサービスのbackendだからです.
     
    hostNetwork: true
    これはPodネットワークを直接定義する方法です.
    PodでhostNetwork:true 構成を使用すると、このようなPodで実行されるアプリケーションはpodが起動したホストのネットワークインタフェースを直接見ることができます.
    ホストのすべてのネットワークインタフェースでアプリケーションにアクセスできます.ホストネットワークを使用するpodの定義の例を次に示します.
    apiVersion: v1
    kind: Pod
    metadata:
      name: influxdb
    spec:
      hostNetwork: true
      containers:
        - name: influxdb
          image: influxdb

    podが存在するホストの8086ポートにアクセスします.
    curl -v http://$POD_IP:8086/ping
    

    204 No Contentの204リターンコードが表示され、正常にアクセスできることが示される.
    注意このPodを起動するたびに異なるノードにスケジューリングされる可能性があり、すべての外部アクセスPodのIPも変化し、Podをスケジューリングする際にホスト上のポートと衝突するかどうかを考慮する必要があります.
    したがって、hostNetwork:trueは、特定のホスト上の特定のポートを使用する特定のアプリケーションが必要であることを知っていない限り、一般的に使用されます.
    このようなPodのネットワークモードには、ネットワークプラグインをPodにパッケージして各ホストに配置することができ、このようにしてホスト上のすべてのネットワークを制御することができる.
     
    hostPort
    これはPodネットワークを直接定義する方法です.
    hostPortはコンテナのポートとスケジューリングされたノードのポートを直接ルーティングし,ユーザがホストホストのIPに加えてPodにアクセスできるようにした.
    apiVersion: v1
    kind: Pod
    metadata:
      name: influxdb
    spec:
      containers:
        - name: influxdb
          image: influxdb
          ports:
            - containerPort: 8086
              hostPort: 8086

     
    このようにすると、Podが再スケジューリングされたときにそのPodがスケジューリングされたホストが変動する可能性があるため、ユーザは自分でそのホストとの対応関係を維持しなければならない.
    このネットワーク方式は、Nginx Ingress controllerとして使用することができる.外部トラフィックは、Kubenretes nodeノードの80および443ポートを通過する必要があります.
     
    NodePort
    NodePortはKubenretesで広く応用されているサービス暴露方式である.
    Kubernetesのサービスはデフォルトで使用されているClusterIPというタイプで、このようなサービスはClusterIPを生成します.
    このIPはクラスタ内でしかアクセスできないので,外部から直接サービスにアクセスできるようにするには,サービスtypeをNodePortに変更する必要がある.
    apiVersion: v1
    kind: Pod
    metadata:
      name: influxdb
      labels:
        name: influxdb
    spec:
      containers:
        - name: influxdb
          image: influxdb
          ports:
            - containerPort: 8086

     
    また、サービスには、APIサーバのプロファイルで--service-node-port-range で定義された30000-32767のNodePort値を指定することもできます.
    kind: Service
    apiVersion: v1
    metadata:
      name: influxdb
    spec:
      type: NodePort
      ports:
        - port: 8086
          nodePort: 30000
      selector:
        name: influxdb

     
    クラスタ外ではKubernetesのいずれかのノードのIPに30000ポートを加えてサービスにアクセスできます.Kube-proxyは、トラフィックをround-robinでサービスの各Podに自動的に転送します.
    このサービス・露出方式では、自分が望むアプリケーションの共通ポートを指定することはできませんが、クラスタにトラフィック・インタフェースとして逆エージェントを再配置することができます.
     
    LoadBalancer
    LoadBalancerはサービスでしか定義できません.AWS、Azure、CloudStack、GCEなど、パブリッククラウドが提供する負荷イコライザです.
    kind: Service
    apiVersion: v1
    metadata:
      name: influxdb
    spec:
      type: LoadBalancer
      ports:
        - port: 8086
      selector:
        name: influxdb

     
    サービスの表示:
    $ kubectl get svc influxdb
    NAME       CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
    influxdb   10.97.121.42   10.13.242.236   8086:30051/TCP   39s

     
    内部では、19.97.121.42:8086などのサービスにアクセスするために、ClusterIPプラスポートを使用することができます.
    外部では、次の2つの方法でサービスにアクセスできます.
  • は、いずれかのノードのIPプラス30051ポートを使用して、このサービス
  • にアクセスする.
  • EXTERNAL-IPを使用してアクセスします.これはVIPで、10.13.242.236:8086のようなクラウドベンダーが提供する負荷イコライザIPです.

  •  
    Ingress
    Ingressはkubernetes 1.1リリース後に導入されたリソースタイプ.Ingressリソースを作成するには、Ingress controllerを導入する必要があります.Ingress controllerはプラグインとして提供されます.
    Ingress controllerはKubernetesの上に配置されたDockerコンテナです.そのDockerミラーには、NginxやHAProxyのような負荷イコライザとコントローラデーモンプロセスが含まれています.
    コントローラデーモンはKubernetesから必要なIngres構成を受信します.NginxまたはHAProxyプロファイルが生成され、変更が有効になるようにロード・バランサ・プロセスが再起動されます.
    言い換えれば、Ingress controllerはKubernetesによって管理される負荷イコライザである.
    Kubernetes Ingressは負荷バランサの典型的な特性を提供した:HTTPルーティング、粘性セッション、SSL終端、SSL直通、TCPとUDP負荷バランシングなど.
    現在、すべてのIngress controllerがこれらの機能を実装しているわけではありません.具体的なIngress controllerドキュメントを表示する必要があります.
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: influxdb
    spec:
      rules:
        - host: influxdb.kube.example.com
          http:
            paths:
              - backend:
                  serviceName: influxdb
                  servicePort: 8086

     
    外部アクセスURLhttp://influxdb.kube.example.com/pingこのサービスにアクセスすると、エントリは80ポートで、Ingress controllerはバックエンドPodに直接トラフィックを転送し、kube-proxyの転送を必要とせず、LoadBalancer方式よりも効率的です.
     
    まとめ
    全体的にIngressは、Nginx、HAProxy、Traefikなど、非常に柔軟でますますメーカーのサポートを受けているサービス暴露方式であり、サービスデバッグ、特殊なアプリケーションの導入に適しているサービス暴露方式もあります.
     
    リファレンス
    Accessing Kubernetes Pods from Outside of the Cluster - alesnosek.com