第18章 OpenStack の設定

18.1. 概要

OpenShift Container Platform は、OpenStack にデプロイする場合に、アプリケーションデータ用にOpenStack Cinder ボリュームを永続ストレージとして使用するなど、OpenStack インフラストラクチャーにアクセスするように設定できます。

18.2. パーミッション

OpenShift Container Platform に OpenStack を設定するには、以下のロールが必要です。

メンバー
インスタンス、ネットワーキングポート、Floating IP、ボリュームなどのアセットを作成するために、テナントの member ロールが必要になります。

18.3. セキュリティーグループの設定

OpenStack に OpenShift Container Platform を インストールする際は、適切なセキュリティーグループがセットアップされていることを確認します。

以下は、セキュリティーグループに設定しておく必要のあるポートです。これらがないとインストールは失敗します。また、インストールするクラスターの設定によっては、追加のポートが必要になる場合があります。セキュリティーグループの詳細、およびその適切な調整方法については、「必要なポート」を参照してください。

すべての OpenShift Container Platform ホスト

  • インストーラー/Ansible を実行しているホストの tcp/22

etcd セキュリティーグループ

  • マスターの tcp/2379
  • etcd ホストの tcp/2380

マスターのセキュリティーグループ

  • tcp/8443 (0.0.0.0/0)
  • 3.2 よりも前にインストールされた環境、または 3.2 にアップグレードされた環境向けのすべての OpenShift Container Platform ホストの tcp/53
  • 3.2 よりも前にインストールされた環境、または 3.2 にアップグレードされた環境向けのすべての OpenShift Container Platform ホストの udp/53
  • 3.2 を使ってインストールされた新しい環境向けのすべての OpenShift Container Platform ホストの tcp/8053
  • 3.2 を使ってインストールされた新しい環境向けのすべての OpenShift Container Platform ホストの udp/8053

ノードのセキュリティーグループ

  • マスターの tcp/10250
  • ノードの udp/4789

インフラストラクチャーノード (OpenShift Container Platform ルーターをホストできるノード)

  • tcp/443 (0.0.0.0/0)
  • tcp/80 (0.0.0.0/0)

CRI-O

CRI-O を使用している場合は、tcp/10010 を開き、oc exec および oc rsh 操作を実行できるようにします。

マスターまたはルートの負荷分散のために外部のロードバランサー (ELB) を設定する場合は、ELB の Ingress および Egress のセキュリティーグループを設定することも必要になります。

18.4. OpenStack 変数の設定

必要な OpenStack 変数を設定するには、OpenShift Container Platform のマスターとノード両方のすべてのホストに、/etc/cloud.conf ファイルを以下の内容で作成します。

[Global]
auth-url = <OS_AUTH_URL>
username = <OS_USERNAME>
password = <password>
domain-id = <OS_USER_DOMAIN_ID>
tenant-id = <OS_TENANT_ID>
region = <OS_REGION_NAME>

[LoadBalancer]
subnet-id = <UUID of the load balancer subnet>

OS_ 変数の値については OpenStack の管理者にお問い合わせください。この値は通常 OpenStack の設定で使用されます。

18.5. OpenStack についての OpenShift Container Platform マスターの設定

OpenStack は、OpenShift Container Platform のマスターとノードの各ホストに以下の 2 通りの方法で設定できます。

クラスターのインストール時に、OpenStack は以下のパラメーターを使用して設定できます。これらのパラメーターは、インベントリーファイルで設定可能です。

  • openshift_cloudprovider_kind
  • openshift_cloudprovider_openstack_auth_url
  • openshift_cloudprovider_openstack_username
  • openshift_cloudprovider_openstack_password
  • openshift_cloudprovider_openstack_domain_id
  • openshift_cloudprovider_openstack_domain_name
  • openshift_cloudprovider_openstack_tenant_id
  • openshift_cloudprovider_openstack_tenant_name
  • openshift_cloudprovider_openstack_region
  • openshift_cloudprovider_openstack_lb_subnet_id

Ansible を使用した OpenStack の設定例

# Cloud Provider Configuration
#
# Note: You may make use of environment variables rather than store
# sensitive configuration within the ansible inventory.
# For example:
#openshift_cloudprovider_openstack_username="{{ lookup('env','USERNAME') }}"
#openshift_cloudprovider_openstack_password="{{ lookup('env','PASSWORD') }}"
#
# Openstack
#openshift_cloudprovider_kind=openstack
#openshift_cloudprovider_openstack_auth_url=http://openstack.example.com:35357/v2.0/
#openshift_cloudprovider_openstack_username=username
#openshift_cloudprovider_openstack_password=password
#openshift_cloudprovider_openstack_domain_id=domain_id
#openshift_cloudprovider_openstack_domain_name=domain_name
#openshift_cloudprovider_openstack_tenant_id=tenant_id
#openshift_cloudprovider_openstack_tenant_name=tenant_name
#openshift_cloudprovider_openstack_region=region
#openshift_cloudprovider_openstack_lb_subnet_id=subnet_id

18.5.1. 手動による OpenStack についての OpenShift Container Platform マスターの設定

すべてのマスターで、マスター設定ファイル (デフォルトは /etc/origin/master/master-config.yaml) を編集するか、または作成し、apiServerArgumentscontrollerArguments の各セクションの内容を更新します。

kubernetesMasterConfig:
  ...
  apiServerArguments:
    cloud-provider:
      - "openstack"
    cloud-config:
      - "/etc/cloud.conf"
  controllerArguments:
    cloud-provider:
      - "openstack"
    cloud-config:
      - "/etc/cloud.conf"
重要

コンテナー化インストールをトリガーすると、/etc/origin/var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、cloud.conf/etc/ ではなく /etc/origin/ になければなりません。

18.5.2. 手動による OpenStack についての OpenShift Container Platform ノードの設定

適切なノード設定マップを編集して、kubeletArgumentsnodeName セクションの内容を更新します。

nodeName:
  <instance_name> 1

kubeletArguments:
  cloud-provider:
    - "openstack"
  cloud-config:
    - "/etc/cloud.conf"
1
ノードホストの OpenStack インスタンス名 (RFC1123 に準拠)
注記

nodeName は OpenStack インスタンス名と一致しない場合に、クラウドプロバイダーの統合は機能しません。

重要

コンテナー化インストールをトリガーすると、/etc/origin/var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、cloud.conf/etc/ ではなく /etc/origin/ になければなりません。

18.6. 設定変更の適用

マスターおよびノードのすべてのホストで OpenShift Container Platform サービスを起動または再起動し、設定の変更を適用します。「OpenShift Container Platform サービスの再起動」を参照してください。

# master-restart api
# master-restart controllers
# systemctl restart atomic-openshift-node

クラウドプロバイダーを使用しない状態から、使用するように切り替えると、エラーメッセージが表示されます。クラウドプロバイダーを追加すると、ノードが hostnameexternalID として使用する (クラウドプロバイダーが使用されていなかった場合のケース) 代わりに、クラウドプロバイダーの instance-id (クラウドプロバイダーによって指定される) の使用に切り替えるため、ノードの削除が試みられます。この問題を解決するには、以下を実行します。

  1. CLI にクラスター管理者としてログインします。
  2. 既存のノードラベルをチェックし、これらをバックアップします。

    $ oc describe node <node_name> | grep -Poz '(?s)Labels.*\n.*(?=Taints)'
  3. ノードを削除します。

    $ oc delete node <node_name>
  4. 各ノードホストで OpenShift Container Platform サービスを再起動します。

    # systemctl restart atomic-openshift-node
  5. 以前に使用していた各ノードのラベルを再度追加します。

18.6.1. 動的に作成した OpenStack PV のゾーンラベルの設定

管理者は、動的に作成された OpenStack PV のゾーンラベルを設定できます。このオプションは、OpenStack Cinder ゾーン名がコンピュートゾーン名などに一致しない場合、Cinder ゾーンが 1 つだけで、コンピュートゾーンが多数ある場合に有用です。管理者は、動的に Cinder ボリュームを作成してから、ラベルをチェックできます。

PV のゾーンラベルを表示します。

# oc get pv --show-labels
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                 STORAGECLASS   REASON    AGE       LABELS
pvc-1faa6f93-64ac-11e8-930c-fa163e3c373c   1Gi        RWO            Delete           Bound     openshift-node/pvc1   standard                 12s       failure-domain.beta.kubernetes.io/zone=nova

デフォルトの設定が有効になっています。oc get pv --show-labels コマンドは、failure-domain.beta.kubernetes.io/zone=nova ラベルを返します。

ゾーンラベルを無効にするには、cloud.conf ファイルに以下を追加して更新します。

[BlockStorage]
ignore-volume-az = yes

マスターサービスの再起動後に作成された PV にはゾーンラベルがありません。