Guida rapida di Cluster Anthos su Bare Metal

Con Cluster Anthos on bare metal, puoi definire quattro tipi di cluster:

  • admin: un cluster utilizzato per gestire i cluster utente
  • user: un cluster utilizzato per eseguire carichi di lavoro
  • autonomo: un unico cluster che può amministrare ed eseguire carichi di lavoro, ma che non può creare o gestire altri cluster utente.
  • hybrid: un unico cluster, sia per l'amministratore che per i carichi di lavoro, in grado di gestire anche i cluster utente

In questa guida rapida, eseguirai il deployment di un cluster ibrido a due nodi con Cluster Anthos on bare metal. Imparerai a creare un cluster e a monitorare il processo di creazione del cluster.

Questa guida rapida presuppone che tu abbia una conoscenza di base di Kubernetes.

Prepararsi per Cluster Anthos on bare metal

Prima di creare un cluster in Cluster Anthos su Bare Metal, devi eseguire le seguenti operazioni:

  1. Creare un progetto Google Cloud.
  2. Installa Google Cloud CLI.
  3. Configura una workstation di amministrazione Linux.
  4. Installa lo strumento bmctl.

Creare un progetto Google Cloud

Per questa guida rapida, crea un nuovo progetto Google Cloud che organizzi tutte le tue risorse Google Cloud. Per creare un cluster in Cluster Anthos on bare metal, devi avere un progetto Google Cloud in cui il tuo account abbia uno dei seguenti ruoli:

  • Editor
  • Proprietario

Per i dettagli, consulta Creare e gestire progetti.

Installa Google Cloud CLI

Questa guida rapida utilizza gli strumenti kubectl e bmctl per creare e configurare i cluster. Per installare questi strumenti, occorrono gcloud e gsutil. Google Cloud CLI include gli strumenti a riga di comando gcloud, gsutil e kubectl.

Per installare gli strumenti richiesti:

  1. Sulla workstation di amministrazione, installa e inizializza Google Cloud CLI utilizzando queste istruzioni. Questo processo installa gcloud e gsutil.
  2. Aggiorna Google Cloud CLI:
    gcloud components update
       
  3. Accedi con il tuo Account Google per gestire servizi e account di servizio:

    gcloud auth login --update-adc

    Viene visualizzata una nuova scheda del browser e ti viene chiesto di scegliere un account.

  4. Usa gcloud per installare kubectl:

    gcloud components install kubectl

Configura una workstation di amministrazione Linux

Dopo aver installato gcloud, gsutil e kubectl, configura una workstation di amministrazione Linux. Non utilizzare Cloud Shell come workstation di amministrazione.

  1. Installa Docker versione 19.03 o successive. Per scoprire come configurare Docker, vai alla pagina corrispondente alla tua distribuzione Linux:
  2. Per utilizzare l'accesso root, configura SSH sia sulla workstation di amministrazione che sulle macchine dei nodi del cluster remoto. Inizialmente, è necessario abilitare l'autenticazione tramite password SSH di root sulle macchine dei nodi del cluster remoto per condividere le chiavi dalla workstation di amministrazione. Dopo aver inserito le chiavi, puoi disabilitare l'autenticazione tramite password SSH.
  3. Genera una coppia di chiavi pubblica/privata nella workstation di amministrazione. Non impostare una passphrase per le chiavi. Sono necessarie le chiavi per utilizzare SSH per connettere in modo sicuro e senza password la workstation di amministrazione e le macchine dei nodi del cluster. Genera le chiavi con il comando seguente:

    ssh-keygen -t rsa

    Puoi anche utilizzare l'accesso utente SUDO alle macchine dei nodi del cluster per configurare SSH, ma per le connessioni utente senza password e non radice devi aggiornare il file di configurazione del cluster con le credenziali appropriate. Per maggiori informazioni, vai alla sezione #Node access configuration nel file di configurazione del cluster di esempio.

  4. Aggiungi la chiave pubblica generata alle macchine dei nodi del cluster. Per impostazione predefinita, le chiavi pubbliche sono archiviate nel file di identità id_rsa.pub:
    ssh-copy-id -i ~/.ssh/IDENTITY_FILE root@CLUSTER_NODE_IP
  5. Disabilita l'autenticazione tramite password SSH sulle macchine dei nodi del cluster. Utilizza il comando seguente sulla workstation di amministrazione per verificare che l'autenticazione tramite chiave pubblica funzioni tra la workstation di amministrazione e le macchine dei nodi del cluster.
    ssh -o IdentitiesOnly=yes -i IDENTITY_FILE root@CLUSTER_NODE_IP

Scarica e installa lo strumento bmctl

Puoi utilizzare lo strumento a riga di comando bmctl per creare cluster in Cluster Anthos on bare metal. Il comando bmctl configura automaticamente gli account di servizio Google e abilita le API necessarie per utilizzare i cluster Anthos su Bare Metal nel progetto specificato.

Se invece vuoi creare i tuoi account di servizio o eseguire manualmente altre configurazioni del progetto, vedi Abilitare i servizi Google e gli account di servizio prima di creare cluster con bmctl.

Per scaricare e installare lo strumento bmctl:

  1. Crea una nuova directory per bmctl:
    cd ~
    mkdir baremetal
    cd baremetal
    
  2. Scarica bmctl dal bucket Cloud Storage:
    gsutil cp gs://anthos-baremetal-release/bmctl/1.7.1/linux-amd64/bmctl bmctl
    chmod a+x bmctl
    
  3. Assicurati che bmctl sia installato correttamente visualizzando le informazioni della guida:
    ./bmctl -h

Crea i nodi del cluster

Crea due macchine da utilizzare come nodi per il tuo cluster:

  • Una macchina funge da nodo del piano di controllo.
  • Una macchina funge da nodo worker.

Per saperne di più sui requisiti dei nodi del cluster, vai ai requisiti per hardware e sistema operativo (Centos, RHEL e Ubuntu).

Crea un cluster

Per creare un cluster:

  1. Utilizza bmctl per creare un file di configurazione.
  2. Modifica il file di configurazione per personalizzarlo per il cluster e la rete.
  3. Usa bmctl per creare il cluster dal file di configurazione.

Crea un file di configurazione

Per creare un file di configurazione e abilitare automaticamente account e API di servizio, assicurati di essere nella directory baremetal ed esegui il comando bmctl con i seguenti flag:

./bmctl create config -c CLUSTER_NAME \
  --enable-apis --create-service-accounts --project-id=PROJECT_ID

CLUSTER_NAME è il nome del tuo cluster. PROJECT_ID è il progetto che hai creato in Creare un progetto Google Cloud.

Il comando di cui sopra crea un file di configurazione nella directory baremetal nel seguente percorso:
bmctl-workspace/cluster1/cluster1.yaml

Modifica il file di configurazione

Per modificare il file di configurazione:

  1. Apri il file di configurazione bmctl-workspace/cluster1/cluster1.yaml in un editor.
  2. Modifica il file con i requisiti specifici di nodo e rete. Utilizza il seguente file di configurazione di esempio. Questa guida rapida non utilizza o non include informazioni su OpenID Connect (OIDC).
# gcrKeyPath:  < to GCR service account key>
gcrKeyPath: baremetal/gcr.json
# sshPrivateKeyPath:  < to SSH private key, used for node access>
sshPrivateKeyPath: .ssh/id_rsa
# gkeConnectAgentServiceAccountKeyPath:  < to Connect agent service account key>
gkeConnectAgentServiceAccountKeyPath: baremetal/connect-agent.json
# gkeConnectRegisterServiceAccountKeyPath:  < to Hub registration service account key>
gkeConnectRegisterServiceAccountKeyPath: baremetal/connect-register.json
# cloudOperationsServiceAccountKeyPath:  < to Cloud Operations service account key>
cloudOperationsServiceAccountKeyPath: baremetal/cloud-ops.json
---
apiVersion: v1
kind: Namespace
metadata:
  name: cluster-cluster1
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
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: hybrid
  # Anthos cluster version.
  anthosBareMetalVersion: 1.7.1
  # GKE connect configuration
  gkeConnect:
    projectID: 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:  CONTROL_PLANE_NODE_IP
  # 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:
      - 172.26.232.0/24
  # 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: CONTROL_PLANE_VIP
      # 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: INGRESS_VIP
    # 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).
    #   - LOAD_BALANCER_ADDRESS_POOL-
    # 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: LOAD_BALANCER_NODE_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: 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 the maximum number of pods allowed 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

---
# Node pools for worker nodes
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
  name: node-pool-1
  namespace: cluster-cluster1
spec:
  clusterName: cluster1
  nodes:
  - address: WORKER_NODE_1_IP
  - address: WORKER_NODE_2_IP

Esegui controlli preflight e crea il cluster

Il comando bmctl esegue controlli preflight sul file di configurazione del cluster prima di creare un cluster. Se i controlli hanno esito positivo, bmctl crea il cluster.

Per eseguire i controlli preflight e creare il cluster:

  1. Assicurati di essere nella directory baremetal.
  2. Utilizza il comando seguente per creare il cluster:
  3. ./bmctl create cluster -c CLUSTER_NAME
    
    Ad esempio:
    ./bmctl create cluster -c cluster1
    

    Il comando bmctl monitora i controlli preflight e la creazione del cluster, mostra l'output sullo schermo e scrive le informazioni dettagliate nei log bmctl.

I log di controllo preliminare e di installazione dei nodi bmctl sono disponibili nella seguente directory:
baremetal/bmctl-workspace/CLUSTER_NAME/log

Il preflight bmctl verifica l'installazione del cluster proposto per le seguenti condizioni:

  • La distribuzione e la versione di Linux sono supportate.
  • SELinux non è in modalità applicazione forzata.
  • Per Ubuntu, AppArmor e UFW non sono attivi.
  • Google Container Registry è raggiungibile.
  • Sono disponibili VIP.
  • Le macchine dei cluster hanno connettività tra loro.
  • Le macchine del bilanciatore del carico si trovano nella stessa subnet di livello 2.

Il completamento della creazione del cluster può richiedere diversi minuti.

Ottenere informazioni sul tuo cluster

Dopo aver creato correttamente un cluster, utilizza il comando kubectl per visualizzare le informazioni sul nuovo cluster. Durante la creazione del cluster, il comando bmctl scrive un file kubeconfig per il cluster su cui è possibile eseguire query con kubectl. Il file kubeconfig è scritto in bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig.

Ad esempio:

kubectl --kubeconfig bmctl-workspace/cluster1/cluster1-kubeconfig get nodes

Questo comando restituisce il seguente output:

NAME      STATUS   ROLES    AGE   VERSION
node-01   Ready    master   16h   v1.17.8-gke.16
node-02   Ready    <none>   16h   v1.17.8-gke.16

Se la creazione del cluster non supera i controlli preflight, controlla i log di controllo preflight per individuare gli errori e correggerli nel file di configurazione del cluster. I log di controllo preflight si trovano nella directory /log al seguente percorso:

~/baremetal/bmctl-workspace/CLUSTER_NAME/log

I log di controllo preflight per ogni macchina nel cluster si trovano nella directory CLUSTER_NAME e sono organizzati per indirizzo IP. Ad esempio:

bmctl-workspace/cluster1/log
└── preflight-20201007-034844
    ├── 172.17.0.3
    ├── 172.17.0.4
    ├── 172.17.0.5
    ├── 172.17.0.6
    ├── 172.17.0.7
    └── node-network

Ignora gli errori di controllo preliminare

Se la creazione del cluster non riesce dopo i controlli pre-flight, puoi provare a reinstallare il cluster utilizzando il flag --force nel comando bmctl.

Il flag --force viene installato su un cluster esistente, ma ignora i risultati da qualsiasi errore di controllo preflight a causa di porte server già allocate.

  1. Assicurati di essere nella directory baremetal.
  2. Utilizza il comando seguente con il flag --force per ricreare il cluster:
  3. ./bmctl create cluster -c CLUSTER_NAME --force
    
    Ad esempio:
    ./bmctl create cluster -c cluster1 --force

Creare un deployment e un servizio

Di seguito è riportata una definizione di risorsa personalizzata per un deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: metrics
      department: sales
  replicas: 3
  template:
    metadata:
      labels:
        app: metrics
        department: sales
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"

Salva la definizione di risorsa personalizzata come my-deployment.yaml.

Crea il deployment con questo comando:

kubectl --kubeconfig bmctl-workspace/cluster1/cluster1-kubeconfig create -f my-deployment.yaml

Visualizza il deployment:

kubectl --kubeconfig bmctl-workspace/cluster1/cluster1-kubeconfig get deployments

L'output mostra che il deployment ha tre pod disponibili e pronti:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
my-deployment      3/3     3            3           16s

La seguente definizione di risorsa personalizzata definisce un servizio di tipo LoadBalancer:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: metrics
    department: sales
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080

Salva la definizione di risorsa personalizzata come my-service.yaml.

Crea il servizio con il comando seguente:

kubectl --kubeconfig bmctl-workspace/cluster1/cluster1-kubeconfig create -f my-service.yaml

Visualizza il servizio:

kubectl --kubeconfig bmctl-workspace/cluster1/cluster1-kubeconfig get service my-service

Output:

NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S
my-service   LoadBalancer   172.26.232.2   172.16.1.21   80:30060/TCP

Cluster Anthos on bare metal fornisce al servizio un indirizzo IP esterno. Utilizza l'indirizzo IP esterno per chiamare il servizio:

curl 172.16.1.21

L'output è un messaggio di benvenuto:

Hello, world!
Version: 2.0.0
Hostname: my-deployment-75d45b64f9-6clxj

Crea un piano di controllo per l'alta disponibilità

La guida rapida ha creato un semplice cluster ibrido a due nodi. Se vuoi creare un piano di controllo ad alta disponibilità, crea un cluster con tre nodi del piano di controllo.

Ad esempio, modifica il file di configurazione per aggiungere altri due nodi al piano di controllo:

controlPlane:
  nodePoolSpec:
    clusterName: cluster1
    nodes:
    # Control Plane node pools. Typically, this is either a single machine
    # or 3 machines if using a high availability deployment.
    - address: <Machine 1 IP>
    - address: <Machine 2 IP>
    - address: <Machine 3 IP>

Eseguire il bilanciatore del carico nel proprio pool di nodi

La guida rapida ha creato un semplice cluster ibrido a due nodi. Pertanto, il bilanciatore del carico viene eseguito sullo stesso nodo che esegue il piano di controllo.

Se vuoi che il bilanciatore del carico venga eseguito nel proprio pool di nodi, modifica i valori nodePoolSpec della sezione loadBalancer del file di configurazione:

  loadBalancer:
    nodePoolSpec:
      clusterName: "cluster1"
      nodes:
      - address: <LB Machine 1 IP>
      - address: <LB Machine 2 IP>