Anthos clusters on AWS(GKE on AWS)の新しいバージョンが 2 月 25 日にリリースされました。詳細については、リリースノートをご覧ください。

アプリケーション ロードバランサ(ALB)の作成

このトピックでは、Anthos clusters on AWS(GKE on AWS)で AWS のアプリケーション ロードバランサ(ALB)を設定する方法について説明します。

始める前に

AWS 上の Anthos クラスタの使用を始める前に、次のことを確認してください。

  • ロードバランサの AWS IAM ユーザーを作成する権限がある。
  • 管理サービスをインストールしている。
  • ユーザー クラスタを作成している。
  • anthos-aws ディレクトリから anthos-gke を使用して、コンテキストをユーザー クラスタに切り替えます。
    cd anthos-aws
    env HTTP_PROXY=http://localhost:8118 \
    anthos-gke aws clusters get-credentials CLUSTER_NAME
  • curl コマンドライン ツールまたは同様のツールをインストールします。
  • ALB の 2 つ以上のアベイラビリティ ゾーンにまたがるサブネットを作成または選択している。

Anthos clusters on AWS で ALB を設定する

ALB を作成する前に、AWS IAM 権限を設定し、アクセスキーを指定して、Anthos clusters on AWS を構成します。

AWS IAM 権限の作成

ユーザー クラスタ用の ALB を作成するには、ALB を作成および運用するための権限を持つ AWS IAM ユーザーを設定する必要があります。

  1. ALB Ingress コントローラの IAM ポリシーをダウンロードします。ポリシーは GitHub で確認できます。

    curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/iam-policy.json
    
  2. aws ツールを使用して、ダウンロードしたポリシーから ALBIngressControllerIAMPolicy という名前の IAM ポリシーを作成します。

    aws iam create-policy \
      --policy-name ALBIngressControllerIAMPolicy \
      --policy-document file://iam-policy.json
    

    レスポンスに、IAM ポリシーの Amazon リソース名(ARN)が含まれます。後で使用するために ARN を保存します。

  3. aws ツールを使用して、ALB Ingress コントローラの IAM ユーザーを作成します。

    aws iam create-user \
    --user-name ALB_CONTROLLER_USER_NAME
    

    ALB_CONTROLLER_USER_NAME は、ALB Ingress コントローラ用に作成するユーザー名に置き換えます。

  4. ユーザー名に ALBIngressControllerIAMPolicy をアタッチします。

    aws iam attach-user-policy \
     --user-name ALB_CONTROLLER_USER_NAME \
     --policy-arn ALB_IAM_POLICY_ARN
    

    以下のように置き換えます。

    • ALB_CONTROLLER_USER_NAME は、ALB Ingress コントローラ用に作成するユーザー名に置き換えます。
    • ALB_IAM_POLICY_ARN は、上記で作成した IAM ポリシーの ARN に置き換えます。
  5. ALB Ingress コントローラ ユーザーの AWS IAM アクセスキーを作成します。

    aws iam create-access-key --user-name ALB_CONTROLLER_USER_NAME
    

    ALB_CONTROLLER_USER_NAME は、ALB Ingress コントローラ用に作成するユーザー名に置き換えます。

    aws コマンドライン ツールがアクセスキーの詳細を出力します。

    {
      "AccessKey": {
        "UserName": ALB_CONTROLLER_USER_NAME
        "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "Status": "Active",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "CreateDate": "2020-07-23T17:53:58Z"
      }
    }
    
  6. アクセスキーとシークレット アクセスキーを環境変数に保存します。これらを使用して、ユーザー クラスタを構成します。

    ALB_ACCESS_KEY_ID=ACCESS_KEY_ID
    ALB_SECRET_ACCESS_KEY=SECRET_ACCESS_KEY
    

Anthos clusters on AWS を構成する

ALB を構成するには、AWS IAM 認証情報を Kubernetes Secret として保存します。

  1. アクセスキーとシークレット アクセスキーのペアを使用して Secret を作成します。ALB Ingress コントローラは、この Secret を使用して AWS への認証と ALB の管理を行います。

    env HTTP_PROXY=http://localhost:8118 \
    kubectl create secret generic alb-ingress-controller-creds \
      -n kube-system \
      --from-literal=access_key_id=$ALB_ACCESS_KEY_ID \
      --from-literal=secret_access_key=$ALB_SECRET_ACCESS_KEY
    

ALB Ingress コントローラをデプロイする

  1. 次の YAML を aws-alb-ingress-controller.yaml というファイルにコピーします。

    # Original from GitHub: https://github.com/kubernetes-sigs/aws-alb-ingress-controller
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app.kubernetes.io/name: alb-ingress-controller
      name: alb-ingress-controller
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: alb-ingress-controller
      template:
        metadata:
          labels:
            app.kubernetes.io/name: alb-ingress-controller
        spec:
          containers:
            - name: alb-ingress-controller
              args:
                - --ingress-class=alb
                - --cluster-name=CLUSTER_ID
                - --aws-vpc-id=AWS_VPC_ID
                - --aws-region=AWS_REGION
    
              env:
              - name: AWS_ACCESS_KEY_ID
                valueFrom:
                  secretKeyRef:
                    name: alb-ingress-controller-creds
                    key: access_key_id
              - name: AWS_SECRET_ACCESS_KEY
                valueFrom:
                  secretKeyRef:
                    name: alb-ingress-controller-creds
                    key: secret_access_key
              image: docker.io/amazon/aws-alb-ingress-controller:v1.1.8
          serviceAccountName: alb-ingress-controller
    ---
    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
          - pods/status
        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
    

    以下を置き換えます。

    • CLUSTER_ID は、ユーザー クラスタの名前に置き換えます。例: gke-abcdef12

    • AWS_VPC_ID は、AWS VPC の ID に置き換えます。例: vpc-1234567890abc

    • AWS_REGION は、ユーザー クラスタの AWS リージョンに置き換えます。例: us-east-1

    この構成の詳細については、aws-alb-ingress-controller GitHub リポジトリの alb-ingress-controller マニフェストをご覧ください。

  2. マニフェストをクラスタに適用します。

    env HTTP_PROXY=http://localhost:8118 \
      kubectl apply -f aws-alb-ingress-controller.yaml
    

ALB の作成

このセクションでは、ゲーム 2048 のリメイクを提供する ALB を作成します。

  1. 次の YAML 構成を 2048.yaml というファイルにコピーします。この構成により、Kubernetes の Namespace、Service、Deployment が作成されます。Deployment は Ingress を使用して公開されます。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: "2048-game"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: "service-2048"
      namespace: "2048-game"
    spec:
      ports:
        - port: 80
          targetPort: 80
          protocol: TCP
      type: NodePort
      selector:
        app: "2048"
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: "2048-deployment"
      namespace: "2048-game"
    spec:
      selector:
        matchLabels:
          app: "2048"
      replicas: 5
      template:
        metadata:
          labels:
            app: "2048"
        spec:
          containers:
          - image: alexwhen/docker-2048
            imagePullPolicy: Always
            name: "2048"
            ports:
            - containerPort: 80
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: "2048-ingress"
      namespace: "2048-game"
      annotations:
        kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/scheme: internet-facing
      labels:
        app: 2048-ingress
    spec:
      rules:
        - http:
            paths:
              - path: /*
                backend:
                  serviceName: "service-2048"
                  servicePort: 80
    
  2. kubectl を使用して、クラスタに構成を適用します。

    env HTTP_PROXY=http://localhost:8118 \
    kubectl apply -f 2048.yaml
    
  3. kubectl を使用して Ingress リソースのステータスを確認します。

    env HTTP_PROXY=http://localhost:8118 \
    kubectl get ingress -n 2048-game 2048-ingress
    

    Ingress のステータスが表示されます。ADDRESS 列には Ingress のエンドポイントが含まれます。

    NAME           HOSTS   ADDRESS                                                             PORTS   AGE
    2048-ingress   *       123456-2048game-2048ingr-6fa0-abcdefg.us-east-1.elb.amazonaws.com   80      2m19s
    
  4. ブラウザで ALB エンドポイントに移動します(例: http://123456-2048game-2048ingr-6fa0-abcdefg.us-east-1.elb.amazonaws.com)。ゲーム 2048 が表示されます。