データセンターまたはElastic Compute Service (ECS)インスタンスに自己管理型Kubernetesクラスターを作成した場合、Elastic Container Instanceを使用するには、クラスターにVNodeをデプロイする必要があります。このトピックでは、kubeconfig証明書を設定し、KubernetesクラスターにVNodeを手動でデプロイする方法について説明します。VNodeをデプロイした後、KubernetesクラスターでElastic Container Instanceを使用できます。
前提条件
バージョン1.13から1.30のKubernetesクラスターがデプロイされていること。
Kubernetesクラスターがデータセンターにデプロイされている場合は、データセンターとElastic Container InstanceベースのPodが属する仮想プライベートクラウド (VPC) がExpress Connect、Smart Access Gateway、またはVPN Gatewayを使用して相互に接続されていることを確認してください。詳細については、以下のトピックを参照してください。
準備
自己管理型KubernetesクラスターにVNodeをデプロイする前に、VNodeの作成に必要なパラメータ情報を準備し、クラスターにVNodeをデプロイするために必要な権限を理解してください。次の表は、VNodeの作成に必要なパラメータについて説明しています。
パラメータ | 説明 | 操作 |
リージョン | リージョンは、Alibaba Cloudデータセンターがデプロイされている地理的な場所です。エンドユーザーの地理的な場所とリソース価格に基づいてリージョンを選択します。詳細については、リージョンとゾーンを参照してください。 エラスティックコンテナインスタンスと関連リソースは、選択したリージョンに作成されます。 | Elastic Container Instanceコンソールを使用するか、DescribeRegions APIオペレーションを呼び出すことで、Elastic Container Instanceが利用可能なリージョンを照会できます。 |
VPC | VPCは、Alibaba Cloud上に構築されたプライベートネットワークです。VPCは論理的に相互に分離されています。詳細については、VPCとはを参照してください。 エラスティックコンテナインスタンスと関連リソースは、設定したVPCに作成されます。 説明 Kubernetesクラスターがデータセンターにデプロイされている場合は、データセンターのネットワークとVPCが確立されていることを確認してください。 | VPCコンソールのVPCページでVPCを作成および表示できます。 |
vSwitch | vSwitchは、異なるクラウドリソースを接続する基本的なネットワークデバイスです。VPCにエラスティックコンテナインスタンスと関連リソースを作成するには、vSwitchを指定する必要があります。複数のvSwitchを指定することもできます。この場合、システムはvSwitchのプールからvSwitchを自動的に選択します。 | VPCコンソールのvSwitchページでvSwitchを作成および表示し、選択したVPC内のvSwitchを選択できます。 |
セキュリティグループ | セキュリティグループは、グループ内のリソースのインバウンドトラフィックとアウトバウンドトラフィックを制御してネットワークセキュリティを向上させる仮想ファイアウォールです。セキュリティグループの詳細については、概要を参照してください。 エラスティックコンテナインスタンスと関連リソースは、選択したセキュリティグループに追加されます。 説明 高度なセキュリティグループを選択し、次のインバウンドセキュリティグルーパールールを追加することをお勧めします。
| ECSコンソールのセキュリティグループページでセキュリティグループを作成および表示し、選択したVPC内のセキュリティグループを選択できます。 |
VNodeを作成するには、次の表に示すように、ネイティブKubernetesノードの標準権限とVNodeの追加権限を設定する必要があります。
タイプ | 権限 | 説明 |
標準権限 | system:node | ノードの標準権限。 |
system:node-proxier | kube-proxyの標準権限。 | |
system:certificates.k8s.io:certificatesigningrequests:nodeclient | ノードが証明書作成要求を開始するための権限。 | |
system:certificates.k8s.io:certificatesigningrequests:selfnodeclient | ノードが既存の証明書に基づいて証明書作成要求を開始するための権限。この権限は、証明書のローテーションを要求するためのものです。 | |
追加権限 | pods update and pods patch | Podのアノテーションを更新するための権限。たとえば、 |
pvc update and pvc patch | PersistentVolumeClaim (PVC) のアノテーションを更新するための権限。 | |
endpoints create and endpoints update | リーダー選出の保証。 v1.13以降のクラスターでは、これらの権限を設定する必要はありません。 |
kubeconfig証明書を生成するようにクラスターを設定する
自己管理型KubernetesクラスターにVNodeをデプロイするには、kubeconfig証明書を使用する必要があります。VNodeを作成する前に、VNodeのkubeconfig証明書を生成する必要があります。
管理証明書を使用する場合は、このセクションをスキップしてください。
Kubernetesクラスターに接続します。
設定スクリプトをダウンロードして実行し、kubeconfig証明書を生成します。
TLSブートストラップまたはServiceAccountモードでは、Kubernetesクラスターのバージョンに基づいて適切なコマンドを実行してkubeconfig証明書を生成します。TLSはTransport Layer Securityの略です。
TLSブートストラップ
セキュリティ要件がある場合は、TLSブートストラップモードを使用することをお勧めします。このモードでは、vnode-approverコンポーネントが自動的にデプロイされます。vnode-approverコンポーネントは、VNodeから送信された証明書署名要求 (CSR) を承認するために使用されます。vnode-approverはGitHubでオープンソースコードを持っています。詳細については、vnode-approverを参照してください。
クラスターバージョンが1.14から1.22の場合は、次のコマンドを実行してkubeconfig証明書を生成します。
curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | bash -s -- bootstrap
クラスターバージョンが1.13の場合は、次のコマンドを実行してkubeconfig証明書を生成します。
v1.13のクラスターの場合、エンドポイントリソースはリーダーを選択する必要があります。スクリプトでEXTRA_PRIVILEDGE = trueを設定することにより、追加の権限を設定する必要があります。
curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | env EXTRA_PRIVILEDGE=true bash -s -- bootstrap
ServiceAccount
このモードは証明書のローテーションをサポートしていません。kubeconfig証明書を生成するときは、kubeconfigの有効期限切れによるVNodeの障害を防ぐために、トークンに十分な長さまたは永続的な有効期間があることを確認してください。
クラスターバージョンが1.14から1.22の場合は、次のコマンドを実行してkubeconfig証明書を生成します。
curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | bash -s -- common
クラスターバージョンが1.13の場合は、次のコマンドを実行してkubeconfig証明書を生成します。
v1.13のクラスターの場合、エンドポイントリソースはリーダーを選択する必要があります。スクリプトでEXTRA_PRIVILEDGE = trueを設定することにより、追加の権限を設定する必要があります。
curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | env EXTRA_PRIVILEDGE=true bash -s -- common
kubeconfigの内容を表示します。
生成されたkubeconfigの名前はvnode-configです。次のコマンドを実行して、kubeconfigの内容を表示します。
cat vnode-config
kubeconfigの内容を表示するときは、次の項目に注意してください。
VNodeが属するVPCがサーバーに接続できることを確認してください。VPCがサーバーに接続できるようにするには、VNodeとサーバーが同じVPCに存在するか、VPCとサーバー間の接続が確立されている必要があります。
サーバーアドレスがIPアドレスの場合は、VNodeが存在するVPCからそのIPアドレスにアクセスできることを確認してください。
サーバーアドレスがドメイン名の場合、Alibaba Cloud VPCでドメイン名を解決できることを確認してください。さらに、VNodeが存在するVPCから、ドメイン名が指すIPアドレスにアクセスできる必要があります。
certificate-authority-data
の内容が空の場合は、〜/ .kube / config
でPATHフィールドが使用されているかどうかを確認してください。
次のコードは、kubeconfigのサンプルコンテンツを提供します。
TLSブートストラップ
apiVersion: v1 kind: Config current-context: kubernetes-admin@kubernetes contexts: - name: kubernetes-admin@kubernetes context: cluster: kubernetes-admin@kubernetes user: vnode namespace: kube-system clusters: - name: kubernetes-admin@kubernetes cluster: certificate-authority-data: "*****************************************==" server: https://10.16.XX.XX:6443 users: - name: vnode user: token: ******.****************
ServiceAccount
apiVersion: v1 kind: Config current-context: kubernetes-admin@kubernetes contexts: - name: kubernetes-admin@kubernetes context: cluster: kubernetes-admin@kubernetes user: vnode namespace: kube-system clusters: - name: kubernetes-admin@kubernetes cluster: certificate-authority-data: "*****************************************==" server: https://10.16.XX.XX:6443 users: - name: vnode user: token: ***********************************************
VNodeを作成する
手順
Elastic Container Instanceコンソールを使用するか、APIオペレーションを呼び出してVNodeを作成できます。
Elastic Container Instanceコンソールの使用
Elastic Container Instanceコンソールにログインします。
上部のナビゲーションバーで、リージョンを選択します。
左側のナビゲーションペインで、仮想ノードをクリックします。
仮想ノードの作成をクリックします。
パラメータを設定し、OKをクリックします。
次の表にパラメータを示します。
パラメータ
説明
VPC、vSwitch、およびセキュリティグループ
VNodeが属するVPCとセキュリティグループ。VNodeに関連付けられているvSwitch。VPC、vSwitch、およびセキュリティグループの作成方法については、このトピックの「準備」セクションを参照してください。
KubeConfig
VNodeがデプロイされているKubernetesクラスターのkubeconfig証明書。kubeconfig証明書の生成方法については、このトピックの「クラスターを設定してkubeconfig証明書を生成する」セクションを参照してください。
TlsBootstrapEnabled
TLSブートストラップを有効にするかどうかを指定します。
TLSブートストラップモードを使用してkubeconfig証明書が生成されている場合は、VNodeを作成するときにTLSストラップを有効にします。TLSストラップを有効にすると、証明書のローテーションも有効になります。現在のkubeconfig証明書の有効期限が切れそうになると、システムはVNodeの新しいkubeconfig証明書を自動的に申請します。
タグ
VNodeにバインドされているタグ。
タグを使用して分割請求を管理できます。カスタムタグをVNodeにバインドした後、料金分析を表示するときに、タグを使用してVNode内のインスタンスの課金料金をフィルタリングできます。詳細については、タグに基づいて分割請求を表示するを参照してください。
テイント
VNodeにバインドされているテイント。
リソースグループ
リソースグループは、Alibaba Cloudアカウントでリソースをグループで管理するメカニズムです。各Alibaba Cloudアカウントには、デフォルトのリソースグループが割り当てられています。詳細については、リソース管理とはを参照してください。
リソースグループを指定しない場合、VNodeはデフォルトのリソースグループに追加されます。
APIオペレーションの呼び出し
CreateVirtualNode APIオペレーションを呼び出してVNodeを作成できます。次の表に主要なパラメータを示します。詳細については、CreateVirtualNodeを参照してください。
パラメータ | タイプ | 例 | 説明 |
RegionId | String | cn-shanghai | VNodeのリージョンID。 |
VSwitchId | String | vsw-2ze23nqzig8inprou**** | vSwitch ID。vSwitchはVNodeおよびVNode内のエラスティックコンテナインスタンスに関連付けられています。 VPCに1〜10個のvSwitchを指定できます。 |
SecurityGroupId | String | sg-2ze81zoc3yl7a3we**** | セキュリティグループのID。セキュリティグループを指定します。VNodeおよびVNode内のエラスティックコンテナインスタンスは、セキュリティグループに追加されます。 |
KubeConfig | String | JTVDbmFwaVZlcnNpb24lM0ElMjB2MSU1Q25jbHVzdGVycyUzQSU1Q24tJTIwY2x1c3RlciUzQSU1Q24uLi****** | VNodeがデプロイされているKubernetesクラスターのkubeconfig証明書。値はBase64エンコードされている必要があります。 |
TlsBootstrapEnabled | Boolean | true | TLSブートストラップを有効にするかどうかを指定します。TLSブートストラップモードを使用してkubeconfig証明書が生成されている場合は、VNodeを作成するときにTLSストラップを有効にします。TLSストラップを有効にすると、証明書のローテーションも有効になります。現在のkubeconfig証明書の有効期限が切れそうになると、システムはVNodeの新しいkubeconfig証明書を自動的に申請します。 |
結果を確認する
VNodeを作成してから数分待ちます。次に、Kubernetesクラスターにログインし、kubectl get nodes
コマンドを実行して、ノードの情報を表示します。
VNodeの情報が表示されている場合は、VNodeが作成されています。次のコマンド出力が返されます。
VNodeの情報が表示されない場合は、VNodeの作成に失敗しています。VNode関連のイベントに基づいて問題のトラブルシューティングを行うことをお勧めします。
Elastic Container Instanceコンソールの仮想ノードページで、作成に失敗したVNodeのIDをクリックします。イベントタブで、VNodeに関するイベントを表示できます。
一般的なイベントエラー:
failed to get kubernetes server version, Get \"https://10.50.XX.XX:6443/version?timeout=32s\": net/http: request canceled (Client.Timeout exceeded while awaiting headers
このエラーメッセージは、VNodeが属するVPCがKubernetes APIサーバーに接続できないことを示しています。この問題を解決するには、VNodeとAPIサーバーが同じVPCに存在するかどうかを確認します。同じVPCにない場合は、VNodeが属するVPCとAPIサーバー間の接続が確立されていることを確認してください。
failed to get kubernetes server version, Get \"https://lb.kubesphere.local:6443/version?timeout=32s\": dial tcp: lookup lb.kubesphere.local on 100.100.X.:53: no such host
このエラーメッセージは、Kubernetes APIサーバーのドメイン名をAlibaba Cloud VPCで解決できないことを示しています。Alibaba Cloud DNS PrivateZoneを使用してドメイン名を解決できます。
自己管理型KubernetesクラスターにVNodeをデプロイする際に要件がある場合、または問題が発生した場合は、ID 44666389のDingTalkグループに参加してサポートを受けることができます。
DaemonSetがVNodeにスケジュールされないようにする
VNodeは実際のノードではないため、DaemonSetはVNodeで実行できません。VNodeを作成した後、kube-proxyのDaemonSetを変更し、nodeAffinityを設定してDaemonSetがVNodeにスケジュールされないようにする必要があります。
DaemonSetの構成を変更します。
kubectl -n kube-system edit ds kube-proxy
nodeAffinityを設定します。
次のYAMLコンテンツをspec> template> specに追加します。
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: type operator: NotIn values: - virtual-kubelet
PodをVNodeにスケジュールする
VNodeを作成した後、次のいずれかの方法を使用してPodをVNodeにスケジュールできます。その後、PodをVNodeのエラスティックコンテナインスタンスとして実行できます。
手動スケジューリング
nodeSelectorおよびtolerationsパラメータを設定するか、nodeNameパラメータを指定して、PodをVNodeにスケジュールできます。詳細については、PodをVNodeにスケジュールするを参照してください。
自動スケジューリング
eci-profileコンポーネントをデプロイした後、Selectorパラメータを指定できます。このようにして、システムはSelectorで指定された条件を満たすPodをVNodeに自動的にスケジュールします。詳細については、eci-profileを使用してPodをVNodeにスケジュールするを参照してください。