Container Service for Kubernetes (ACK) クラスタを使用する場合、短時間で多数のポッドを迅速に起動する必要がある場合があります。 これらのポッド用に Elastic Compute Service (ECS) ノードをスケールアウトするには時間がかかりすぎる一方で、余分なアイドル状態の ECS インスタンスを予約しておくのはリソースの無駄になります。 より良い解決策は、ACK 仮想ノードを介して Elastic Container Instance で実行するようにポッドをスケジュールすることです。 この方法では、ECS インスタンスを購入または管理する必要はありません。 このトピックでは、ACK One 登録済みクラスターの Elastic Container Instance にポッドをスケジュールする方法について説明します。
しくみ
Elastic Container Instance は、コンテナ化のために Alibaba Cloud が提供するサーバーレスコンピューティングサービスであり、コンテナ用の運用管理不要の、隔離された、迅速にデプロイ可能なランタイム環境を提供します。 Elastic Container Instance を使用すると、ECS インスタンスを購入または管理することなく、コンテナ化されたアプリケーションに集中できます。 必要に応じて Elastic Container Instance を作成でき、リソースの使用量に対して秒単位で課金されます。
通常、クラスターには少なくとも 1 つのデータセンター ノード グループがあります。ポッドを作成すると、クラスターはノードで実行するようにポッドをスケジュールします。このスケジューリング モードは、安定したトラフィック量を受信するアプリケーションに適しています。ワークロードに突然または予測できない急上昇がある場合は、仮想ノードを使用してポッドを エラスティック コンテナー インスタンスに直接スケジュールすることをお勧めします。このソリューションは、ノードの作成時間を短縮し、アイドル状態のリソース コストを回避します。
前提条件
登録済みクラスターが作成されていること、および Kubernetes バージョン 1.14 以降の自己管理型クラスターが登録済みクラスターに接続されていること。
クラスターがデプロイされているリージョンが Elastic Container Instance でサポートされていること。 サポートされているリージョンとゾーンを表示するには、[Elastic Container Instance コンソール]にログインします。 サポートされているリージョンとゾーンの詳細については、「リージョンとゾーン」をご参照ください。
ステップ 1: ack-virtual-node に RAM 権限を付与する
onectl を使用する
オンプレミスマシンに onectl をインストールします。 詳細については、「onectl を使用して登録済みクラスターを管理する」をご参照ください。
次のコマンドを実行して、ack-virtual-node に Resource Access Management (RAM) 権限を付与します。
onectl ram-user grant --addon ack-virtual-node期待される出力:
Ram policy ack-one-registered-cluster-policy-ack-virtual-node granted to ram user ack-one-user-ce313528c3 successfully.
コンソールを使用する
登録済みクラスターにコンポーネントをインストールする前に、自己管理型 Kubernetes クラスターで AccessKey ペアを指定する必要があります。 自己管理型 Kubernetes クラスターから Alibaba Cloud サービスにアクセスするには、AccessKey ペアが必要です。 AccessKey ペアを設定する前に、RAM ユーザーを作成し、Alibaba Cloud リソースにアクセスするための権限を RAM ユーザーに付与します。
オプション: カスタムポリシーを作成する。
AliyunECIFullAccess、AliyunVPCReadOnlyAccess、AliyunAccFullAccessなどのシステムポリシー、またはカスタム権限ポリシーを追加することで、RAM ユーザーに権限を付与できます。- 警告
AccessKey のセキュリティを強化するために、ネットワークアクセス制御用に AccessKey ペアベースのポリシーを構成し、AccessKey の呼び出し元を信頼できるネットワーク環境に制限することをお勧めします。
AccessKey ペアを使用して、登録済みクラスターに alibaba-addon-secret という名前のシークレットを作成します。
ack-virtual-node をインストールすると、システムは AccessKey ペアを使用してクラウドリソースに自動的にアクセスします。
kubectl -n kube-system create secret generic alibaba-addon-secret --from-literal='access-key-id=<your access key id>' --from-literal='access-key-secret=<your access key secret>'説明<your access key id>と<your access key secret>は、前のステップで取得した AccessKey ペアに置き換えます。
ステップ 2: ack-virtual-node をインストールする
onectl を使用する
次のコマンドを実行して、ack-virtual-node をインストールします。
onectl addon install ack-virtual-node期待される出力:
Addon ack-virtual-node, version **** installed.コンソールを使用する
[ACK コンソール]にログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページで、[ack-virtual-node] を見つけて [インストール] をクリックします。
[注記] ダイアログボックスで、[OK] をクリックします。 ack-virtual-node によってデプロイされる Elastic Container Instance には、クラスターのデフォルトの vSwitch とセキュリティグループが使用されます。 詳細については、「次のステップ」をご参照ください。
ステップ 3: Elastic Container Instance にポッドをスケジュールする
ack-virtual-node がクラスターにデプロイされると、クラスター内の仮想ノードとしてデプロイされている Elastic Container Instance にポッドをスケジュールできます。 次のいずれかの方法を使用して、登録済みクラスターの Elastic Container Instance にポッドをスケジュールできます。 ポッドをスケジュールする前に、仮想ノードが Ready 状態であることを確認してください。
次のコマンドを実行して、仮想ノードのステータスをクエリします。
kubectl get no |grep virtual-kubelet期待される出力:
virtual-kubelet-cn-hangzhou-b Ready agent 18d v1.20.11-aliyun.1出力は、仮想ノードが Ready 状態であることを示しています。
次の 3 つの方法のいずれかを使用して、Elastic Container Instance にポッドをスケジュールできます。
方法 1: ポッドにラベルを追加する (クラスターのバージョンが 1.16 以降)
作成するポッドに
alibabacloud.com/eci=trueラベルを追加します。 その後、Elastic Container Instance ベースのポッドが作成され、仮想ノードにスケジュールされます。 例:次のコマンドを実行して、ポッドにラベルを追加します。
次のコマンドを実行して、ポッドをクエリします。
期待される出力:
kubectl run nginx --image nginx -l alibabacloud.com/eci=truekubectl get pod -o wide|grep virtual-kubeletnginx-7fc9f746b6-r4xgx 0/1 ContainerCreating 0 20s 192.168.XX.XX virtual-kubelet <none> <none>方法 2: 名前空間にラベルを追加する
ポッドが属する名前空間に
alibabacloud.com/eci=trueラベルを追加します。 その後、Elastic Container Instance ベースのポッドが作成され、仮想ノードにスケジュールされます。 例:次のコマンドを実行して、仮想ノードを作成します。
次のコマンドを実行して、ポッドが属する名前空間にラベルを追加します。
次のコマンドを実行して、ポッドを仮想ノードにスケジュールします。
次のコマンドを実行して、ポッドをクエリします。
期待される出力:
kubectl create ns vkkubectl label namespace vk alibabacloud.com/eci=truekubectl -n vk run nginx --image nginxkubectl -n vk get pod -o wide|grep virtual-kubeletnginx-6f489b847d-vgj4d 1/1 Running 0 1m 192.168.XX.XX virtual-kubelet <none> <none>方法 3: ノード名を指定する
指定されたポッドのみを仮想ノードにスケジュールします。 ポッドに
nodeName: virtual-kubelet-cn-shanghai-kラベルを追加します。 その後、Elastic Container Instance ベースのポッドが作成され、仮想ノードにスケジュールされます。 例:nginx-deployment.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeName: virtual-kubelet-cn-shanghai-k # 指定された仮想 kubelet の nodeName containers: - name: nginx image: nginx:1.7.9 # 正確な <image_name:tags> に置き換えます ports: - containerPort: 80 resources: limits: cpu: "500m"次のコマンドを実行して、アプリケーションをデプロイします。
kubectl apply -f nginx-deployment.yaml次のコマンドを実行して、ポッドをクエリします。
kubectl get pod -o wide|grep virtual-kubelet期待される出力:
nginx-6f489b847d-XXX 1/1 Running 0 1m 192.168.XX.XX virtual-kubelet <none> <none> nginx-6f489b847d-XXX 1/1 Running 0 1m 192.168.XX.XX virtual-kubelet <none> <none>
次のステップ
Elastic Container Instance が接続されている vSwitch の構成を変更する
ECI_VSWITCH 環境変数を変更して、仮想ノードにスケジュールされているポッドの vSwitch を変更できます。 高可用性を確保するために、異なるゾーンにデプロイされている複数の vSwitch を構成することをお勧めします。 現在のゾーンの Elastic Container Instance の在庫がない場合、仮想ノードコントローラーは別のゾーンにポッドを作成します。
次のコマンドを実行して、Elastic Container Instance が接続されている vSwitch の構成を変更します。
kubectl edit configmap eci-profile -n kube-system構成例:
data:
enableClusterIp: "true"
enableHybridMode: "false"
enablePrivateZone: "false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf**** # Elastic Container Instance ポッドが接続されている vSwitch。 複数の vSwitch ID はカンマ (,) で区切ります。
vpcId: vpc-2zeghwzptn5zii0w7****eci-profile の構成方法の詳細については、「eci-profile を構成する」をご参照ください。
仮想ノードを削除する
登録済みクラスターから ack-virtual-node をアンインストールします。
onectl を使用する
次のコマンドを実行して、ack-virtual-node をアンインストールします。
onectl addon uninstall ack-virtual-node期待される出力:
Addon ack-virtual-node uninstalled.コンソールを使用する
ACK コンソールの [アドオン] ページに移動し、ack-virtual-node をアンインストールします。
kubectl delete node <node name>を実行して、不要な仮想ノードを削除します。説明ack-virtual-node をアンインストールした後も、クラスター内の既存の Elastic Container Instance は削除されません。