このページの改善にご協力ください
このユーザーガイドに貢献するには、すべてのページの右側のペインにある「GitHub でこのページを編集する」リンクを選択してください。
ハイブリッドノード用に Kubernetes Ingress を設定する
このトピックでは、Amazon EKS Hybrid Nodes で実行されているワークロード用に Kubernetes Ingress を設定する方法について説明します。Kubernetes Ingress
AWS は、EKS Hybrid Nodes で実行されているワークロード向けに AWS Application Load Balancer (ALB) と Cilium for Kubernetes Ingress をサポートしています。Ingress に ALB を使用するか Cilium を使用するかは、アプリケーショントラフィックのソースに基づきます。アプリケーショントラフィックの発信元が AWS リージョンである場合、AWS では AWS ALB と AWS Load Balancer Controller の使用を推奨しています。アプリケーショントラフィックの発信元がローカルのオンプレミス環境またはエッジ環境である場合、AWS では Cilium に組み込みの Ingress 機能の使用を推奨しています。この機能は、お使いの環境にロードバランサーインフラストラクチャを搭載しているかどうかにかかわらず使用できます。

AWS Application Load Balancer
ハイブリッドノード上で実行されているワークロードのターゲットタイプが ip
の場合、AWS Load Balancer と Application Load Balancer (ALB) を使用できます。ターゲットタイプ ip
を使用している場合、ALB はトラフィックをポッドに直接転送して、Service レイヤーネットワークパスをバイパスします。ALB がハイブリッドノード上のポッド IP ターゲットに到達するためには、オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能である必要があります。また、AWS Load Balancer Controller はウェブフックを使用し、EKS コントロールプレーンからの直接通信が必要です。詳細については、「ハイブリッドノード用のウェブフックを設定する」を参照してください。
考慮事項
-
AWS Application Load Balancer と AWS Load Balancer Controller の詳細については、「Application Load Balancer を使用してアプリケーションと HTTP トラフィックをルーティングする」と「Helm による AWS Load Balancer Controller のインストール」を参照してください。
-
AWS Application Load Balancer と AWS Network Load Balancer のどちらかを選択する方法については、「Best Practices for Load Balancing」を参照してください。
-
AWS Application Load Balancer で Ingress リソース用に設定できる注釈のリストについては、「AWS Load Balancer Controller Ingress annotations
」を参照してください。
前提条件
-
「ハイブリッドノードの CNI を設定する」の手順に従って Cilium がインストールされていること。
-
「ハイブリッドノード向けに Cilium BGP を設定する」の手順に従って Cilium BGP コントロールプレーンを有効にしていること。BGP を使用しない場合は、別の方法を使用して、オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能にする必要があります。オンプレミスポッド CIDR をルーティング可能にしないと、ALB はポッド IP ターゲットの登録も接続もできません。
-
コマンドライン環境に Helm がインストールされていること。詳細については、「Setup Helm instructions」を参照してください。
-
コマンドライン環境に eksctl がインストールされていること。詳細については、「eksctl install instructions」を参照してください。
手順
-
ユーザーに代わって AWS API を呼び出すことを許可する、AWS Load Balancer Controller 用の IAM ポリシーをダウンロードします。
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
-
前のステップでダウンロードしたポリシー を使用して、IAM ポリシーを作成します。
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
-
クラスター名 (
CLUSTER_NAME
)、AWS リージョン (AWS_REGION
)、AWS アカウント ID (AWS_ACCOUNT_ID
) の各値を自分の設定値に置き換えて、次のコマンドを実行します。eksctl create iamserviceaccount \ --cluster=CLUSTER_NAME \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --region AWS_REGION \ --approve
-
eks-charts Helm チャートリポジトリを追加し、ローカル Helm リポジトリを更新して、チャートを最新の状態にします。
helm repo add eks https://aws.github.io/eks-charts
helm repo update eks
-
AWS Load Balancer コントローラをインストールします。クラスター名 (
CLUSTER_NAME
)、AWS リージョン (AWS_REGION
)、VPC ID (VPC_ID
)、AWS Load Balancer Controller Helm チャートバージョン (AWS_LBC_HELM_VERSION
) の各値を自分の設定値に置き換えて、次のコマンドを実行します。ハイブリッドノードと AWS クラウド内のノードの両方を使用して混合モードクラスターを実行している場合は、「AWS ロードバランサーコントローラー」の手順に従ってクラウドノード上で AWS Load Balancer Controller を実行できます。-
Helm チャートの最新バージョンを確認するには、
helm search repo eks/aws-load-balancer-controller --versions
を実行します。helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --version
AWS_LBC_HELM_VERSION
\ --set clusterName=CLUSTER_NAME
\ --set region=AWS_REGION
\ --set vpcId=VPC_ID
\ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
-
-
AWS Load Balancer Controller が正常にインストールされたことを確認します。
kubectl get -n kube-system deployment aws-load-balancer-controller
NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s
-
サンプルアプリケーションを作成します。以下の例では、Istio Bookinfo
サンプルマイクロサービスアプリケーションを使用しています。 kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
-
次の内容で、
my-ingress-alb.yaml
という名前のファイルを作成します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress namespace: default annotations: alb.ingress.kubernetes.io/load-balancer-name: "my-ingress-alb" alb.ingress.kubernetes.io/target-type: "ip" alb.ingress.kubernetes.io/scheme: "internet-facing" alb.ingress.kubernetes.io/healthcheck-path: "/details/1" spec: ingressClassName: alb rules: - http: paths: - backend: service: name: details port: number: 9080 path: /details pathType: Prefix
-
Ingress 設定をクラスターに適用します。
kubectl apply -f my-ingress-alb.yaml
-
Ingress リソース用に ALB をプロビジョニングするには、数分かかる場合があります。ALB がプロビジョニングされると、ALB デプロイの DNS 名に対応するアドレスが Ingress リソースに割り当てられます。アドレスの形式は
<alb-name>-<random-string>.<region>.elb.amazonaws.com
です。kubectl get ingress my-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress alb * my-ingress-alb-<random-string>.<region>.elb.amazonaws.com 80 23m
-
ALB のアドレスを使用して Service にアクセスします。
curl -s http//my-ingress-alb-<random-string>.<region>.elb.amazonaws.com:80/details/1 | jq
{ "id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890" "details": "This is the details page" }
Cilium Ingress および Cilium Gateway の概要
Cilium Ingress は、Cilium のアーキテクチャに組み込みの機能であり、Kubernetes Ingress API または Gateway API を使用して管理できます。既存の Ingress リソースがない場合、AWS では Gateway API から始めることを推奨しています。Kubernetes ネットワークリソースを柔軟かつ表現力豊かに定義および管理できるためです。Kubernetes Gateway API
Cilium の Ingress 機能または Gateway 機能を有効にすると、Cilium オペレーターがクラスター内の Ingress/Gateway オブジェクトを照合し、各ノードの Envoy プロキシがレイヤー 7 (L7) ネットワークトラフィックを処理します。Cilium は、ロードバランサーなどの Ingress/Gateway インフラストラクチャを直接にはプロビジョニングしません。ロードバランサーと共に Cilium Ingress/Gateway を使用する場合は、ロードバランサーのツール (通常は Ingress コントローラーや Gateway コントローラー) を使用して、ロードバランサーのインフラストラクチャをデプロイおよび管理する必要があります。
Ingress/Gateway トラフィックの場合、Cilium がコアネットワークトラフィックと L3/L4 ポリシー適用を処理し、統合 Envoy プロキシが L7 ネットワークトラフィックを処理します。Cilium Ingress/Gateway の場合、Envoy が L7 ルーティングルール、ポリシー、リクエスト操作の適用、高度なトラフィック管理 (トラフィックの分割やミラーリングなど)、TLS の終了と発信を行います。Cilium の Envoy プロキシは、デフォルトでは独立した DaemonSet (cilium-envoy
) としてデプロイされます。これにより、Envoy と Cilium エージェントを個別に更新、スケール、管理できます。
Cilium Ingress と Cilium Gateway の仕組みの詳細については、Cilium のドキュメントの「Cilium Ingress
Cilium Ingress と Cilium Gateway の比較
以下の表に、Cilium バージョン 1.17.x の Cilium Ingress 機能と Cilium Gateway 機能をまとめます。
機能 | Ingress | ゲートウェイ |
---|---|---|
サービスタイプ LoadBalancer |
はい |
あり |
サービスタイプ NodePort |
あり |
いいえ1 |
ホストネットワーク |
はい |
あり |
共有ロードバランサー |
はい |
あり |
専用ロードバランサー |
あり |
なし2 |
ネットワークポリシー |
はい |
あり |
プロトコル |
レイヤー 7 (HTTP(S)、gRPC) |
レイヤー 7 (HTTP(S)、gRPC)3 |
TLS パススルー |
はい |
あり |
トラフィック管理 |
パスおよびホストのルーティング |
パスおよびホストのルーティング、URL のリダイレクトと書き換え、トラフィックの分割、ヘッダーの変更 |
1 Cilium Gateway による NodePort サービスのサポートは、Cilium バージョン 1.18.x (#27273
2 Cilium Gateway による専用ロードバランサーのサポート (#25567
3 Cilium Gateway による TCP/UDP のサポート (#21929
Cilium Gateway をインストールする
考慮事項
-
Cilium では、以下の例に示すように、
nodePort.enabled
をtrue
に設定する必要があります。Cilium の kube-proxy 置換機能を使用している場合は、nodePort.enabled
をtrue
に設定する必要はありません。 -
Cilium では、以下の例に示すように、
envoy.enabled
をtrue
に設定する必要があります。 -
Cilium Gateway は、ロードバランサーモード (デフォルト) またはホストネットワークモードでデプロイできます。
-
Cilium Gateway をロードバランサーモードで使用する場合は、Gateway リソースに
service.beta.kubernetes.io/aws-load-balancer-type: "external"
注釈を設定する必要があります。これにより、Cilium が Gateway リソース用にタイプ LoadBalancer の Service を作成する際に、レガシー AWS クラウドプロバイダーがその Service 用に Classic Load Balancer を作成しなくなります。 -
Cilium Gateway をホストネットワークモードで使用する場合、タイプ LoadBalancer の Service は無効になります。ホストネットワークモードは、ロードバランサーインフラストラクチャがない環境に有用です。詳細については、「ホストネットワーク」を参照してください。
前提条件
-
コマンドライン環境に Helm がインストールされていること。「Setup Helm instructions」を参照してください。
-
「ハイブリッドノードの CNI を設定する」の手順に従って Cilium がインストールされていること。
手順
-
Kubernetes Gateway API カスタムリソース定義 (CRD) をインストールします。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gateways.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_httproutes.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_referencegrants.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml
-
cilium-gateway-values.yaml
というファイルを次の内容で作成します。以下の例では、デフォルトのロードバランサーモードを使用するように Cilium Gateway を設定しています。また、Envoy プロキシをハイブリッドノードでのみ実行するように設定している場合には、そのプロキシに別のcilium-envoy
DaemonSet を使用するように設定しています。gatewayAPI: enabled: true # uncomment to use host network mode # hostNetwork: # enabled: true nodePort: enabled: true envoy: enabled: true affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: In values: - hybrid
-
Helm 値ファイルをクラスターに適用します。
helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \ --namespace kube-system \ --reuse-values \ --set operator.rollOutPods=true \ --values cilium-gateway-values.yaml
-
Cilium オペレーター、エージェント、Envoy ポッドが動作していることを確認します。
kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
NAME READY STATUS RESTARTS AGE cilium-envoy-5pgnd 1/1 Running 0 6m31s cilium-envoy-6fhg4 1/1 Running 0 6m30s cilium-envoy-jskrk 1/1 Running 0 6m30s cilium-envoy-k2xtb 1/1 Running 0 6m31s cilium-envoy-w5s9j 1/1 Running 0 6m31s cilium-grwlc 1/1 Running 0 4m12s cilium-operator-68f7766967-5nnbl 1/1 Running 0 4m20s cilium-operator-68f7766967-7spfz 1/1 Running 0 4m20s cilium-pnxcv 1/1 Running 0 6m29s cilium-r7qkj 1/1 Running 0 4m12s cilium-wxhfn 1/1 Running 0 4m1s cilium-z7hlb 1/1 Running 0 6m30s
Cilium Gateway を設定する
Cilium Gateway を Gateway オブジェクトで有効にするには、gatewayClassName
を cilium
に設定します。Cilium が Gateway リソース用に作成する Service を設定するには、Gateway オブジェクトの各種フィールドを使用します。ロードバランサーインフラストラクチャを設定するために Gateway コントローラーでよく使用される注釈を設定するには、Gateway オブジェクトの infrastructure
フィールドを使用します。Cilium の LoadBalancer IPAM を使用する場合(「サービスタイプ LoadBalancer」の例を参照)に、タイプ LoadBalancer の Service に使用する IP アドレスを設定するには、Gateway オブジェクトの addresses
フィールドを使用します。Gateway 設定の詳細については、「Kubernetes Gateway API specification
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: my-gateway spec: gatewayClassName: cilium infrastructure: annotations: service.beta.kubernetes.io/... service.kuberentes.io/... addresses: - type: IPAddress value: <LoadBalancer IP address> listeners: ...
Cilium と Kubernetes Gateway の仕様では、GatewayClass、Gateway、HTTPRoute、GRPCRoute、ReferenceGrant の各リソースがサポートされています。
-
これらのリソースの使用と設定方法については、以下の「Cilium Gateway をデプロイする」セクションの例とCilium のドキュメント
の例を参照してください。
Cilium Gateway をデプロイする
-
サンプルアプリケーションを作成します。以下の例では、Istio Bookinfo
サンプルマイクロサービスアプリケーションを使用しています。 kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
-
アプリケーションが正常に動作していることを確認します。
kubectl get pods
NAME READY STATUS RESTARTS AGE details-v1-766844796b-9965p 1/1 Running 0 81s productpage-v1-54bb874995-jmc8j 1/1 Running 0 80s ratings-v1-5dc79b6bcd-smzxz 1/1 Running 0 80s reviews-v1-598b896c9d-vj7gb 1/1 Running 0 80s reviews-v2-556d6457d-xbt8v 1/1 Running 0 80s reviews-v3-564544b4d6-cpmvq 1/1 Running 0 80s
-
次の内容で、
my-gateway.yaml
という名前のファイルを作成します。以下の例では、service.beta.kubernetes.io/aws-load-balancer-type: "external"
注釈を使用して、Cilium が Gateway リソース用にタイプ LoadBalancer の Service を作成する際に、レガシー AWS クラウドプロバイダーがその Service 用に Classic Load Balancer を作成しないようにしています。--- apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: my-gateway spec: gatewayClassName: cilium infrastructure: annotations: service.beta.kubernetes.io/aws-load-balancer-type: "external" listeners: - protocol: HTTP port: 80 name: web-gw allowedRoutes: namespaces: from: Same --- apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: http-app-1 spec: parentRefs: - name: my-gateway namespace: default rules: - matches: - path: type: PathPrefix value: /details backendRefs: - name: details port: 9080
-
クラスターに Gateway リソースを適用します。
kubectl apply -f my-gateway.yaml
-
Gateway リソースとその対応する Service が作成されたことを確認します。この段階では、Gateway リソースの
ADDRESS
フィールドに IP アドレスもホスト名も入力されておらず、Gateway リソースのタイプ LoadBalancer の Service にも同じく IP アドレスもホスト名も割り当てられていないはずです。kubectl get gateway my-gateway
NAME CLASS ADDRESS PROGRAMMED AGE my-gateway cilium True 10s
kubectl get svc cilium-gateway-my-gateway
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cilium-gateway-my-gateway LoadBalancer 172.16.227.247 <pending> 80:30912/TCP 24s
-
サービスタイプ LoadBalancer に進み、Cilium Load Balancer IPAM によって割り当てられた IP アドレスを使用するように Gateway リソースを設定します。さらに、サービスタイプ NodePort または ホストネットワーク に進み、NodePort またはホストネットワークアドレスを使用するように Gateway リソースを設定します。
Cilium Ingress をインストールする
考慮事項
-
Cilium では、以下の例に示すように、
nodePort.enabled
をtrue
に設定する必要があります。Cilium の kube-proxy 置換機能を使用している場合は、nodePort.enabled
をtrue
に設定する必要はありません。 -
Cilium では、以下の例に示すように、
envoy.enabled
をtrue
に設定する必要があります。 -
ingressController.loadbalancerMode
をdedicated
に設定した場合、Cilium は Ingress リソースごとに専用の Service を作成します。ingressController.loadbalancerMode
をshared
に設定した場合、Cilium はクラスター内のすべての Ingress リソースに対してタイプ LoadBalancer の共有 Service を作成します。shared
ロードバランサーモードを使用する場合、labels
、annotations
、type
、loadBalancerIP
などの共有 Service の設定を Helm 値のingressController.service
セクションで行います。詳細については、「Cilium Helm values reference」を参照してください。 -
ingressController.default
をtrue
に設定した場合、Cilium はクラスターのデフォルトの Ingress コントローラーとして設定され、ingressClassName
が Ingress リソースに指定されていない場合でも Ingress エントリを作成します。 -
Cilium Ingress は、ロードバランサー (デフォルト)、ノードポート、ホストネットワークモードのいずれかでデプロイできます。Cilium をホストネットワークモードでインストールすると、タイプ LoadBalancer の Service およびタイプ NodePort モードの Service が無効になります。詳細については「ホストネットワーク」を参照してください。
-
Helm 値では常に
ingressController.service.annotations
をservice.beta.kubernetes.io/aws-load-balancer-type: "external"
に設定します。これにより、レガシー AWS クラウドプロバイダーは、Cilium Helm チャートによって作成されたデフォルトの cilium-ingress
Service 用に Classic Load Balancer を作成しなくなります。
前提条件
-
コマンドライン環境に Helm がインストールされていること。「Setup Helm instructions」を参照してください。
-
「ハイブリッドノードの CNI を設定する」の手順に従って Cilium がインストールされていること。
手順
-
cilium-ingress-values.yaml
というファイルを次の内容で作成します。以下に、Cilium Ingress の設定例を示します。デフォルトのロードバランサーdedicated
モードを使用すること、および Envoy プロキシに個別のcilium-envoy
DaemonSet を使用してプロキシがハイブリッドノードでのみ動作することを設定しています。ingressController: enabled: true loadbalancerMode: dedicated service: annotations: service.beta.kubernetes.io/aws-load-balancer-type: "external" nodePort: enabled: true envoy: enabled: true affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: In values: - hybrid
-
Helm 値ファイルをクラスターに適用します。
helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \ --namespace kube-system \ --reuse-values \ --set operator.rollOutPods=true \ --values cilium-ingress-values.yaml
-
Cilium オペレーター、エージェント、Envoy ポッドが動作していることを確認します。
kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
NAME READY STATUS RESTARTS AGE cilium-envoy-5pgnd 1/1 Running 0 6m31s cilium-envoy-6fhg4 1/1 Running 0 6m30s cilium-envoy-jskrk 1/1 Running 0 6m30s cilium-envoy-k2xtb 1/1 Running 0 6m31s cilium-envoy-w5s9j 1/1 Running 0 6m31s cilium-grwlc 1/1 Running 0 4m12s cilium-operator-68f7766967-5nnbl 1/1 Running 0 4m20s cilium-operator-68f7766967-7spfz 1/1 Running 0 4m20s cilium-pnxcv 1/1 Running 0 6m29s cilium-r7qkj 1/1 Running 0 4m12s cilium-wxhfn 1/1 Running 0 4m1s cilium-z7hlb 1/1 Running 0 6m30s
Cilium Ingress を設定する
Cilium Ingress を Ingress オブジェクトで有効にするには、ingressClassName
を cilium
に設定します。Cilium が Ingress リソース用に作成した Service を設定するには、dedicated
ロードバランサーモードを使用している場合には Ingress オブジェクトを使用し、shared
ロードバランサーモードを使用している場合には Cilium/Helm 設定を使用します。こうした注釈は、Ingress コントローラーがロードバランサーインフラストラクチャを設定するときや、サービスタイプ、ロードバランサーモード、ポート、TLS パススルーといった Service のその他の属性を設定するときによく使用されます。以下に、主な注釈を示します。サポートされている注釈の完全なリストについては、Cilium のドキュメントの「Cilium Ingress annotations
注釈 | 説明 |
---|---|
|
|
|
|
|
|
|
Cilium LoadBalancer IPAM から割り当てる IP アドレスのリスト |
Cilium と Kubernetes Ingress の仕様は、Ingress パスのマッチングルールとして完全一致、プレフィックス一致、実装固有一致をサポートしています。Cilium は、実装固有マッチングルールとして正規表現をサポートしています。詳細については、Cilium のドキュメントの「Ingress path types and precedence
以下に、Cilium Ingress オブジェクトの例を示します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: service.beta.kuberentes.io/... service.kuberentes.io/... spec: ingressClassName: cilium rules: ...
Cilium Ingress をデプロイする
-
サンプルアプリケーションを作成します。以下の例では、Istio Bookinfo
サンプルマイクロサービスアプリケーションを使用しています。 kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
-
アプリケーションが正常に動作していることを確認します。
kubectl get pods
NAME READY STATUS RESTARTS AGE details-v1-766844796b-9965p 1/1 Running 0 81s productpage-v1-54bb874995-jmc8j 1/1 Running 0 80s ratings-v1-5dc79b6bcd-smzxz 1/1 Running 0 80s reviews-v1-598b896c9d-vj7gb 1/1 Running 0 80s reviews-v2-556d6457d-xbt8v 1/1 Running 0 80s reviews-v3-564544b4d6-cpmvq 1/1 Running 0 80s
-
次の内容で、
my-ingress.yaml
という名前のファイルを作成します。以下の例では、service.beta.kubernetes.io/aws-load-balancer-type: "external"
注釈を使用して、Cilium が Ingress リソース用にタイプ LoadBalancer の Service を作成する際に、レガシー AWS クラウドプロバイダーがその Service 用に Classic Load Balancer を作成しないようにしています。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress namespace: default annotations: service.beta.kubernetes.io/aws-load-balancer-type: "external" spec: ingressClassName: cilium rules: - http: paths: - backend: service: name: details port: number: 9080 path: /details pathType: Prefix
-
Ingress リソースをクラスターに適用します。
kubectl apply -f my-ingress.yaml
-
Ingress リソースおよびその対応する Service が作成されたことを確認します。この段階では、Ingress リソースの
ADDRESS
フィールドに IP アドレスもホスト名も入力されておらず、Ingress リソースのタイプ LoadBalancer の共有または専用 Service にも同じく IP アドレスもホスト名も割り当てられていないはずです。kubectl get ingress my-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress cilium * 80 8s
ロードバランサーモード
shared
の場合kubectl -n kube-system get svc cilium-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cilium-ingress LoadBalancer 172.16.217.48 <pending> 80:32359/TCP,443:31090/TCP 10m
ロードバランサーモード
dedicated
の場合kubectl -n default get svc cilium-ingress-my-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cilium-ingress-my-ingress LoadBalancer 172.16.193.15 <pending> 80:32088/TCP,443:30332/TCP 25s
-
サービスタイプ LoadBalancer に進み、Cilium Load Balancer IPAM によって割り当てられた IP アドレスを使用するように Ingress リソースを設定します。さらに、サービスタイプ NodePort または ホストネットワーク に進み、NodePort またはホストネットワークアドレスを使用するように Ingress リソースを設定します。
サービスタイプ LoadBalancer
既存のロードバランサーインフラストラクチャ
デフォルトでは、Cilium Ingress の場合も Cilium Gateway の場合も、Cilium は Ingress/Gateway リソース用にタイプ LoadBalancer の Kubernetes Service を作成します。Cilium が作成した Service の属性を設定するには、Ingress リソースと Gateway リソースを使用します。Ingress リソースまたは Gateway リソースを作成すると、Ingress または Gateway 用に外部公開された IP アドレスまたはホスト名がロードバランサーインフラストラクチャから割り当てられます。このインフラストラクチャは通常、Ingress コントローラーまたは Gateway コントローラーによってプロビジョニングされます。
Ingress コントローラーと Gateway コントローラーの多くが、ロードバランサーインフラストラクチャを検出および設定する際に注釈を使用します。Ingress コントローラーと Gateway コントローラーのこうした注釈は、上記の例に示すように、Ingress リソースまたは Gateway リソースに設定します。サポートされている注釈については、Ingress コントローラーまたは Gateway コントローラーのドキュメントを参照してください。また、よく使用されるコントローラーのリストについては、Kubernetes Ingress のドキュメント
重要
EKS Hybrid Nodes では、Cilium Ingress と Gateway を AWS Load Balancer Controller および AWS Network Load Balancer (NLB) と共に使用することはできません。これらを一緒に使用しようとすると、ターゲットが未登録になります。NLB の target-type
が ip
に設定されている場合 (EKS Hybrid Nodes で実行されるワークロードで NLB を使用するための要件)、NLB はタイプ LoadBalancer の Service を支援する Pod IP に直接接続しようとするためです。
ロードバランサーインフラストラクチャなし
環境にロードバランサーインフラストラクチャおよびその対応する Ingress/Gateway コントローラーがない場合、Ingress/Gateway リソースおよびその対応するタイプ LoadBalancer の Service を設定するには、Cilium の Load Balancer IP Address Management
以下の例では、Ingress/Gateway リソースに使用する IP アドレスと共に Cilium の LB IPAM を設定する方法と、オンプレミスネットワークで LoadBalancer IP アドレスをアドバタイズするように Cilium BGP コントロールプレーンを設定する方法を示します。Cilium の LB IPAM 機能は、デフォルトで有効になっていますが、CiliumLoadBalancerIPPool
リソースが作成されるまではアクティブ化されません。
前提条件
-
「Cilium Ingress をインストールする」または「Cilium Gateway をインストールする」の手順に従って Cilium Ingress または Gateway がインストールされていること。
-
「Cilium Ingress をデプロイする」または「Cilium Gateway をデプロイする」の手順に従って、Cilium Ingress リソースまたは Gateway リソースがサンプルアプリケーションと共にデプロイされていること。
-
「ハイブリッドノード向けに Cilium BGP を設定する」の手順に従って Cilium BGP コントロールプレーンを有効にしていること。BGP を使用しない場合にはこの前提条件をスキップできますが、Cilium LB IPAM によって割り当てられた LoadBalancer IP アドレスがオンプレミスネットワークでルーティング可能になるまで、Ingress リソースと Gateway リソースにアクセスできなくなります。
手順
-
必要に応じて、Ingress リソースまたは Gateway リソースにパッチを適用してタイプ LoadBalancer の Service に特定の IP アドレスを使用するようにリクエストしてください。特定の IP アドレスをリクエストしないと、Cilium は後続のステップで
CiliumLoadBalancerIPPool
リソースに設定する IP アドレス範囲から IP アドレスを割り当てます。以下のコマンドでは、LB_IP_ADDRESS
をタイプ LoadBalancer の Service 用にリクエストする IP アドレスに置き換えます。ゲートウェイ
kubectl patch gateway -n default my-gateway --type=merge -p '{ "spec": { "addresses": [{"type": "IPAddress", "value": "LB_IP_ADDRESS"}] } }'
Ingress
kubectl patch ingress my-ingress --type=merge -p '{ "metadata": {"annotations": {"lbipam.cilium.io/ips": "LB_IP_ADDRESS"}} }'
-
CiliumLoadBalancerIPPool
リソースを使用して Ingress/Gateway リソースの Load Balancer IP アドレス範囲を設定するファイルをcilium-lbip-pool-ingress.yaml
という名前で作成します。-
Cilium Ingress を使用している場合、Cilium は Ingress リソース用に作成する Service に
cilium.io/ingress: "true"
ラベルを自動的に適用します。CiliumLoadBalancerIPPool
リソース定義のserviceSelector
フィールドでこのラベルを使用すると、LB IPAM の対象となる Service を選択できます。 -
Cilium Gateway を使用している場合は、
CiliumLoadBalancerIPPool
リソース定義のserviceSelector
フィールドでgateway.networking.k8s.io/gateway-name
ラベルを使用して、LB IPAM の対象となる Gateway リソースを選択できます。 -
LB_IP_CIDR
を Load Balancer の IP アドレスに使用する IP アドレス範囲に置き換えます。単一の IP アドレスを選択するには、/32
CIDR を使用します。詳細については、Cilium のドキュメントの「LoadBalancer IP Address Management」を参照してください。 apiVersion: cilium.io/v2alpha1 kind: CiliumLoadBalancerIPPool metadata: name: bookinfo-pool spec: blocks: - cidr: "LB_IP_CIDR" serviceSelector: # if using Cilium Gateway matchExpressions: - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] } # if using Cilium Ingress matchLabels: cilium.io/ingress: "true"
-
-
CiliumLoadBalancerIPPool
リソースをクラスターに適用します。kubectl apply -f cilium-lbip-pool-ingress.yaml
-
Ingress/Gateway リソースの IP アドレスが Cilium LB IPAM から割り当てられたことを確認します。
ゲートウェイ
kubectl get gateway my-gateway
NAME CLASS ADDRESS PROGRAMMED AGE my-gateway cilium
LB_IP_ADDRESS
True 6m41sIngress
kubectl get ingress my-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress cilium *
LB_IP_ADDRESS
80 10m -
CiliumBGPAdvertisement
リソースを使用して Ingress/Gateway リソースの LoadBalancer IP アドレスをアドバタイズするファイルをcilium-bgp-advertisement-ingress.yaml
という名前で作成します。Cilium BGP を使用していない場合は、このステップをスキップできます。Ingress/Gateway リソースに使用する LoadBalancer IP アドレスは、次のステップでサービスをクエリできるように、オンプレミスネットワークでルーティング可能である必要があります。apiVersion: cilium.io/v2alpha1 kind: CiliumBGPAdvertisement metadata: name: bgp-advertisement-lb-ip labels: advertise: bgp spec: advertisements: - advertisementType: "Service" service: addresses: - LoadBalancerIP selector: # if using Cilium Gateway matchExpressions: - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] } # if using Cilium Ingress matchLabels: cilium.io/ingress: "true"
-
CiliumBGPAdvertisement
リソースをクラスターに適用します。kubectl apply -f cilium-bgp-advertisement-ingress.yaml
-
Cilium LB IPAM から割り当てられた IP アドレスを使用して、サービスにアクセスします。
curl -s http://
LB_IP_ADDRESS
:80/details/1 | jq{ "id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890" }
サービスタイプ NodePort
環境にロードバランサーインフラストラクチャおよびその対応する Ingress コントローラーがない場合、ロードバランサーインフラストラクチャを自己管理している場合、または DNS ベースのロードバランシングを使用している場合は、Ingress リソース用にタイプ NodePort の Service を作成するように Cilium Ingress を設定できます。Cilium Ingress と共に NodePort を使用する場合、タイプ NodePort の Service は各ノード上でポート範囲 30000~32767 のポートに公開されます。このモードでは、トラフィックは NodePort 上のクラスター内にあるノードに到達すると、サービスを支援するポッドに転送されます。このポッドは、同じノードにあることもあれば、別のノードにあることもあります。
注記
Cilium Gateway による NodePort サービスのサポートは、Cilium バージョン 1.18.x (#27273
前提条件
-
「Cilium Ingress をインストールする」の手順に従って Cilium Ingress がインストールされていること。
-
「Cilium Ingress をデプロイする」の手順に従って、Cilium Ingress リソースがサンプルアプリケーションと共にデプロイされていること。
手順
-
既存の Ingress リソース
my-ingress
にパッチを適用して、そのリソースをタイプ LoadBalancer の Service から NodePort に変更します。kubectl patch ingress my-ingress --type=merge -p '{ "metadata": {"annotations": {"ingress.cilium.io/service-type": "NodePort"}} }'
Ingress リソースをまだ作成していない場合は、次の Ingress 定義をクラスターに適用することで作成できます。以下の Ingress 定義では、「Cilium Ingress をデプロイする」で説明されている Istio Bookinfo サンプルアプリケーションを使用していることに注意してください。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress namespace: default annotations: service.beta.kubernetes.io/aws-load-balancer-type: "external" "ingress.cilium.io/service-type": "NodePort" spec: ingressClassName: cilium rules: - http: paths: - backend: service: name: details port: number: 9080 path: /details pathType: Prefix
-
Ingress リソース用の Service が、タイプ NodePort の Service を使用するように更新されたことを確認します。出力にある HTTP プロトコルのポートを書き留めます。以下の例では
32353
がこの HTTP ポートであり、後続のステップではこのポートを使用して Service をクエリします。タイプ NodePort の Service と共に Cilium Ingress を使用する利点は、パスとホストベースのルーティングを適用できるだけでなく、Ingress トラフィック用のネットワークポリシーも適用できることです。これは、Ingress のないタイプ NodePort の標準の Service ではできないことです。kubectl -n default get svc cilium-ingress-my-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cilium-ingress-my-ingress NodePort 172.16.47.153 <none> 80:32353/TCP,443:30253/TCP 27m
-
クラスター内のノードの IP アドレスを取得します。
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME mi-026d6a261e355fba7 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.150 <none> Ubuntu 22.04.5 LTS 5.15.0-142-generic containerd://1.7.27 mi-082f73826a163626e Ready <none> 23h v1.32.3-eks-473151a 10.80.146.32 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-09183e8a3d755abf6 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.33 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0d78d815980ed202d Ready <none> 23h v1.32.3-eks-473151a 10.80.146.97 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0daa253999fe92daa Ready <none> 23h v1.32.3-eks-473151a 10.80.146.100 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27
-
ノードの IP アドレスと上記でキャプチャした NodePort を使用して、タイプ NodePort の Service にアクセスします。以下の例では、使用されるノード IP アドレスは
10.80.146.32
で、NodePort は32353
です。これらをお使いの環境の値で置き換えます。curl -s http://10.80.146.32:32353/details/1 | jq
{ "id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890" }
ホストネットワーク
タイプ NodePort の Service と同様に、ロードバランサーインフラストラクチャと Ingress または Gateway コントローラーがない場合や、外部ロードバランサーでロードバランシングを自己管理している場合は、ホストネットワークに Ingress リソースと Gateway リソースを直接公開するように Cilium Ingress および Cilium Gateway を設定できます。ホストネットワークモードが Ingress リソースまたは Gateway リソースに対して有効になっている場合、タイプ LoadBalancer の Service とタイプ NodePort モードの Service は自動的に無効になり、ホストネットワークモードは Ingress リソースまたは Gateway リソースごとにこれらの代替モードと相互に排他的になります。タイプ NodePort モードの Service と比較して、ホストネットワークモードは使用できるポート範囲の柔軟性が高く (NodePort の 30000~32767 という範囲に制限されません)、ホストネットワーク上で Envoy プロキシが動作するノードのサブセットを設定できます。
前提条件
-
「Cilium Ingress をインストールする」または「Cilium Gateway をインストールする」の手順に従って Cilium Ingress または Gateway がインストールされていること。
手順
ゲートウェイ
-
cilium-gateway-host-network.yaml
という名前のファイルを作成し、次の内容を記述します。gatewayAPI: enabled: true hostNetwork: enabled: true # uncomment to restrict nodes where Envoy proxies run on the host network # nodes: # matchLabels: # role: gateway
-
クラスターにホストネットワーク Cilium Gateway 設定を適用します。
helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \ --namespace kube-system \ --reuse-values \ --set operator.rollOutPods=true \ -f cilium-gateway-host-network.yaml
Gateway リソースをまだ作成していない場合は、次の Gateway 定義をクラスターに適用することで作成できます。以下の Gateway 定義では、「Cilium Gateway をデプロイする」で説明されている Istio Bookinfo サンプルアプリケーションを使用しています。以下の例では、Gateway リソースは HTTP リスナーに
8111
ポートを使用するように設定されています。ホストネットワークで動作する Envoy プロキシの共有リスナーポートです。Gateway リソースに特権ポート (1023 未満) を使用する場合は、その手順を Cilium のドキュメントで確認してください。 --- apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: my-gateway spec: gatewayClassName: cilium listeners: - protocol: HTTP port: 8111 name: web-gw allowedRoutes: namespaces: from: Same --- apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: http-app-1 spec: parentRefs: - name: my-gateway namespace: default rules: - matches: - path: type: PathPrefix value: /details backendRefs: - name: details port: 9080
適用した Cilium Envoy 設定を確認するには、次のコマンドを使用します。
kubectl get cec cilium-gateway-my-gateway -o yaml
cilium-gateway-my-gateway
Service の Envoy リスナーポートを取得するには、次のコマンドを使用します。この例では、8111
が共有リスナーポートです。kubectl get cec cilium-gateway-my-gateway -o jsonpath={.spec.services[0].ports[0]}
-
クラスター内のノードの IP アドレスを取得します。
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME mi-026d6a261e355fba7 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.150 <none> Ubuntu 22.04.5 LTS 5.15.0-142-generic containerd://1.7.27 mi-082f73826a163626e Ready <none> 23h v1.32.3-eks-473151a 10.80.146.32 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-09183e8a3d755abf6 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.33 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0d78d815980ed202d Ready <none> 23h v1.32.3-eks-473151a 10.80.146.97 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0daa253999fe92daa Ready <none> 23h v1.32.3-eks-473151a 10.80.146.100 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27
-
ノードの IP アドレスと
cilium-gateway-my-gateway
リソースのリスナーポートを使用して、Service にアクセスします。以下の例では、使用されるノード IP アドレスは10.80.146.32
であり、リスナーポートは8111
です。これらをお使いの環境の値で置き換えます。curl -s http://10.80.146.32:8111/details/1 | jq
{ "id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890" }
Ingress
アップストリームの Cilium の問題 (#34028loadbalancerMode: shared
を使用する必要があります。これにより、クラスター内のすべての Ingress リソースに対してタイプ ClusterIP の Service が 1 つだけ作成されます。Ingress リソースに特権ポート (1023 未満) を使用する場合は、その手順を Cilium のドキュメント
-
cilium-ingress-host-network.yaml
という名前のファイルを作成し、次の内容を記述します。ingressController: enabled: true loadbalancerMode: shared # This is a workaround for the upstream Cilium issue service: externalTrafficPolicy: null type: ClusterIP hostNetwork: enabled: true # ensure the port does not conflict with other services on the node sharedListenerPort: 8111 # uncomment to restrict nodes where Envoy proxies run on the host network # nodes: # matchLabels: # role: ingress
-
クラスターにホストネットワーク Cilium Ingress 設定を適用します。
helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \ --namespace kube-system \ --reuse-values \ --set operator.rollOutPods=true \ -f cilium-ingress-host-network.yaml
Ingress リソースをまだ作成していない場合は、次の Ingress 定義をクラスターに適用することで作成できます。以下の Ingress 定義では、「Cilium Ingress をデプロイする」で説明されている Istio Bookinfo サンプルアプリケーションを使用しています。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress namespace: default spec: ingressClassName: cilium rules: - http: paths: - backend: service: name: details port: number: 9080 path: /details pathType: Prefix
適用した Cilium Envoy 設定を確認するには、次のコマンドを使用します。
kubectl get cec -n kube-system cilium-ingress -o yaml
cilium-ingress
Service の Envoy リスナーポートを取得するには、次のコマンドを使用します。この例では、8111
が共有リスナーポートです。kubectl get cec -n kube-system cilium-ingress -o jsonpath={.spec.services[0].ports[0]}
-
クラスター内のノードの IP アドレスを取得します。
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME mi-026d6a261e355fba7 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.150 <none> Ubuntu 22.04.5 LTS 5.15.0-142-generic containerd://1.7.27 mi-082f73826a163626e Ready <none> 23h v1.32.3-eks-473151a 10.80.146.32 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-09183e8a3d755abf6 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.33 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0d78d815980ed202d Ready <none> 23h v1.32.3-eks-473151a 10.80.146.97 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0daa253999fe92daa Ready <none> 23h v1.32.3-eks-473151a 10.80.146.100 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27
-
ノードの IP アドレスと
cilium-ingress
リソースのsharedListenerPort
を使用して、Service にアクセスします。以下の例では、使用されるノード IP アドレスは10.80.146.32
であり、リスナーポートは8111
です。これらをお使いの環境の値で置き換えます。curl -s http://10.80.146.32:8111/details/1 | jq
{ "id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890" }