はじめに
SREチームの須恵です。
前回の記事ですこし言及しましたが、今回は続編としてALB Ingress Controllerについて書こうと思います。
これは何?
Amazon EKSでIngressリソースを機能させるために使えるIngress Controllerの一種です。Ingressを作成すると、自動的にALBが作成・設定されます。
Ingressって何?
公式ドキュメントから引用します。
Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.
Ingressは、クラスター外からクラスター内のサービスへのHTTPおよびHTTPSルートを公開します。トラフィックルーティングは、Ingressリソースで定義されたルールにより制御されます。
Ingress Controllerって何?
An Ingress controller is responsible for fulfilling the Ingress, usually with a load balancer, though it may also configure your edge router or additional frontends to help handle the traffic.
Ingress controllerはIngressを満たす責任を持ちます。通常はロードバランサーを使いますが、トラフィックを処理するためにエッジルーターや追加のフロントエンドを設定することもできます。
ここからは実際の使い方を紹介します。
IAMポリシー作成
後述のロールにアタッチするためのポリシーを作成します。
サンプルがあるので、とりあえず使い始めてみるときはこれを使わせてもらうとよいと思います。
※リンク先はバージョン1.1.2のサンプルです。使用するコントローラのバージョンとの差異に注意してください。
IAMロール作成
ALB Ingress Controllerに使用させるロールを作成します。
ここで、まずPodに任意のロールを使用させられる環境が必要となります。 手前味噌ですが、以前書いたこちらが参考になると思います。
kube2iamの仕組みと使い方 - Oct Tech Blog
ロールのアクセス権限に関しては先ほどのポリシーをアタッチするだけですが、加えて信頼関係の編集が必要です。以下を追加します。
{ "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/kubernetes-worker-role" }, "Action": "sts:AssumeRole" }
"AWS": "arn:aws:iam::123456789012:role/kubernetes-worker-role"
の部分は、使用するワーカーノードに合わせてください。
RBAC用リソース作成
ClusterRole, ServiceAcocunt, 両者を結びつけるClusterRoleBindingを作成します。
サンプル通りで構いません(例によってバージョンには注意、リンク先は1.1.2用)。
--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: app.kubernetes.io/name: alb-ingress-controller name: alb-ingress-controller rules: - apiGroups: - "" - extensions resources: - configmaps - endpoints - events - ingresses - ingresses/status - services verbs: - create - get - list - update - watch - patch - apiGroups: - "" - extensions resources: - nodes - pods - secrets - services - namespaces verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: app.kubernetes.io/name: alb-ingress-controller name: alb-ingress-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: alb-ingress-controller subjects: - kind: ServiceAccount name: alb-ingress-controller namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/name: alb-ingress-controller name: alb-ingress-controller namespace: kube-system ...
Deployment作成
コントローラをクラスターで動作させるためのDeploymentを作成します。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: alb-ingress-controller name: alb-ingress-controller namespace: kube-system spec: replicas: 1 selector: matchLabels: app: alb-ingress-controller strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 type: RollingUpdate template: metadata: annotations: iam.amazonaws.com/role: さっき作ったロールのARN creationTimestamp: null labels: app: alb-ingress-controller spec: containers: - args: - --ingress-class=alb - --cluster-name=クラスターの名前 - --aws-vpc-id=クラスターVPCのID - --aws-region=クラスターのリージョン - --aws-api-debug image: docker.io/amazon/aws-alb-ingress-controller:v1.1.2 imagePullPolicy: Always name: server resources: {} terminationMessagePath: /dev/termination-log dnsPolicy: ClusterFirst restartPolicy: Always securityContext: {} terminationGracePeriodSeconds: 30 serviceAccountName: alb-ingress-controller serviceAccount: alb-ingress-controller
docker.io/amazon/aws-alb-ingress-controller:v1.1.2
ここは適宜必要なバージョンを指定してください。
PodがAPIサーバーにアクセスする際、先ほど作成したサービスアカウントalb-ingress-controller
を使用するように設定しています。また、アノテーションでは同じく先ほど作成したロールを指定しています。
コントローラは以下の権限でリソースにアクセスを行います。
- Kubernetesリソースへのアクセスは先ほどのClusterRole
- AWSリソースへのアクセスは先ほどのIAMポリシー
Deploymentの作成が完了し、Ingress Controllerが動き出したので、Ingressを作成することによりALBを自動設定してアプリケーションへルーティングする準備ができました。
ここからは、簡単な例でアプリケーションへのルーティング方法を紹介します。
ルーティング先アプリケーションの例
重要なのは、タイプをNodePortにするという点です。ALB Ingress Controllerを使用する場合、ServiceはNodePortタイプで作成しましょう。
apiVersion: v1 kind: Service metadata: name: hoge-app spec: selector: app: hoge-app ports: - name: http port: 3000 protocol: TCP targetPort: 3000 type: NodePort
DeploymentやPodのYAMLは割愛しますが、上記の例ではselector
をapp: hoge-app
としているので、そのようなラベルが付いている必要があります。
Ingressの作成
下記の例では、80番と443番ポートにリスナーを作成し、80番へのリクエストは443番にリダイレクトするようなルールのALBが作成されます。
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress ←複数立てる予定なら区別しやすい名前を付ける annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/subnets: クラスターのサブネットID3つをカンマ区切りで書く # HTTPSリスナーを使うなら必要 alb.ingress.kubernetes.io/certificate-arn: 証明書のARN # リスナーのポート番号はここで決める alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' # リダイレクトを使うなら必要 alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}' spec: # ALBのリスナールールと対応 rules: - host: hogeapp.hoge.com http: paths: - path: /* backend: serviceName: ssl-redirect servicePort: use-annotation - path: /* backend: serviceName: hoge-app servicePort: 3000
アプリケーションがインターネットに公開され、ブラウザからアクセスできるようになりました。
おわりに
ALB Ingress Controllerを使ってEKS上のアプリケーションへルーティングする方法についてご紹介しました。
採用サイトにて、テクノロジースタックや環境について公開しています。Kubernetesに限らず、ご興味をお持ちいただいた皆様のご応募をお待ちしております。