Kops: distribuire Kubernetes a livello di codice

Miguel Fontanilla
AWS
June 17, 2020

Configurare un cluster Kubernetes da zero può essere difficile, soprattutto se non usi i servizi Kubernetes gestiti e devi garantire l'alta disponibilità. Kops (Kubernetes Operations) è uno strumento open source che aiuta a configurare, aggiornare e gestire i cluster Kubernetes "non gestiti" sui provider di cloud pubblici. In questo post imparerai come distribuire un cluster HA Kubernetes su AWS.

Kops by Pattern Match

Impostazione Kops up

Il primo passo qui sarà ottenere l'interfaccia della riga di comando di Kops. Supponendo che tu stia utilizzando una distribuzione Linux, puoi utilizzare i comandi seguenti. Altrimenti, controlla questo this link.

 
  
curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
chmod +x kops-linux-amd64
sudo mv kops-linux-amd64 /usr/local/bin/kops
 

Inoltre, dovrai interagire con l'API AWS, quindi avrai bisogno della CLI AWS. Il set di comandi di seguito mostra come installarlo su distribuzioni Linux. Per qualsiasi altro sistema operativo, seguire queste istruzioni.

 
  
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
 

Kops avrà bisogno di un utente IAM AWS programmatico in modo che possa distribuire l'infrastruttura necessaria per il cluster Kubernetes. A questo utente deve essere concesso pieno accesso ai servizi IAM, EC2, S3, VPC e Route53. Per fare ciò, è possibile collegare direttamente le politiche gestite AmazonEC2FullAccess, AmazonRoute53FullAccess AmazonS3FullAccess, IAMFullAccess e AmazonVPCFullAccess.

Quando si crea l'utente, selezionare l'opzione di accesso programmatico, poiché in questo modo AWS genererà una coppia di chiavi di accesso e chiavi segrete affinché la CLI acceda all'API AWS. Conservare bene la chiave segreta, poiché è l'unica volta che verrà visualizzata. Una volta che hai entrambe le chiavi, impostale come chiavi predefinite per la CLI emettendo il seguente comando. Con questo comando, puoi anche impostare la regione AWS predefinita.

 
  
aws configure
 

Per memorizzare lo stato dei cluster, Kops avrà bisogno di un bucket S3. Puoi utilizzare le tue nuove credenziali per creare il bucket utilizzando l'interfaccia della riga di comando di AWS. Inoltre, è consigliabile abilitare il versioning bucket, poiché può aiutarti a ripristinare lo stato del cluster in caso di errore.

 
  
aws s3api create-bucket --bucket  --region eu-west-1
aws s3api put-bucket-versioning --bucket   --versioning-configuration Status=Enabled
 

Creare il cluster

Lo script seguente aiuta nella creazione del cluster, al fine di configurare meglio i parametri del cluster e alcune opzioni aggiuntive. È possibile selezionare la versione di Kubernetes, il numero di nodi master e di lavoro, il tipo di istanza e le zone di disponibilità in cui verranno distribuite le istanze. Qui è possibile impostare anche le opzioni di rete e l'intervallo CIDR di rete. Puoi controllare l'elenco delle opzioni di rete supportate qui. Inoltre, puoi scegliere se generare un output terraform o cloudformation.

Impostare i parametri in base alle proprie esigenze ed eseguire lo script. Per questo esempio, useremo un nome di cluster che termina con .k8s.local, in quanto è la configurazione più semplice, senza richiedere un server DNS esterno per propagare gli IP delle API di Kubernetes. Se è necessario utilizzare un servizio DNS esterno, consultare questa documentazione. Eseguendo lo script, Kops genererà le specifiche del cluster, ma non distribuirà ancora il cluster.

 
  
#!/bin/bash

# Kops Kubernetes HA deployment for aws
export CLOUD=aws
MASTER_NUMBER=3
MASTER_ZONES="eu-west-1a,eu-west-1b,eu-west-1c"
MASTER_SIZE="t2.medium"
WORKER_NUMBER=3
WORKER_ZONES="eu-west-1a,eu-west-1b,eu-west-1c"
WORKER_SIZE="t2.medium"
CNI_PLUGIN="calico" 
CLUSTER_NAME="testlab.k8s.local" # if ends in .k8s.local --> gossip-based cluster
K8S_VERSION=1.17.0
NETWORK_CIDR="10.240.0.0/16"
NW_TOPOLOGY="private" # public: uses a gateway | private
STORAGE_BUCKET=""
BUCKET_REGION="eu-west-1"
EXTRA_ARGS=" --target=terraform " 
# EXTRA_ARGS=" --target=cloudformation " 

export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)
export KOPS_STATE_STORE="s3://${STORAGE_BUCKET}"

# configure cluster
kops create cluster --node-count ${WORKER_NUMBER} --zones ${WORKER_ZONES} \
    --master-zones ${MASTER_ZONES} --node-size ${WORKER_SIZE} \
    --master-size ${MASTER_SIZE} --kubernetes-version=${K8S_VERSION} \
    --network-cidr=${NETWORK_CIDR} --cloud=${CLOUD} \
    --topology ${NW_TOPOLOGY} --networking ${CNI_PLUGIN}   ${CLUSTER_NAME} \
    ${EXTRA_ARGS} \
 

È possibile verificare le specifiche del cluster eseguendo il comando seguente. Ricorda di impostare la bandiera dello stato con il nome del tuo bucket di stato. Può anche essere usato per modificare i cluster già creati.

 
  
kops edit cluster testlab.k8s.local  --state s3://
 

Il comando edit aprirà un editor vi, in cui è possibile modificare tutti i parametri in base alle proprie esigenze. Se si passa attraverso la specifica yaml, è possibile vedere che la specifica del cluster corrisponde a tutti i parametri passati al comando create e vengono aggiunti ulteriori elementi necessari per supportare l'infrastruttura del cluster, come le sottoreti.

 
  
apiVersion: kops.k8s.io/v1alpha2
kind: Cluster
metadata:
  creationTimestamp: "2020-06-03T20:29:13Z"
  name: testlab.k8s.local
spec:
  api:
    loadBalancer:
      type: Public
  authorization:
    rbac: {}
  channel: stable
  cloudProvider: aws
  configBase: s3:///testlab.k8s.local
  etcdClusters:
  - cpuRequest: 200m
    etcdMembers:
    - instanceGroup: master-eu-west-1a
      name: a
    - instanceGroup: master-eu-west-1b
      name: b
    - instanceGroup: master-eu-west-1c
      name: c
    memoryRequest: 100Mi
    name: main
    version: 3.2.24
  - cpuRequest: 100m
    etcdMembers:
    - instanceGroup: master-eu-west-1a
      name: a
    - instanceGroup: master-eu-west-1b
      name: b
    - instanceGroup: master-eu-west-1c
      name: c
    memoryRequest: 100Mi
    name: events
    version: 3.2.24
  iam:
    allowContainerRegistry: true
    legacy: false
  kubelet:
    anonymousAuth: false
  kubernetesApiAccess:
  - 0.0.0.0/0
  kubernetesVersion: 1.17.0
  masterInternalName: api.internal.testlab.k8s.local
  masterPublicName: api.testlab.k8s.local
  networkCIDR: 10.240.0.0/16  
  networking:
    calico:
      majorVersion: v3
  nonMasqueradeCIDR: 100.64.0.0/10
  sshAccess:
  - 0.0.0.0/0
  subnets:
  - cidr: 10.240.32.0/19
    name: eu-west-1a
    type: Private
    zone: eu-west-1a
  - cidr: 10.240.64.0/19
    name: eu-west-1b
    type: Private
    zone: eu-west-1b
  - cidr: 10.240.96.0/19
    name: eu-west-1c
    type: Private
    zone: eu-west-1c
  - cidr: 10.240.0.0/22
    name: utility-eu-west-1a
    type: Utility
    zone: eu-west-1a
  - cidr: 10.240.4.0/22
    name: utility-eu-west-1b
    type: Utility
    zone: eu-west-1b
  - cidr: 10.240.8.0/22
    name: utility-eu-west-1c
    type: Utility
    zone: eu-west-1c
  topology:
    dns:
      type: Public
    masters: private
    nodes: private
 

Emettendo il seguente comando, la specifica del cluster genererà un cluster effettivo nell'account AWS. Sii paziente come ci vuole un po '. Se il comando viene eseguito senza il flag –yes, mostrerà tutte le risorse che stanno per essere create, ma le risorse non verranno create.

 
  
kops update cluster  --state s3:// --yes
 

Una volta terminato il processo di creazione, puoi controllare la dashboard di AWS EC2 per vedere le tue nuove istanze, 3 master e 3 lavoratori in questo caso.

Un buon modo per verificare se tutto è attivo e in esecuzione sta eseguendo i seguenti comandi. Il primo stampa lo stato di tutti gli elementi del piano di controllo, mentre il secondo elenca i nodi e i loro stati.

 
  
kubectl get componentstatuses
kubectl get nodes
 

Inoltre, Kops offre un controllo cluster integrato che è molto utile.

 
  
kops validate cluster  --state s3:// 
 

Pulizia

Se si desidera eliminare il cluster e tutte le risorse associate che sono state create, è sufficiente emettere il seguente comando. Se lo usi senza la bandiera –yes, verrà visualizzato un elenco dettagliato di tutti gli elementi che verranno distrutti, ma non li distruggerà fino a quando non aggiungi la bandiera.

 
  
kops delete cluster testlab.k8s.local  --state s3:// --yes
 

Maggiori informazioni su Kops

Kops è uno strumento ampiamente utilizzato per la gestione dei cluster Kubernetes negli ambienti di produzione e offre molta flessibilità e funzionalità avanzate che aiutano a personalizzare ciascun cluster in base ai requisiti che deve soddisfare. Aiuta a creare, aggiornare e aggiornare i cluster in modo semplice. Tuttavia, tieni presente che Kops non supporta tutte le funzionalità offerte da Kubernetes durante la creazione di un cluster "a mano", ad esempio, non tutti i plug-in di rete sono attualmente supportati da Kops, o almeno non in modo stabile.

Se vuoi sapere di più su Kops, leggi questi documenti.


Miguel Fontanilla

DevOps/Cloud Engineer at Orange. Cloud Architecture, Virtualization, Services Orchestration, Automation and Optimization. Always learning.

Related Posts

Newsletter ItalyClouds.com

Thank you! Your submission has been received!

Oops! Something went wrong while submitting the form