オンプレミスデータセンター (IDC) または Alibaba Cloud ECS インスタンスで実行されている自己管理型 Kubernetes クラスターがある場合、Elastic Container Instance (ECI) を使用するには、クラスターに仮想ノード (VNode) をデプロイする必要があります。このトピックでは、証明書を設定し、自己管理型 Kubernetes クラスター用に VNode を手動で作成する方法について説明します。
前提条件
-
Kubernetes クラスターのバージョンが 1.16 から 1.30 であること。
-
Kubernetes クラスターがオンプレミスデータセンターにデプロイされている場合は、データセンターネットワークが Express Connect、Smart Access Gateway (SAG)、または VPN Gateway を介して Alibaba Cloud ネットワークに接続されていることを確認してください。詳細については、次のトピックをご参照ください。
事前準備
VNode を作成する前に、必要なパラメーターを収集し、必要な権限を確認してください。次の表に、必要なパラメーターを示します。
|
パラメーター |
説明 |
取得方法 |
|
region |
リージョンは物理的なデータセンターです。ご利用の場所、ターゲットユーザーの場所、リソース価格などの要因に基づいてリージョンを選択します。詳細については、「リージョンと可用性ゾーン」をご参照ください。 ECI とその関連リソースは、選択したリージョンに作成されます。 |
ECI がサポートするリージョンは、Elastic Container Instance コンソールで確認するか、DescribeRegions オペレーションを呼び出して確認できます。 |
|
VPC |
VPC は、Alibaba Cloud 上に作成するカスタムプライベートネットワークです。VPC は互いに論理的に分離されています。詳細については、「VPC とは」をご参照ください。 ECI とその関連リソースは、設定した VPC 内に作成されます。 説明
Kubernetes クラスターがオンプレミスデータセンターにデプロイされている場合は、データセンターネットワークがこの VPC に到達できることを確認してください。 |
VPC は、VPC コンソールの VPC ページで作成および表示できます。 |
|
vSwitch |
vSwitch は、VPC 内のさまざまなクラウドリソースを接続する基本的なネットワークデバイスです。VPC 内に ECI とその関連リソースを作成する場合、1 つ以上の vSwitch を指定する必要があり、システムが自動的に 1 つを選択します。 |
vSwitch は、VPC コンソールの vSwitch ページで作成および表示できます。選択した VPC に属する vSwitch を選択します。 |
|
security group |
セキュリティグループは、グループ内のリソースのインバウンドおよびアウトバウンドトラフィックを制御してネットワークセキュリティを向上させる仮想ファイアウォールです。詳細については、「セキュリティグループの概要」をご参照ください。 ECI とその関連リソースは、セキュリティグループに追加されます。 説明
エンタープライズセキュリティグループを使用し、次のインバウンドルールを追加することを推奨します。
|
セキュリティグループは、ECS コンソールの Security Group ページで作成および表示できます。選択した VPC に属するセキュリティグループを選択します。 |
VNode を作成する際には、必要な権限を設定する必要があります。これらには、ネイティブの Kubernetes ノードで使用される標準権限と、次の表で説明する VNode 固有の追加権限が含まれます。
|
タイプ |
権限 |
説明 |
|
標準権限 |
system:node |
標準のノード権限。 |
|
system:node-proxier |
標準の kube-proxy 権限。 |
|
|
system:certificates.k8s.io:certificatesigningrequests:nodeclient |
ノードが証明書署名要求 (CSR) を作成することを許可します。 |
|
|
system:certificates.k8s.io:certificatesigningrequests:selfnodeclient |
ノードが既存の証明書に基づいて新しい証明書を要求することを許可します。これにより、証明書のローテーションが可能になります。 |
|
|
追加権限 |
pods update および pods patch |
VNode が Pod アノテーションを更新することを許可します。たとえば、 |
|
pvc update および pvc patch |
VNode が PersistentVolumeClaim (PVC) アノテーションを更新することを許可します。 |
クラスターの設定
VNode は kubeconfig ファイルを使用してクラスターに接続します。したがって、VNode を作成する前に、VNode 用の証明書 (kubeconfig) を発行する必要があります。
クラスターの管理者証明書を使用する場合は、このセクションをスキップできます。
-
クラスターに接続します。
-
設定スクリプトをダウンロードして実行します。TLS ブートストラップまたは ServiceAccount を選択して kubeconfig ファイルを生成します。
TLS ブートストラップ
セキュリティを強化するため、TLS ブートストラップを推奨します。このメソッドは、vnode-approver コンポーネントを自動的にデプロイします。このコンポーネントは、VNode によって送信された CSR に署名し、GitHub でオープンソースとして公開されています。詳細については、「vnode-approver」をご参照ください。
curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | bash -s -- bootstrapServiceAccount
このメソッドは証明書のローテーションをサポートしていません。トークンの有効期間が長いか、無期限であることを確認してください。これにより、証明書の有効期限切れによって VNode が利用できなくなるのを防ぎます。
curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | bash -s -- common -
kubeconfig ファイルを確認します。
生成された kubeconfig ファイルの名前は vnode-config です。次のコマンドを実行してファイルを表示します。
cat vnode-configファイルを確認する際は、次の点を確認してください。
-
VNode が作成される VPC がサーバーアドレスに到達できることを確認してください (たとえば、同じ VPC 内にあるか、ネットワークで接続されている)。
-
サーバーアドレスが IP アドレスの場合、VNode の VPC からアクセス可能である必要があります。
-
サーバーアドレスがドメイン名の場合、Alibaba Cloud VPC 内で解決可能であり、結果の IP アドレスが VNode の VPC からアクセス可能である必要があります。
-
-
certificate-authority-dataパラメーターが空の場合、~/.kube/configファイルの対応するフィールドがファイルパスを使用しているかどうかを確認してください。
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 の作成
操作手順
VNode は、Elastic Container Instance コンソールで作成するか、API オペレーションを呼び出して作成できます。
コンソール
-
Elastic Container Instance コンソールにログインします。
-
上部のナビゲーションバーで、リージョンを選択します。
-
左側のナビゲーションウィンドウで、[仮想ノード] を選択します。
-
[仮想ノードの作成] をクリックします。
-
パラメーターを設定し、[OK] をクリックします。
次の表にパラメーターを示します。
パラメーター
説明
VPC、vSwitch、セキュリティグループ
VNode の VPC、vSwitch、およびセキュリティグループ。これらのリソースは、「事前準備」セクションで説明されているように準備する必要があります。
KubeConfig
VNode が接続する Kubernetes クラスターの kubeconfig。このファイルは、「クラスターの設定」セクションで説明されているように生成する必要があります。
TlsBootstrapEnabled
TLS ブートストラップを有効にするかどうかを指定します。
TLS ブートストラップメソッドを使用して kubeconfig ファイルを生成した場合は、このパラメーターを有効にします。これにより、証明書のローテーションも有効になり、VNode は現在の証明書が期限切れになる前に自動的に新しい証明書を要求できるようになります。
Tags
VNode にバインドするタグ。
タグを使用してコスト配分を行うことができます。カスタムタグを VNode にバインドした後、コスト分析中にタグを使用して VNode のインスタンスコストをフィルターできます。詳細については、「タグに基づいて分割請求書を表示する」をご参照ください。
Taints
VNode に適用する Taint。
resource group
リソースグループは、Alibaba Cloud アカウント (root ユーザー) の下でリソースをグループ化するために使用できる機能です。各アカウントにはデフォルトのリソースグループがあります。詳細については、「Resource Management」をご参照ください。
リソースグループを指定しない場合、VNode はデフォルトのリソースグループに追加されます。
API
CreateVirtualNode オペレーションを呼び出して VNode を作成できます。次の表に、主要なパラメーターを示します。詳細については、「CreateVirtualNode」をご参照ください。
|
名前 |
タイプ |
例 |
説明 |
|
RegionId |
String |
cn-shanghai |
リージョン ID。 |
|
VSwitchId |
String |
vsw-2ze23nqzig8inprou**** |
VNode とその ECI インスタンスが使用する vSwitch の ID。 同じ VPC に属する 1 から 10 個の vSwitch を指定できます。 |
|
SecurityGroupId |
String |
sg-2ze81zoc3yl7a3we**** |
セキュリティグループ ID。VNode とその ECI インスタンスはこのセキュリティグループに追加されます。 |
|
KubeConfig |
String |
JTVDbmFwaVZlcnNpb24lM0ElMjB2MSU1Q25jbHVzdGVycyUzQSU1Q24tJTIwY2x1c3RlciUzQSU1Q24uLi****** |
VNode の Kubernetes クラスターの kubeconfig。値は Base64 エンコードされている必要があります。 |
|
TlsBootstrapEnabled |
Boolean |
true |
TLS ブートストラップメソッドを使用して kubeconfig ファイルを生成した場合は、このパラメーターを有効にします。これにより、証明書のローテーションも有効になり、VNode は現在の証明書が期限切れになる前に自動的に新しい証明書を要求できるようになります。 |
結果の確認
VNode を作成した後、しばらく待ちます。その後、Kubernetes クラスターにログインし、kubectl get nodes コマンドを実行してノード情報を表示します。
-
VNode が見つかった場合、正常に作成されています。期待される出力は次のようになります。
[root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION cn-beijing.vnd-2-xxx.sx61at Ready agent 132m v1.20.6 k8s-master Ready control-plane,master 169m v1.20.6 -
VNode が見つからない場合、作成は失敗しています。VNode イベントに基づいて問題をトラブルシューティングすることを推奨します。
Elastic Container Instance コンソールで、[仮想ノード] ページに移動します。ターゲット VNode の ID をクリックし、[イベント] タブでイベントを表示します。
一般的なイベントエラーは次のとおりです。
-
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 サーバーの IP アドレスに接続できないことを示します。VNode と API サーバーが同じ VPC 内にあることを確認してください。そうでない場合は、ネットワーク接続があることを確認してください。
-
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 サーバーのドメイン名が VPC で解決できないことを示します。Alibaba Cloud DNS PrivateZone を設定して、ドメイン名の DNS レコードを追加できます。
-
VNode を自己管理型 Kubernetes クラスターに接続する際に質問や問題がある場合は、DingTalk グループ 44666389 を検索して VNode サポートグループに参加してください。
DaemonSet の VNode へのスケジューリングの防止
VNode は仮想ノードであり、DaemonSet を実行できません。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 を作成した後、次のメソッドを使用して、VNode 上で ECI インスタンスとして実行するように Pod をスケジューリングできます。
-
手動スケジューリング
nodeSelector と Toleration を設定するか、nodeName を指定することで、Pod を VNode に手動でスケジューリングできます。詳細については、「Pod を VNode にスケジューリングする」をご参照ください。
-
自動スケジューリング
eci-profile コンポーネントをデプロイした後、カスタムセレクターを設定して、一致する Pod を VNode に自動的にスケジューリングできます。詳細については、「eci-profile を使用して Pod を VNode にスケジューリングする」をご参照ください。