ベアメタル版 Anthos クラスタでは、スタンドアロン クラスタがワークロードを実行して自身を管理しますが、他のクラスタは管理できません。スタンドアロン クラスタでは、リソース制限のあるシナリオで、個別の管理クラスタを実行する必要性が解消されます。
スタンドアロン クラスタを作成する場合、リソースの削減と全体のセキュリティにはいくつかのトレードオフがあります。スタンドアロン クラスタはクラスタ自身を管理するため、同じクラスタ上でワークロードを実行すると、SSH 認証鍵などの機密性の高い管理データが公開されるセキュリティ リスクが高まります。
コントロール プレーンが 1 つのスタンドアロン クラスタは、bmctl
コマンドを使用して作成します。bmctl
コマンドは、別のワークステーションやスタンドアロンのクラスタノードで実行できます。なお、この構成では縮小したリソースを使用しており、高可用性(HA)は提供されないため、結果として生成されるクラスタは単一障害点になります。
スタンドアロン モードでの高可用性(HA)クラスタの作成も可能です。HA スタンドアロン クラスタでは、1 つのノードに障害が発生した場合、他のノードが障害の発生したノードの代わりをします。HA クラスタを作成するには、コントロール プレーンとして複数のノードを指定します。
事前準備
gs://anthos-baremetal-release/bmctl/1.6.2/linux-amd64/bmctl
からダウンロードしたbmctl
bmctl
を実行しているワークステーションは、対象となるスタンドアロン クラスタのすべてのノードとネットワーク接続されている必要があります。bmctl
を実行しているワークステーションは、対象となるスタンドアロン クラスタのコントロール プレーン VIP とネットワーク接続されている必要があります。- スタンドアロン クラスタの作成に使用される SSH 認証鍵は、対象となるスタンドアロン クラスタのすべてのノードで root ユーザーまたは SUDO ユーザーとして使用可能である必要があります。
gcloud にログインし、スタンドアロン クラスタ構成ファイルを作成する
gcloud auth application-default
ログインを使用して、ユーザーとして gcloud にログインします。- サービス アカウント管理者
- サービス アカウント キー管理者
- プロジェクト IAM 管理者
- Compute 閲覧者
- Service Usage 管理者
- クラスタ作成に使用する Cloud プロジェクト ID を取得します。
gcloud auth application-default login以下で説明する自動 API 有効化とサービス アカウント作成機能を使用するには、プロジェクト オーナーまたは編集者のロールが必要です。次の IAM ロールをユーザーに追加することもできます。
export GOOGLE_APPLICATION_CREDENTIALS=JSON_KEY_FILEJSON_KEY_FILE には、サービス アカウントの JSON キーファイルへのパスを指定します。
export CLOUD_PROJECT_ID=$(gcloud config get-value project)
bmctl
を使用してスタンドアロン クラスタ構成ファイルを作成する
gcloud にログインしてプロジェクトを設定すると、bmctl
コマンドを使用してクラスタ構成ファイルを作成できます。この例では、すべてのサービス アカウントは、bmctl create config
コマンドで自動的に作成されます。
bmctl create config -c STANDALONE_CLUSTER_NAME --enable-apis \ --create-service-accounts --project-id=CLOUD_PROJECT_ID
次の例では、プロジェクト ID my-gcp-project
に関連付けられた standalone1
という名前のスタンドアロン クラスタの構成ファイルを作成しています。
bmctl create config -c standalone1 --create-service-accounts --project-id=my-gcp-project
ファイルは、bmctl-workspace/standalone1/standalone1.yaml
に書き込まれます。
API を自動的に有効にしてサービス アカウントを作成する代わりに、既存のサービス アカウントに適切な IAM 権限を付与することもできます。つまり、サービス アカウントを自動で作成した前の手順の次の bmctl
コマンドはスキップできます。
bmctl create config -c standalone1
クラスタ構成ファイルを編集する
クラスタ構成ファイルが完成したら、次のように修正します。
- スタンドアロン クラスタノードにアクセスするための SSH 秘密鍵を指定します。
- クラスタタイプを
admin
ではなくstandalone
と指定するように構成を変更します。 - (省略可)マルチノード、高可用性、コントロール プレーンを指定するように構成を変更します。HA の過半数のクォーラムを持てるノードの数を奇数とします。
# bmctl configuration variables. Because this section is valid YAML but not a valid Kubernetes # resource, this section can only be included when using bmctl to # create the initial admin/hybrid cluster. Afterwards, when creating user clusters by directly # applying the cluster and node pool resources to the existing cluster, you must remove this # section. gcrKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-gcr.json sshPrivateKeyPath: /path/to/your/ssh_private_key gkeConnectAgentServiceAccountKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-connect.json gkeConnectRegisterServiceAccountKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-register.json cloudOperationsServiceAccountKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-cloud-ops.json
spec: # Cluster type. This can be: # 1) admin: to create an admin cluster. This can later be used to create user clusters. # 2) user: to create a user cluster. Requires an existing admin cluster. # 3) hybrid: to create a hybrid cluster that runs admin cluster components and user workloads. # 4) standalone: to create a cluster that manages itself, runs user workloads, but does not manage other clusters. type: standalone
# Control plane configuration controlPlane: nodePoolSpec: nodes: # Control plane node pools. Typically, this is either a single machine # or 3 machines if using a high availability deployment. - address: 10.200.0.4 - address: 10.200.0.5 - address: 10.200.0.6
クラスタ構成ファイルでスタンドアロン クラスタを作成する
bmctl
コマンドを使用して、スタンドアロン クラスタをデプロイします。
bmctl create cluster -c CLUSTER_NAME
CLUSTER_NAME は、前のセクションで作成したクラスタの名前を指定します。
standalone1
という名前のクラスタを作成するコマンドの例を次に示します。
bmctl create cluster -c standalone1
完全なスタンドアロン クラスタ構成の例
bmctl
コマンドで作成されたスタンドアロン クラスタ構成ファイルの例を次に示します。このサンプル構成では、プレースホルダのクラスタ名、VIP、アドレスが使用されていることに注意してください。ネットワークによっては動作しない可能性があります。
gcrKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-gcr.json sshPrivateKeyPath: /bmctl/bmctl-workspace/.ssh/id_rsa gkeConnectAgentServiceAccountKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-connect.json gkeConnectRegisterServiceAccountKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-register.json cloudOperationsServiceAccountKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-cloud-ops.json --- apiVersion: v1 kind: Namespace metadata: name: cluster-standalone1 --- apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: standalone1 namespace: cluster-standalone1 spec: # Cluster type. This can be: # 1) admin: to create an admin cluster. This can later be used to create user clusters. # 2) user: to create a user cluster. Requires an existing admin cluster. # 3) hybrid: to create a hybrid cluster that runs admin cluster components and user workloads. # 4) standalone: to create a cluster that manages itself, runs user workloads, but does not manage other clusters. type: standalone # Anthos cluster version. anthosBareMetalVersion: 1.6.2 # GKE connect configuration gkeConnect: projectID: $GOOGLE_PROJECT_ID # Control plane configuration controlPlane: nodePoolSpec: nodes: # Control plane node pools. Typically, this is either a single machine # or 3 machines if using a high availability deployment. - address: 10.200.0.4 # Cluster networking configuration clusterNetwork: # Pods specify the IP ranges from which Pod networks are allocated. pods: cidrBlocks: - 192.168.0.0/16 # Services specify the network ranges from which service VIPs are allocated. # This can be any RFC 1918 range that does not conflict with any other IP range # in the cluster and node pool resources. services: cidrBlocks: - 10.96.0.0/12 # Load balancer configuration loadBalancer: # Load balancer mode can be either 'bundled' or 'manual'. # In 'bundled' mode a load balancer will be installed on load balancer nodes during cluster creation. # In 'manual' mode the cluster relies on a manually-configured external load balancer. mode: bundled # Load balancer port configuration ports: # Specifies the port the LB serves the kubernetes control plane on. # In 'manual' mode the external load balancer must be listening on this port. controlPlaneLBPort: 443 # There are two load balancer VIPs: one for the control plane and one for the L7 Ingress # service. The VIPs must be in the same subnet as the load balancer nodes. vips: # ControlPlaneVIP specifies the VIP to connect to the Kubernetes API server. # This address must not be in the address pools below. controlPlaneVIP: 10.200.0.71 # IngressVIP specifies the VIP shared by all services for ingress traffic. # Allowed only in non-admin clusters. # This address must be in the address pools below. ingressVIP: 10.200.0.72 # AddressPools is a list of non-overlapping IP ranges for the data plane load balancer. # All addresses must be in the same subnet as the load balancer nodes. # Address pool configuration is only valid for 'bundled' LB mode in non-admin clusters. addressPools: - name: pool1 addresses: # Each address must be either in the CIDR form (1.2.3.0/24) # or range form (1.2.3.1-1.2.3.5). - 10.200.0.72-10.200.0.90 # A load balancer nodepool can be configured to specify nodes used for load balancing. # These nodes are part of the kubernetes cluster and run regular workloads as well as load balancers. # If the node pool config is absent then the control plane nodes are used. # Node pool configuration is only valid for 'bundled' LB mode. # nodePoolSpec: # nodes: # - address: <Machine 1 IP> # Proxy configuration # proxy: # url: http://[username:password@]domain # # A list of IPs, hostnames or domains that should not be proxied. # noProxy: # - 127.0.0.1 # - localhost # Logging and Monitoring clusterOperations: # Cloud project for logs and metrics. projectID: <Google Project ID>$GOOGLE_PROJECT_ID # Cloud location for logs and metrics. location: us-central1 # Whether collection of application logs/metrics should be enabled (in addition to # collection of system logs/metrics which correspond to system components such as # Kubernetes control plane or cluster management agents). # enableApplication: false # Storage configuration storage: # lvpNodeMounts specifies the config for local PersistentVolumes backed by mounted disks. # These disks need to be formatted and mounted by the user, which can be done before or after # cluster creation. lvpNodeMounts: # path specifies the host machine path where mounted disks will be discovered and a local PV # will be created for each mount. path: /mnt/localpv-disk # storageClassName specifies the StorageClass that PVs will be created with. The StorageClass # is created during cluster creation. storageClassName: local-disks # lvpShare specifies the config for local PersistentVolumes backed by subdirectories in a shared filesystem. # These subdirectories are automatically created during cluster creation. lvpShare: # path specifies the host machine path where subdirectories will be created on each host. A local PV # will be created for each subdirectory. path: /mnt/localpv-share # storageClassName specifies the StorageClass that PVs will be created with. The StorageClass # is created during cluster creation. storageClassName: local-shared # numPVUnderSharedPath specifies the number of subdirectories to create under path. numPVUnderSharedPath: 5 # Authentication; uncomment this section if you wish to enable authentication to the cluster with OpenID Connect. # authentication: # oidc: # # issuerURL specifies the URL of your OpenID provider, such as "https://accounts.google.com". The Kubernetes API # # server uses this URL to discover public keys for verifying tokens. Must use HTTPS. # issuerURL: <URL for OIDC Provider; required> # # clientID specifies the ID for the client application that makes authentication requests to the OpenID # # provider. # clientID: <ID for OIDC client application; required> # # clientSecret specifies the secret for the client application. # clientSecret: <Secret for OIDC client application; optional> # # kubectlRedirectURL specifies the redirect URL (required) for the gcloud CLI, such as # # "http://localhost:[PORT]/callback". # kubectlRedirectURL: <Redirect URL for the gcloud CLI; optional default is "http://kubectl.redirect.invalid" # # username specifies the JWT claim to use as the username. The default is "sub", which is expected to be a # # unique identifier of the end user. # username: <JWT claim to use as the username; optional, default is "sub"> # # usernamePrefix specifies the prefix prepended to username claims to prevent clashes with existing names. # usernamePrefix: <Prefix prepended to username claims; optional> # # group specifies the JWT claim that the provider will use to return your security groups. # group: <JWT claim to use as the group name; optional> # # groupPrefix specifies the prefix prepended to group claims to prevent clashes with existing names. # groupPrefix: <Prefix prepended to group claims; optional> # # scopes specifies additional scopes to send to the OpenID provider as a comma-delimited list. # scopes: Additional scopes to send to OIDC provider as a comma-separated list; optional> # # extraParams specifies additional key-value parameters to send to the OpenID provider as a comma-delimited # # list. # extraParams: Additional key-value parameters to send to OIDC provider as a comma-separated list; optional> # # certificateAuthorityData specifies a Base64 PEM-encoded certificate authority certificate of your identity # # provider. It's not needed if your identity provider's certificate was issued by a well-known public CA. # certificateAuthorityData: Base64 PEM-encoded certificate authority certificate of your OIDC provider; optional> # Node access configuration; uncomment this section if you wish to use a non-root user # with passwordless sudo capability for machine login. # nodeAccess: # loginUser: login user name --- # Node pools for worker nodes apiVersion: baremetal.cluster.gke.io/v1 kind: NodePool metadata: name: node-pool-1 namespace: cluster-standalone1 spec: clusterName: standalone1 nodes: - address: 10.200.0.5 - address: 10.200.0.6