Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

第43章 AWS でのクラスターの自動スケーラーの設定

Amazon Web Services (AWS) の OpenShift Container Platform クラスターで自動スケーラーを設定すると、アプリケーションのワークロードに対して弾力性を確保できます。自動スケーラーは Pod の実行にあたって十分な数のノードがアクティブであり、アクティブなノードの数が現在のデマンドに対応することを確認します。

注記

自動スケーラーは AWS でのみ実行できます。

43.1. OpenShift Container Platform 自動スケーラーについて

OpenShift Container Platform の自動スケーラーは、ノードの割り当てを保留にしている Pod 数を確認するために繰り返しチェックを実行します。Pod が割り当てを保留にしていて、自動スケーラーがその最大容量を達していない場合、現在の需要に対応するために新規ノードが継続的にプロビジョニングされます。需要が下がり、必要なノードが少なくなると、自動スケーラーは使用されていないノードを削除します。自動スケーラーをインストールした後に、その動作は自動化されます。そのため、必要な数のレプリカをデプロイメントに追加することのみが必要になります。

OpenShift Container Platform バージョン 3.11 では、自動スケーラーを Amazon Web Services (AWS) のみにデプロイできます。自動スケーラーは、自動スケーリンググループおよび起動設定などの一部の標準的な AWS オブジェクトを使用してクラスターのサイズを管理します。

自動スケーラーは以下のアセットを使用します。

自動スケーリンググループ
自動スケーリンググループはマシンセットの論理表現です。自動スケーリンググループは、実行する最小数のインスタンス、実行可能な最大数のインスタンスおよび、実行する必要のあるインスタンス数で設定します。必要な容量に対応するのに必要な数のインスタンスを起動すると、自動スケーリンググループが起動します。自動スケーリンググループは、インスタンスがゼロの状態で起動するように設定できます。
起動設定

起動設定は、インスタンスを起動するために自動スケーリングが使用するテンプレートです。起動設定を作成する際に、以下のような情報を指定します。

  • ベースイメージを使用するための Amazon Machine Image (AMI) の ID
  • m4.large などのインスタンスタイプ
  • キーペア
  • 1 つ以上のセキュリティーグループ
  • 起動設定を適用するサブネット
OpenShift Container Platform Primed イメージ
自動スケーリンググループが新規インスタンスのプロビジョニングを実行する場合、それが起動するイメージに OpenShift Container Platform が準備されている必要があります。自動スケーリンググループはこのイメージを使用して、手動の介入なしにノードのブートストラップおよびクラスター内での登録を自動的に実行します。

43.2. Primed イメージの作成

自動スケーラーが使用する Primed イメージを自動的に作成するように Ansible Playbook を使用できます。既存の Amazon Web Services (AWS) クラスターの属性を指定する必要があります。

注記

すでに Primed イメージがある場合、新規のイメージを作成せずにこれを使用できます。

手順

OpenShift Container Platform クラスターを作成するために使用したホストで、Primed イメージを作成します。

  1. ローカルホストに新しい Ansible インベントリーファイルを作成します。このファイルには、参加するノードで自動スケーリングを有効にするために cloudprovider フラグを割り当てる変数が必要です。これらの変数がないと、build_ami.yml Playbook はopenshift_cloud_provider ロールを使用できません。

    [OSEv3:children]
    masters
    nodes
    etcd
    
    [OSEv3:vars]
    openshift_deployment_type=openshift-enterprise
    ansible_ssh_user=ec2-user
    openshift_clusterid=mycluster
    ansible_become=yes
    openshift_cloudprovider_kind=aws 1
    openshift_cloudprovider_aws_access_key=<aws_access_key> 2
    openshift_cloudprovider_aws_secret_key=<aws_secret_key> 3
    
    [masters]
    [etcd]
    [nodes]
    1
    クラウドプロバイダーのタイプを指定します。
    2
    クラウドプロバイダーの Identity and Access Management (IAM) アクセスキーを提供します。
    3
    クラウドが提供する IAM シークレットキーを提供します。
  2. ローカルホストにプロビジョニングファイル build-ami-provisioning-vars.yaml を作成します。

    openshift_deployment_type: openshift-enterprise
    
    openshift_aws_clusterid: mycluster 1
    
    openshift_aws_region: us-east-1 2
    
    openshift_aws_create_vpc: false 3
    
    openshift_aws_vpc_name: production 4
    
    openshift_aws_subnet_az: us-east-1d 5
    
    openshift_aws_create_security_groups: false 6
    
    openshift_aws_ssh_key_name: production-ssh-key 7
    
    openshift_aws_base_ami: ami-12345678 8
    
    openshift_aws_create_s3: False 9
    
    openshift_aws_build_ami_group: default 10
    
    openshift_aws_vpc: 11
      name: "{{ openshift_aws_vpc_name }}"
      cidr: 172.18.0.0/16
      subnets:
        us-east-1:
        - cidr: 172.18.0.0/20
          az: "us-east-1d"
    
    container_runtime_docker_storage_type: overlay2 12
    container_runtime_docker_storage_setup_device: /dev/xvdb 13
    
    # atomic-openshift-node service requires gquota to be set on the
    # filesystem that hosts /var/lib/origin/openshift.local.volumes (OCP
    # emptydir). Often is it not ideal or cost effective to deploy a vol
    # for emptydir. This pushes emptydir up to the / filesystem. Base ami
    # often does not ship with gquota enabled for /. Set this bool true to
    # enable gquota on / filesystem when using Red Hat Cloud Access RHEL7
    # AMI or Amazon Market RHEL7 AMI.
    openshift_aws_ami_build_set_gquota_on_slashfs: true 14
    
    rhsub_user: user@example.com 15
    rhsub_pass: password 16
    rhsub_pool: pool-id 17
    1
    既存クラスターの名前を指定します。
    2
    既存クラスターが現在実行されているリージョンを指定します。
    3
    False を指定して VPC の作成を無効にします。
    4
    クラスターが実行されている既存の VPC 名を指定します。
    5
    既存のクラスターが実行されているサブネットの名前を指定します。
    6
    セキュリティーグループの作成を無効にするために False を指定します。
    7
    SSH アクセスに使用する AWS キー名を指定します。
    8
    Primed イメージのベースイメージとして使用する AMI イメージ ID を指定します。Red Hat® Cloud Access を参照してください。
    9
    S3 バケットの作成を無効にするために False を指定します。
    10
    セキュリティーグループ名を指定します。
    11
    既存クラスターが実行されている VPC サブネットを指定します。
    12
    overlay2 を Docker ストレージタイプとして指定します。
    13
    LVM および /var/lib/docker ディレクトリーのマウントポイントを指定します。
    14
    Red Hat Cloud を使用する場合、このパラメーターの値を true に設定して、ファイルシステムで gquota を有効にします。
    15
    アクティブな OpenShift Container Platform サブスクリプションのある Red Hat アカウントのメールアドレスを指定します。
    16
    Red Hat アカウントのパスワードを指定します。
    17
    OpenShift Container Platform サブスクリプションのプール ID を指定します。クラスター作成時に使用したのと同じプール ID を使用できます。
  3. build_ami.yml Paybook を実行して Primed イメージを生成します。

    # ansible-playbook -i </path/to/inventory/file> \
        /usr/openshift-ansible/playbooks/aws/openshift-cluster/build_ami.yml \
        -e @build-ami-provisioning-vars.yaml

    Playbook の実行後に、新規のイメージ ID または AMI が出力に表示されます。起動設定の作成時に生成した AMI を指定します。

43.3. 起動設定および自動スケーリンググループの作成

クラスターの自動スケーラーをデプロイする前に、Primed イメージを参照する Amazon Web Services (AWS) 起動設定および自動スケーリンググループを作成する必要があります。新規ノードが起動時に既存クラスターに自動的に参加するように起動設定を設定する必要があります。

前提条件

  • AWS に OpenShift Container Platform クラスターをインストールします。
  • Primed イメージを作成します。
  • EFK スタックをクラスターにデプロイしている場合は、ノードラベルを logging-infra-fluentd=true に設定します。

手順

  1. bootstrap.kubeconfig ファイルをマスターノードから生成し、これを作成します。

    $ ssh master "sudo oc serviceaccounts create-kubeconfig -n openshift-infra node-bootstrapper" > ~/bootstrap.kubeconfig
  2. user-data.txt cloud-init ファイルを bootstrap.kubeconfig ファイルから作成します。

    $ cat <<EOF > user-data.txt
    #cloud-config
    write_files:
    - path: /root/openshift_bootstrap/openshift_settings.yaml
      owner: 'root:root'
      permissions: '0640'
      content: |
        openshift_node_config_name: node-config-compute
    - path: /etc/origin/node/bootstrap.kubeconfig
      owner: 'root:root'
      permissions: '0640'
      encoding: b64
      content: |
        $(base64 ~/bootstrap.kubeconfig | sed '2,$s/^/    /')
    
    runcmd:
    - [ ansible-playbook, /root/openshift_bootstrap/bootstrap.yml]
    - [ systemctl, restart, systemd-hostnamed]
    - [ systemctl, restart, NetworkManager]
    - [ systemctl, enable, atomic-openshift-node]
    - [ systemctl, start, atomic-openshift-node]
    EOF
  3. 起動設定テンプレートを AWS S3 バケットにアップロードします。
  4. AWS CLI を使用して起動設定を作成します。

    $ aws autoscaling create-launch-configuration \
        --launch-configuration-name mycluster-LC \ 1
        --region us-east-1 \ 2
        --image-id ami-987654321 \ 3
        --instance-type m4.large \ 4
        --security-groups sg-12345678 \ 5
        --template-url https://s3-.amazonaws.com/.../yourtemplate.json \  6
        --key-name production-key \ 7
    1
    起動設定名を指定します。
    2
    イメージを起動するリージョンを指定します。
    3
    作成した Primed イメージ AMI を指定します。
    4
    起動するインスタンスのタイプを指定します。
    5
    起動したイメージに割り当てるセキュリティーグループを指定します。
    6
    アップロードした起動設定テンプレートを指定します。
    7
    SSH キーペアの名前を指定します。
    注記

    テンプレートをエンコードする前に 16 KB 未満の場合は、AWS CLI を使用し、--template-url--user-data を置き換えてテンプレートを指定できます。

  5. AWS CLI を使用して自動スケーリンググループを作成します。

    $ aws autoscaling create-auto-scaling-group \
          --auto-scaling-group-name mycluster-ASG \ 1
          --launch-configuration-name mycluster-LC \ 2
          --min-size 1 \ 3
          --max-size 6 \ 4
          --vpc-zone-identifier subnet-12345678 \ 5
          --tags ResourceId=mycluster-ASG,ResourceType=auto-scaling-group,Key=Name,Value=mycluster-ASG-node,PropagateAtLaunch=true ResourceId=mycluster-ASG,ResourceType=auto-scaling-group,Key=kubernetes.io/cluster/mycluster,Value=true,PropagateAtLaunch=true ResourceId=mycluster-ASG,ResourceType=auto-scaling-group,Key=k8s.io/cluster-autoscaler/node-template/label/node-role.kubernetes.io/compute,Value=true,PropagateAtLaunch=true 6
    1
    自動スケーラーデプロイメントのデプロイ時に使用する自動スケーリンググループの名前を指定します。
    2
    作成した起動設定の名前を指定します。
    3
    自動スケーラーが維持するノードの最小数を指定します。1 つ以上のノードが必要です。
    4
    スケールグループが拡張できるノードの最大数を指定します。
    5
    クラスターが使用するのと同じサブネットの VPC サブネット ID を指定します。
    6
    自動スケーリンググループタグが起動時のノードに伝播されるように文字列を指定します。

43.4. クラスターへの自動スケーラーコンポーネントのデプロイ

起動設定および自動スケーリンググループの作成後に、自動スケーラーコンポーネントをクラスターにデプロイできます。

前提条件

  • AWS で OpenShift Container Platform クラスターをインストールします。
  • Primed イメージを作成します。
  • Primed イメージを参照する起動設定および自動スケーリンググループを作成します。

手順

自動スケーラーをデプロイするには、以下を実行します。

  1. 自動スケーラーを実行するためにクラスターを更新します。

    1. クラスターを作成するために使用したインベントリーファイルに以下のパラメーターを追加します。デフォルトは /etc/ansible/hosts です。

      openshift_master_bootstrap_auto_approve=true
    2. 自動スケーラーを取得するには、Playbook ディレクトリーに切り替えてから Playbook を再度実行します。

      $ cd /usr/share/ansible/openshift-ansible
      $ ansible-playbook -i </path/to/inventory/file> \
          playbooks/deploy_cluster.yml
    3. bootstrap-autoapprover Pod が実行中であることを確認します。

      $ oc get pods --all-namespaces | grep bootstrap-autoapprover
      NAMESPACE               NAME                                             READY     STATUS    RESTARTS   AGE
      openshift-infra         bootstrap-autoapprover-0                         1/1       Running   0
  2. 自動スケーラーの namespace を作成します。

    $ oc apply -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-autoscaler
      annotations:
        openshift.io/node-selector: ""
    EOF
  3. 自動スケーラーのサービスアカウントを作成します。

    $ oc apply -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        k8s-addon: cluster-autoscaler.addons.k8s.io
        k8s-app: cluster-autoscaler
      name: cluster-autoscaler
      namespace: cluster-autoscaler
    EOF
  4. 必要なパーミッションをサービスアカウントに付与するためのクラスターロールを作成します。

    $ oc apply -n cluster-autoscaler -f - <<EOF
    apiVersion: v1
    kind: ClusterRole
    metadata:
      name: cluster-autoscaler
    rules:
    - apiGroups: 1
      - ""
      resources:
      - pods/eviction
      verbs:
      - create
      attributeRestrictions: null
    - apiGroups:
      - ""
      resources:
      - persistentvolumeclaims
      - persistentvolumes
      - pods
      - replicationcontrollers
      - services
      verbs:
      - get
      - list
      - watch
      attributeRestrictions: null
    - apiGroups:
      - ""
      resources:
      - events
      verbs:
      - get
      - list
      - watch
      - patch
      - create
      attributeRestrictions: null
    - apiGroups:
      - ""
      resources:
      - nodes
      verbs:
      - get
      - list
      - watch
      - patch
      - update
      attributeRestrictions: null
    - apiGroups:
      - extensions
      - apps
      resources:
      - daemonsets
      - replicasets
      - statefulsets
      verbs:
      - get
      - list
      - watch
      attributeRestrictions: null
    - apiGroups:
      - policy
      resources:
      - poddisruptionbudgets
      verbs:
      - get
      - list
      - watch
      attributeRestrictions: null
    EOF
    1
    cluster-autoscaler オブジェクトが存在する場合、 pods/eviction ルールが動詞 create と共に存在することを確認します。
  5. デプロイメント自動スケーラーのロールを作成します。

    $ oc apply -n cluster-autoscaler -f - <<EOF
    apiVersion: v1
    kind: Role
    metadata:
      name: cluster-autoscaler
    rules:
    - apiGroups:
      - ""
      resources:
      - configmaps
      resourceNames:
      - cluster-autoscaler
      - cluster-autoscaler-status
      verbs:
      - create
      - get
      - patch
      - update
      attributeRestrictions: null
    - apiGroups:
      - ""
      resources:
      - configmaps
      verbs:
      - create
      attributeRestrictions: null
    - apiGroups:
      - ""
      resources:
      - events
      verbs:
      - create
      attributeRestrictions: null
    EOF
  6. creds ファイルを作成して自動スケーラーの AWS 認証情報を保存します。

    $ cat <<EOF > creds
    [default]
    aws_access_key_id = your-aws-access-key-id
    aws_secret_access_key = your-aws-secret-access-key
    EOF

    自動スケーラーはこれらの認証情報を使用して新規インスタンスを起動します。

  7. AWS 認証情報が含まれるシークレットを作成します。

    $ oc create secret -n cluster-autoscaler generic autoscaler-credentials --from-file=creds

    自動スケーラーはこのシークレットを使用して AWS 内でインスタンスを起動します。

  8. cluster-reader ロールを作成し、これを作成した cluster-autoscaler サービスアカウントに付与します。

    $ oc adm policy add-cluster-role-to-user cluster-autoscaler system:serviceaccount:cluster-autoscaler:cluster-autoscaler -n cluster-autoscaler
    
    $ oc adm policy add-role-to-user cluster-autoscaler system:serviceaccount:cluster-autoscaler:cluster-autoscaler --role-namespace cluster-autoscaler -n cluster-autoscaler
    
    $ oc adm policy add-cluster-role-to-user cluster-reader system:serviceaccount:cluster-autoscaler:cluster-autoscaler -n cluster-autoscaler
  9. クラスターの自動スケーラーをデプロイします

    $ oc apply -n cluster-autoscaler -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: cluster-autoscaler
      name: cluster-autoscaler
      namespace: cluster-autoscaler
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: cluster-autoscaler
          role: infra
      template:
        metadata:
          labels:
    	app: cluster-autoscaler
    	role: infra
        spec:
          containers:
          - args:
    	- /bin/cluster-autoscaler
    	- --alsologtostderr
    	- --v=4
    	- --skip-nodes-with-local-storage=False
    	- --leader-elect-resource-lock=configmaps
    	- --namespace=cluster-autoscaler
    	- --cloud-provider=aws
    	- --nodes=0:6:mycluster-ASG
    	env:
    	- name: AWS_REGION
    	  value: us-east-1
    	- name: AWS_SHARED_CREDENTIALS_FILE
    	  value: /var/run/secrets/aws-creds/creds
    	image: registry.redhat.io/openshift3/ose-cluster-autoscaler:v3.11
    	name: autoscaler
    	volumeMounts:
    	- mountPath: /var/run/secrets/aws-creds
    	  name: aws-creds
    	  readOnly: true
          dnsPolicy: ClusterFirst
          nodeSelector:
    	node-role.kubernetes.io/infra: "true"
          serviceAccountName: cluster-autoscaler
          terminationGracePeriodSeconds: 30
          volumes:
          - name: aws-creds
    	secret:
    	  defaultMode: 420
    	  secretName: autoscaler-credentials
    EOF

43.5. 自動スケーラーのテスト

自動スケーラーを Amazon Web Services (AWS) クラスターに追加した後に、現在のノードが実行できる数よりも多くの Pod をデプロイすることにより自動スケーラーが機能することを確認できます。

前提条件

  • AWS で実行される OpenShift Container Platform クラスターに自動スケーラーが追加されていること。

手順

  1. 自動スケーリングをテストするためのデプロイメント設定が含まれる scale-up.yaml ファイルを作成します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: scale-up
      labels:
        app: scale-up
    spec:
      replicas: 20 1
      selector:
        matchLabels:
          app: scale-up
      template:
        metadata:
          labels:
            app: scale-up
        spec:
          containers:
          - name: origin-base
            image: openshift/origin-base
            resources:
              requests:
                memory: 2Gi
            command:
            - /bin/sh
            - "-c"
            - "echo 'this should be in the logs' && sleep 86400"
          terminationGracePeriodSeconds: 0
    1
    このデプロイメントは 20 のレプリカを指定しますが、初期サイズのクラスターでは、コンピュートノードの数を増やさないとすべての Pod を実行できません。
  2. デプロイメントの namespace を作成します。

    $ oc apply -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: autoscaler-demo
    EOF
  3. 設定をデプロイします。

    $ oc apply -n autoscaler-demo -f scale-up.yaml
  4. namespace の Pod を表示します。

    1. namespace の実行中の Pod を表示します。

      $ oc get pods -n autoscaler-demo | grep Running
      cluster-autoscaler-5485644d46-ggvn5   1/1       Running   0          1d
      scale-up-79684ff956-45sbg             1/1       Running   0          31s
      scale-up-79684ff956-4kzjv             1/1       Running   0          31s
      scale-up-79684ff956-859d2             1/1       Running   0          31s
      scale-up-79684ff956-h47gv             1/1       Running   0          31s
      scale-up-79684ff956-htjth             1/1       Running   0          31s
      scale-up-79684ff956-m996k             1/1       Running   0          31s
      scale-up-79684ff956-pvvrm             1/1       Running   0          31s
      scale-up-79684ff956-qs9pp             1/1       Running   0          31s
      scale-up-79684ff956-zwdpr             1/1       Running   0          31s
    2. namespace の保留中の Pod を表示します。

      $ oc get pods -n autoscaler-demo | grep Pending
      scale-up-79684ff956-5jdnj             0/1       Pending   0          40s
      scale-up-79684ff956-794d6             0/1       Pending   0          40s
      scale-up-79684ff956-7rlm2             0/1       Pending   0          40s
      scale-up-79684ff956-9m2jc             0/1       Pending   0          40s
      scale-up-79684ff956-9m5fn             0/1       Pending   0          40s
      scale-up-79684ff956-fr62m             0/1       Pending   0          40s
      scale-up-79684ff956-q255w             0/1       Pending   0          40s
      scale-up-79684ff956-qc2cn             0/1       Pending   0          40s
      scale-up-79684ff956-qjn7z             0/1       Pending   0          40s
      scale-up-79684ff956-tdmqt             0/1       Pending   0          40s
      scale-up-79684ff956-xnjhw             0/1       Pending   0          40s

      これらの保留中の Pod は、クラスターの自動スケーラーが Pod の実行に使用する新規コンピュートノードを自動的にプロビジョニングするまで実行されません。ノードがクラスター内で Ready 状態になるまで数分の時間がかかる場合があります。

  5. 数分後に、新規ノードの準備ができているかどうかを確認するためにノードの一覧をチェックします。

    $ oc get nodes
    NAME                            STATUS    ROLES     AGE       VERSION
    ip-172-31-49-172.ec2.internal   Ready     infra     1d        v1.11.0+d4cacc0
    ip-172-31-53-217.ec2.internal   Ready     compute   7m        v1.11.0+d4cacc0
    ip-172-31-55-89.ec2.internal    Ready     compute   9h        v1.11.0+d4cacc0
    ip-172-31-56-21.ec2.internal    Ready     compute   7m        v1.11.0+d4cacc0
    ip-172-31-56-71.ec2.internal    Ready     compute   7m        v1.11.0+d4cacc0
    ip-172-31-63-234.ec2.internal   Ready     master    1d        v1.11.0+d4cacc0
  6. 追加のノードの準備ができている場合、namespace で実行中の Pod を再度表示します。

    $ oc get pods -n autoscaler-demo
    NAME                                  READY     STATUS    RESTARTS   AGE
    cluster-autoscaler-5485644d46-ggvn5   1/1       Running   0          1d
    scale-up-79684ff956-45sbg             1/1       Running   0          8m
    scale-up-79684ff956-4kzjv             1/1       Running   0          8m
    scale-up-79684ff956-5jdnj             1/1       Running   0          8m
    scale-up-79684ff956-794d6             1/1       Running   0          8m
    scale-up-79684ff956-7rlm2             1/1       Running   0          8m
    scale-up-79684ff956-859d2             1/1       Running   0          8m
    scale-up-79684ff956-9m2jc             1/1       Running   0          8m
    scale-up-79684ff956-9m5fn             1/1       Running   0          8m
    scale-up-79684ff956-fr62m             1/1       Running   0          8m
    scale-up-79684ff956-h47gv             1/1       Running   0          8m
    scale-up-79684ff956-htjth             1/1       Running   0          8m
    scale-up-79684ff956-m996k             1/1       Running   0          8m
    scale-up-79684ff956-pvvrm             1/1       Running   0          8m
    scale-up-79684ff956-q255w             1/1       Running   0          8m
    scale-up-79684ff956-qc2cn             1/1       Running   0          8m
    scale-up-79684ff956-qjn7z             1/1       Running   0          8m
    scale-up-79684ff956-qs9pp             1/1       Running   0          8m
    scale-up-79684ff956-tdmqt             1/1       Running   0          8m
    scale-up-79684ff956-xnjhw             1/1       Running   0          8m
    scale-up-79684ff956-zwdpr             1/1       Running   0          8m
    ...