ベアメタル版 Anthos クラスタでは、スタンドアロン クラスタがワークロードを実行して自身を管理しますが、他のクラスタは管理できません。スタンドアロン クラスタでは、リソース制限のあるシナリオで、個別の管理クラスタを実行する必要性が解消されます。
スタンドアロン クラスタを作成する場合、リソースの削減と全体のセキュリティにはいくつかのトレードオフがあります。スタンドアロン クラスタはクラスタ自身を管理するため、同じクラスタ上でワークロードを実行すると、SSH 認証鍵などの機密性の高い管理データが公開されるセキュリティ リスクが高まります。
コントロール プレーンが 1 つのスタンドアロン クラスタは、bmctl
コマンドを使用して作成します。bmctl
コマンドは、別のワークステーションやスタンドアロンのクラスタノードで実行できます。なお、この構成では縮小したリソースを使用しており、高可用性(HA)は提供されないため、結果として生成されるクラスタは単一障害点になります。
スタンドアロン モードでの高可用性(HA)クラスタの作成も可能です。HA スタンドアロン クラスタでは、1 つのノードに障害が発生した場合、他のノードが障害の発生したノードの代わりをします。HA クラスタを作成するには、コントロール プレーンとして複数のノードを指定します。
事前準備
- 最新の
bmctl
が Cloud Storage からダウンロードされている(gs://anthos-baremetal-release/bmctl/1.7.7/linux-amd64/bmctl
)。 bmctl
を実行するワークステーションが、ターゲットのスタンドアロン クラスタ内のすべてのノードとネットワークで接続されている。bmctl
を実行するワークステーションは、ターゲット スタンドアロン クラスタのコントロール プレーンの VIP とネットワークで接続されている。- スタンドアロン クラスタの作成に使用される SSH 認証鍵が root で使用可能、またはターゲット スタンドアロン クラスタ内のすべてのノードに対して SUDO のユーザー アクセス権がある。
- 1.7.0 以降のバージョンの場合、Connect で使用できるように、Connect-register サービス アカウントが構成されている。
gcloud にログインし、スタンドアロン クラスタ構成ファイルを作成する
gcloud auth application-default
ログインを使用して、ユーザーとして gcloud にログインします。- サービス アカウント管理者
- サービス アカウント キー管理者
- プロジェクト IAM 管理者
- Compute 閲覧者
- Service Usage 管理者
- クラスタ作成に使用する Cloud プロジェクト ID を取得します。
gcloud auth application-default login
export GOOGLE_APPLICATION_CREDENTIALS=JSON_KEY_FILE
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 秘密鍵を指定します。
# 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
1.7.0 以降のバージョンでは、クラスタをプロジェクト フリートに対する Connect に登録する必要があります。
- 構成ファイルを作成し、自動 API 有効化とサービス アカウント作成機能を使用している場合は、この手順を省略できます。
- API の自動有効化機能とサービス アカウント作成機能を使用せずに構成ファイルを作成した場合は、ダウンロードしたサービス アカウント JSON キーを、クラスタ構成ファイルの対応する
gkeConnectAgentServiceAccountKeyPath
およびgkeConnectRegisterServiceAccountKeyPath
フィールドで参照します。
構成ファイルを変更して、クラスタタイプに
admin
ではなくstandalone
を指定します。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
(省略可)マルチノード、高可用性、コントロール プレーンを指定するように構成を変更します。HA の過半数のクォーラムを持てるノードの数を奇数とします。
# 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
クラスタノードの Pod 密度とコンテナ ランタイムを指定します。
.... # NodeConfig specifies the configuration that applies to all nodes in the cluster. nodeConfig: # podDensity specifies the pod density configuration. podDensity: # maxPodsPerNode specifies at most how many pods can be run on a single node. maxPodsPerNode: 250 # containerRuntime specifies which container runtime to use for scheduling containers on nodes. # containerd and docker are supported. containerRuntime: containerd ....
スタンドアロン クラスタの場合、
maxPodsPerNode
の値は、HA クラスタ用には32-250
、HA 以外のクラスタ用には64-250
です。指定しない場合、デフォルトの110
が使用されます。クラスタの作成後、この値を更新することはできません。Pod 密度も、クラスタで使用可能な IP リソースによって制限されます。詳しくは、Pod ネットワークをご覧ください。
クラスタ構成ファイルでスタンドアロン クラスタを作成する
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.7.7
# 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 virtual IPs 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/20
# 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 load balancer 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 virtual IP (VIP) addresses: 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.
# These IP addresses do not correspond to physical network interfaces.
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 node pool 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
# 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
# NodeConfig specifies the configuration that applies to all nodes in the cluster.
nodeConfig:
# podDensity specifies the pod density configuration.
podDensity:
# maxPodsPerNode specifies at most how many pods can be run on a single node.
maxPodsPerNode: 250
# containerRuntime specifies which container runtime to use for scheduling containers on nodes.
# containerd and docker are supported.
containerRuntime: containerd
# KubeVirt configuration, uncomment this section if you want to install kubevirt to the cluster
# kubevirt:
# # if useEmulation is enabled, hardware accelerator (i.e relies on cpu feature like vmx or svm)
# # will not be attempted. QEMU will be used for software emulation.
# # useEmulation must be specified for KubeVirt installation
# useEmulation: false
# 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>
# # proxy specifies the proxy server to use for the cluster to connect to your OIDC provider, if applicable.
# # Example: https://user:password@10.10.10.10:8888. If left blank, this defaults to no proxy.
# proxy: <Proxy server to use for the cluster to connect to your OIDC provider; optional, default is no proxy>
# # deployCloudConsoleProxy specifies whether to deploy a reverse proxy in the cluster to allow Google Cloud
# # Console access to the on-premises OIDC provider for authenticating users. If your identity provider is not
# # reachable over the public internet, and you wish to authenticate using Google Cloud console, then this field
# # must be set to true. If left blank, this field defaults to false.
# deployCloudConsoleProxy: <Whether to deploy a reverse proxy for Google Cloud console authentication; 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.
# # However, if deployCloudConsoleProxy is true, then this value must be provided, even for 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