初心者の目から見たKubernetes Ingress

イングレスとは?



イングレスは、Couberteneの基本的なリソースタイプです。 イングレス型のオブジェクトをkubernetisで単純に宣言すると、何も起こりません。







このリソースがKubernetisクラスターで動作を開始するには、イングレスコントローラーをインストールする必要があります。これにより、イングレスオブジェクトに従ってリバースプロキシが構成されます。







Ingress Controllerは、リバースプロキシとKubernetes APIサーバーと通信するコントローラーの2つのコンポーネントで構成されています。 リバースプロキシは、設定で指定されたポートで着信トラフィックをリッスンします(通常、デフォルト設定ではポート80のみが指定されます)。 コントローラーは、個別のデーモン(nginxなど)にすることも、プロキシに組み込む(traefikなど)こともできます。







すべてのクラウドkubernetesプロバイダーがデフォルトでIngress Controllerをプリインストールするわけではありません。







コントローラは、DaemonSetまたはDeploymentとして実行できます。 リバースプロキシがワーカーのすべてのIPアドレスをリッスンするように、DaemonSetを唯一のイングレスコントローラーとして使用することが理想的です。 Ingressコントローラーの前にバランサーがあれば展開は最適です-Kubernetisプロバイダー(GKE、AKS)から、サーバーにプレミアムまたは通常のhaproxy / nginxがインストールされている場合はMetalLB(手動構成が必要です)。 このインストールでは、複数のIngress Controllerをインストールできます。







受信トラフィックが入力コントローラーに到達する方法



すべての場合において、Ingress Controllerのリバースプロキシは、http / https接続を待機するポートをリッスンします。







これらのポートのトラフィックには、次の3つの方法でアクセスできます。









NodePort



URLにはNodePort http://domain.example.org:32200/で指定されたポートが含まれるため、LoadBalancerなしでNodePortにIngress Controllerを配置してもほとんど意味がありません。







このオプションでは、展開を使用することをお勧めします。 これにより、着信トラフィックを担当するポッドの数を簡単にスケーリングし、それらにnodeAffinityを指定し、複数の入力コントローラーを実行することが容易になります(例えば、実動およびステージング用)。







ホストポート



HostPortを使用する場合、ポートはこのポッドで実行されているホストから転送されます。 エントリにはLoadBalancerは必要ありませんが、サイトがDNSで機能するには、ドメインアドレスがすべてのノードにあることを示す必要があります。







3人のワーカーのDNS構成の例:







ingress.example.org A 10.0.0.1 ingress.example.org A 10.0.0.2 ingress.example.org A 10.0.0.3 www.example.org CNAME ingress.example.org
      
      





このインストールでは、DaemonSetを使用することをお勧めします。 ホスト上で複数のPodを実行することはできません。 展開は可能ですが、ほとんど意味がありません。 2つのポッドが1つのホストに割り当てられないようにアフィニティを登録する必要があります。そうしないと、ポートで競合が発生します。







traefikの設定例
 kind: DaemonSet apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-controller namespace: traefik labels: k8s-app: traefik-ingress-lb spec: template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb namespace: traefik spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 containers: - image: traefik:1.7.6 name: traefik-ingress-lb ports: - name: http containerPort: 80 hostPort: 80 - name: https containerPort: 443 hostPort: 443 - name: admin containerPort: 8080 hostPort: 8080 securityContext: capabilities: drop: - ALL add: - NET_BIND_SERVICE args: - --api - --kubernetes - --logLevel=DEBUG - --entrypoints=Name:https Address::443 TLS - --entrypoints=Name:http Address::80 - --defaultentrypoints=http
      
      





ホストネットワーク



ホストとの共有ネットワークでIngress Controllerを実行する場合、ポート転送は必要ありませんが、この場合、Podで開いているすべてのポートにインターネットからアクセスできます。 DaemonSetを使用して実行する方が良い。 理由はHostPortと同じです-ポートの競合を避けるため。







何を選ぶか



入力にLoadBalancerがある場合-NodePort、ない場合-HostPort + DNS Round Robin。 実験のために、ホストネットワークを試すことができますが、安全ではありません。








All Articles