カスタムのCloud-init初期化スクリプトを使用した管理対象ノードの設定

Container Engine for Kubernetes (OKE)を使用して作成したクラスタのワーカー・ノードで実行するカスタムcloud-initスクリプトを記述する方法を確認します。

Cloud-initは、クラウド・インスタンスの初期化、プライベート・クラウド・インフラストラクチャ用のシステムのプロビジョニング、およびベアメタル・インストールのための業界標準の方法です。これは、Oracle Cloud Infrastructureを含むすべての主要なパブリック・クラウド・プロバイダでサポートされています(ユーザー・データを参照)。Cloud-initは、インスタンスを初期化および構成するためのスクリプトを実行します。cloud-initの詳細は、cloud-initのドキュメントを参照してください。

Container Engine for Kubernetesは、cloud-initを使用して、管理対象ノードをホストするコンピュート・インスタンスを設定します。Container Engine for Kubernetesは、管理対象ノードをホストする各インスタンスにデフォルトの起動スクリプトをインストールします。インスタンスが初めて起動すると、cloud-initはデフォルトの起動スクリプトを実行します。デフォルトの起動スクリプトには、Container Engine for Kubernetesによって提供される次のロジックが含まれます:

#!/bin/bash
curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
bash /var/run/oke-init.sh

デフォルト・ロジックの前後に独自のロジックをスクリプトに追加することで、デフォルトの起動スクリプトをカスタマイズできます。デフォルトの起動スクリプトをカスタマイズすると、たとえば、次のことができます。

  • セキュリティおよびコンプライアンスの目的で、すべてのワーカー・ノード・ホストにSELinuxポリシーを構成します。
  • 起動時にインスタンスのエフェメラル・パブリックIPを割当て解除し、かわりに予約済パブリックIPを再割当てします
  • 企業プロキシの構成
  • カスタムyumプロキシの構成
  • 指示されたウイルス対策ソフトウェアおよびその他のセキュリティ・ツールのインストール

デフォルトの起動スクリプトをカスタマイズする場合は、Container Engine for Kubernetesで提供されるロジックを変更しないでください。

新しいクラスタの作成時、新しいノード・プールの作成時、および既存のノード・プールの変更時に、デフォルトの起動スクリプトをカスタマイズできます。

  • コンソールの使用(新しいクラスタを作成する場合は、カスタム作成ワークフローを使用します)
  • CLIの使用
  • APIの使用

カスタマイズされた起動スクリプトは、ワーカー・ノードをホストしているインスタンスが初めて起動したときに実行されます。デフォルトの起動スクリプトをカスタマイズした後は、Node Doctorスクリプトを実行して、新しく起動したインスタンスのワーカー・ノードが期待どおりに動作していることを確認することをお薦めします(Node Doctorスクリプトを使用したKubernetesクラスタに関するノードの問題のトラブルシューティングを参照)。

カスタムのCloud-initスクリプトの使用例

例1: カスタムCloud-initスクリプトを使用した管理対象ノードでのSELinux (セキュリティ拡張Linux)の構成

カスタムのcloud-initスクリプトを使用して、管理対象ノードでSELinuxを構成できます。SELinuxは、管理者がポリシー内のルールに基づいてどのユーザーおよびアプリケーションがどのリソースにアクセスできるかを制限できるLinuxのセキュリティ拡張機能です。SELinuxは、アクセス制御にもより細かい粒度を追加します。

SELinuxは、有効または無効にする2つの状態のいずれかになります。有効にすると、SELinuxは強制または許容の2つのモードのいずれかで実行できます。

デフォルトでは、SELinuxは有効化されており、ワーカー・ノード上で許容モードで実行するように設定されています。許容モードで実行する場合、SELinuxはアクセス・ルールを強制せず、ロギングのみを実行します。

SELinuxでアクセス・ルールを強制する場合は、これを強制モードで実行するように設定できます。強制モードで実行する場合、SELinuxはポリシーに反するアクションをブロックし、対応するイベントを監査ログに記録します。

SELinuxを強制モードで実行するように設定するには、次のcloud-initスクリプトを使用します。

#!/bin/bash
curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
bash /var/run/oke-init.sh
setenforce 1
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config 

ワーカー・ノードで実行されているSELinuxのステータスおよびモードを確認するには、ワーカー・ノードに接続し、getenforceコマンドを使用します。前述のcloud-initスクリプトをワーカー・ノードで実行すると、getenforceコマンドはEnforcingを返します。

例2: カスタムCloud-initスクリプトを使用した管理対象ノードのNodeLocal DNSCacheの設定

カスタムのcloud-initスクリプトを使用して、管理対象ノードでNodeLocal DNSCacheを構成できます。NodeLocal DNSCacheは、デーモンセットとしてワーカー・ノードでDNSキャッシュ・エージェントを実行することで、クラスタDNSのパフォーマンスを向上させます。

NodeLocal DNSCacheが有効になっていない場合、ClusterFirst DNSモードのポッドは、DNS問合せのkube-dns serviceIPに到達します。iptablesルールを使用すると、このリクエストはkube-proxyによって追加されたkube-dns/CoreDNSエンドポイントに変換されます。詳細は、KubernetesドキュメントのサービスおよびポッドのためのDNSを参照してください。

NodeLocal DNSCacheが有効な場合、ポッドは同じワーカー・ノードで実行されているDNSキャッシュ・エージェントに到達し、それによってiptables DNATルールおよび接続トラッキングをバイパスできます。ローカル・キャッシュ・エージェントは、クラスタ・ホスト名(デフォルトではcluster.local接尾辞)のキャッシュ・ミスについてkube-dns/CoreDNSサービスに問い合せます。

NodeLocal DNSCacheを構成するには、次のcloud-initスクリプトを使用します。CLUSTER DNSを、クラスタ内の何も衝突しないローカル・リスニングIPアドレスに置き換えます。IPv4の場合は169.254.0.0/16、IPv6の場合は fd00::/8の固有のローカルアドレス範囲から推奨されるリンクローカル範囲があります。

#!/bin/bash
curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
bash /var/run/oke-init.sh --cluster-dns "[CLUSTER DNS]"

NodeLocal DNSCacheが正常にデプロイされたことを確認するには、ワーカー・ノードに接続し、sudo systemctl status -l kubeletコマンドを使用します。前述のcloud-initスクリプトをワーカー・ノードで実行すると、sudo systemctl status -l kubeletコマンドは、--cluster-dnsをkubeletフラグの1つとして返し、デフォルトのローカル・リンク・アドレス(たとえば、169.254.20.10)に設定します。

前述のcloud-initスクリプトを使用してノードを作成した後、KubernetesドキュメントのKubernetesクラスタでのNodeLocal DNSCacheの使用のステップに従って、DNSキャッシュ・エージェントをデプロイします。有効にすると、ノードローカルdnsポッドは、各クラスタ・ノードのkube-systemネームスペースで実行されます。node-local-dnsポッドはCoreDNSをキャッシュ・モードで実行するため、異なるプラグインによって公開されるすべてのCoreDNSメトリックをノードごとに使用できます。

DNS解決をテストするには、次のコマンドを1つ以上使用します(KubernetesドキュメントのDNS解決のデバッグを参照)。コマンドは両方とも機能し、カスタムcloud-initスクリプトの--cluster-dnsフラグによって設定されたIPアドレスを出力する必要があります。

kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml
kubectl exec -it dnsutils – nslookup kubernetes.default
kubectl exec -it dnsutils – cat /etc/resolv.conf

NodeLocal DNSCacheを無効にするには、デーモンセットを削除し、nodelocaldnsマニフェストを削除します。また、kubelet構成に加えた変更を元に戻す必要があります。

例3: カスタムCloud-initスクリプトを使用した管理対象ノードでのkubelet-extra-argsの設定

カスタムのcloud-initスクリプトを使用して、管理対象ノードのkubelet (プライマリ・ノード・エージェント)に多数の追加オプションを構成できます。これらの追加オプションは、kubelet-extra-argsと呼ばれることもあります。このような kubelet-extra-argsオプションの1つは、デバッグレベルのログの詳細度を構成するオプションです。

デバッグ・レベルのログ冗長性を構成するには、次のcloud-initスクリプトを使用します。

#!/bin/bash
curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
bash /var/run/oke-init.sh --kubelet-extra-args "--v=4"

デバッグ・レベル・ログの詳細度の設定を確認するには、ワーカー・ノードに接続し、sudo systemctl status -l kubeletコマンドを使用します。前述のcloud-initスクリプトをワーカー・ノードで実行すると、sudo systemctl status -l kubeletコマンドは冗長性レベルを4として返します。kubeletログには、より詳細な情報が含まれます。

例4: カスタムのCloud-initスクリプトを使用したKubernetesおよびOSシステム・デーモンのリソースの予約

カスタムのcloud-initスクリプトを使用して、Kubernetesシステム・デーモン(kubeletcontainer runtimeなど)およびOSシステム・デーモン(sshdsystemdなど)のCPUおよびメモリー・リソースを予約できます。KubernetesおよびOSシステム・デーモンのリソースを予約するには、--kube-reservedおよび--system-reserved kubeletフラグをそれぞれkubelet-extra-argsオプションとしてカスタムcloud-initスクリプトに含めます。

KubernetesおよびOSシステム・デーモンのリソースを予約するには、次のcloud-initスクリプトを使用します:

#!/bin/bash
curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
bash /var/run/oke-init.sh --kubelet-extra-args "--kube-reserved=cpu=500m,memory=1Gi --system-reserved=cpu=100m,memory=100Mi"

詳細は、および--kube-reservedおよび--system-reserved kubeletフラグの推奨値については、ベスト・プラクティス: KubernetesおよびOSシステム・デーモンのリソースの予約を参照してください。

例5: カスタムのCloud-initスクリプトおよびoci-growfsを使用したブート・ボリューム・パーティションのサイズの増加

カスタムのcloud-initスクリプトを使用して、管理対象ノードのブート・ボリュームのパーティションを拡張できます。クラスタおよびノード・プールを作成および更新するときに、ワーカー・ノードのブート・ボリュームのカスタム・サイズを指定できます。指定するカスタム・ブート・ボリューム・サイズは、選択したイメージのデフォルトのブート・ボリューム・サイズより大きい必要があります。ブート・ボリュームのサイズを増やし、より大きなブート・ボリューム・サイズを利用するには、ブート・ボリュームのパーティションも拡張する必要があります。

Oracle Linuxプラットフォーム・イメージには、oci-utilsパッケージが含まれています。cloud-initスクリプトでそのパッケージのoci-growfsコマンドを使用して、ルート・パーティションを拡張し、ファイル・システムを拡張できます。

ブート・ボリュームのパーティションを拡張するには、次のcloud-initスクリプトを使用します。

#!/bin/bash
curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
bash /usr/libexec/oci-growfs -y

詳細は、ブート・ボリュームのパーティションの拡張を参照してください。

カスタムCloud-initスクリプトの作成

Container Engine for Kubernetesで提供されるデフォルトのcloud-init起動スクリプトをカスタマイズするには:

  1. Container Engine for Kubernetesで提供されるデフォルト・ロジックを含む新しいスクリプト・ファイルを作成します。これは、次の2つの方法で実行できます。
    • 「カスタム・クラスタの作成」「ノード・プールの追加」または「ノード・プールの編集」ダイアログを使用する場合は、「カスタム・クラウド初期化スクリプト・テンプレートのダウンロード」オプション(ノード・プールの「拡張オプション」セクション)を選択します。ダウンロードするファイルには、デフォルトのロジックが含まれています。
    • cloud-initでサポートされるファイル・タイプ(.yamlなど)を使用して新規ファイルを最初から作成し、Container Engine for Kubernetesが提供するデフォルト・ロジックを追加します。例:
      #!/bin/bash
      curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
      bash /var/run/oke-init.sh
  2. Container Engine for Kubernetesによって提供されるデフォルト・ロジックの前または後に、独自のカスタム・ロジックをスクリプト・ファイルに追加します。デフォルトのロジックは変更しないでください。

    たとえば、デバッグ・レベルのログ冗長性を構成するには、--kubelet-extra-args "--v=4"を追加して、ファイルが次のようになるようにします。

    #!/bin/bash
    curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
    bash /var/run/oke-init.sh --kubelet-extra-args "--v=4"

    その他の例は、カスタムCloud-initスクリプトの使用例を参照してください。

  3. 作成したカスタムのcloud-initスクリプト・ファイルを保存します。
  4. 新規クラスタの作成時、新規ノード・プールの追加時、または既存のノード・プールの変更時に、カスタムcloud-initスクリプト・ファイルを指定します。

コンソールの使用

コンソールを使用して、新しいクラスタ、新しいノード・プールまたは既存のノード・プールで管理対象ノードをホストするインスタンスに対してカスタムのcloud-initスクリプトを提供するには:

  1. cloud-initでサポートされるいずれかの形式(cloud-configなど)およびfiletypes (.yamlファイルなど)で、有効なcloud-initファイルを作成します。カスタムCloud-initスクリプトの作成を参照してください。
  2. ナビゲーション・メニューを開き、「開発者サービス」をクリックします「コンテナとアーティファクト」で、「Kubernetesクラスタ(OKE)」をクリックします。
  3. 作業する権限があるコンパートメントを選択します。
  4. カスタム作成ワークフローを使用して新しいクラスタを作成するか、既存のクラスタに新規ノード・プールを追加するか、既存のノード・プールを変更します。
  5. 「カスタム・クラスタの作成」「ノード・プールの追加」または「ノード・プールの編集」ダイアログのノード・プールの「詳細オプション」セクションで、必要に応じて次を指定します:
    • 初期化スクリプト: (オプション)インスタンスが初めて起動したときにワーカー・ノードをホストする各インスタンスで実行するcloud-initのスクリプト。指定するスクリプトは、cloud-initでサポートされる形式(cloud-configなど)の1つで記述する必要があり、サポートされているファイル・タイプ(.yamlなど)である必要があります。次のようにスクリプトを指定します。
      • Cloud-Initスクリプトの選択: cloud-initスクリプトを含むファイルを選択するか、ボックスにファイルをドラッグ・アンド・ドロップします。
      • Cloud-Initスクリプトの貼付け: cloud-initスクリプトの内容をコピーして、ボックスに貼り付けます。

      Container Engine for Kubernetesによって作成されたクラスタでワーカー・ノードを初期化するためのcloud-initスクリプトを以前に記述していない場合は、「カスタム・クラウド初期化スクリプト・テンプレートのダウンロード」をクリックすると役立つことがあります。ダウンロードされたファイルには、Container Engine for Kubernetesによって提供されるデフォルト・ロジックが含まれます。独自のカスタム・ロジックは、デフォルト・ロジックの前後に追加できますが、デフォルト・ロジックは変更しないでください。例については、カスタムCloud-initスクリプトの使用例を参照してください。

CLIの使用

CLIの使用の詳細は、コマンド・ライン・インタフェース(CLI)を参照してください。CLIコマンドで使用できるフラグおよびオプションの完全なリストは、コマンドライン・リファレンスを参照してください。

CLIを使用して、新しいノード・プールまたは既存のノード・プールでワーカー・ノードをホストするインスタンス用のカスタムcloud-initスクリプトを指定するには:

  1. cloud-initでサポートされるいずれかの形式(cloud-configなど)およびfiletypes (.yamlファイルなど)で、有効なcloud-initファイルを作成します。カスタムCloud-initスクリプトの作成を参照してください。
  2. コマンド・プロンプトを開き、次のいずれかのコマンドを入力して新しいノード・プールを作成するか、既存のノード・プールを必要に応じて更新します。
    • oci ce node-pool create
    • oci ce node-pool update
  3. 使用しているコマンドに必要な必須パラメータに加えて:
    1. カスタム・イメージを指定しない場合でも、--node-image-idパラメータを含めます。
    2. --node-metadataオプション・パラメータを次の形式で含めます。
      --node-metadata '{"user_data": "'$(cat <cloud-init-file> | base64)'"}'
      ここでは:
      • <cloud-init-file>は、作成したcloud-initファイルの名前です
      • base64は、ファイルがbase64でエンコードされることを指定します

      例:

      --node-metadata '{"user_data": "'$(cat my-custom-cloud-init.yaml | base64)'"}'

この例では、既存のクラスタ用にmy-cloud-init-test-nodepoolという新しいノード・プールを作成し、Oracle Linuxを実行しているVM 2.1シェイプを持つ単一のKubernetes 1.18.10ノードを使用します。新しいノード・プールでワーカー・ノードをホストしているインスタンスが初めて起動する場合、my-custom-cloud-init.yamlというカスタムのcloud-initスクリプトを実行します。

oci ce node-pool create \
--cluster-id ocid1.cluster.oc1.iad.aaaa______m4w \
--name my-cloud-init-test-nodepool \
--node-image-id ocid1.image.oc1.iad.aaaa______zpq \
--compartment-id ocid1.tenancy.oc1..aaa______q4a \
--kubernetes-version v1.18.10 \
--node-shape VM.Standard2.1 \
--placement-configs "[   { \"availabilityDomain\": \"PKGK:US-ASHBURN-AD-1\", \"subnetId\": \"ocid1.subnet.oc1.iad.aaaa______kfa\"   }   ]" \
--size 1 \
--region us-ashburn-1 \
--node-metadata '{"user_data": "'$(cat my-custom-cloud-init.yaml | base64)'"}'