GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Come utilizzare il provider Kubernetes Terraform

Questo articolo continua gli argomenti di Linux, Kubernetes e Terraform e ti aiuterà a imparare come distribuire applicazioni nel cluster Kubernetes usando Terraform. Abbiamo coperto due diversi approcci per farlo:i fornitori di Kubernetes e Helm Terraform. A tale scopo, non è necessario un cluster Kubernetes poiché utilizzeremo Minikube, che puoi installare sul tuo laptop.

Imparerai anche come distribuire applicazioni funzionali di livello n su Kubernetes utilizzando Terraform in 10 minuti.

Cos'è Minikube

Il modo migliore per imparare Kubernetes e i suoi concetti è utilizzare Minikube. Con Minikube, non è necessario affrontare la seccatura di gestire macchine virtuali o distribuire un cluster Kubernetes completamente funzionale.

Questo strumento open source supporta Windows, macOS e Linux, consentendoti di avviare un cluster Kubernetes a nodo singolo sul tuo computer locale. Questa macchina virtuale può essere eseguita su Virtualbox, KVM, Hyper-V o Docker.

Installazione di Minikube

L'installazione di Minikube è un processo semplice. Tuttavia, c'è solo una dipendenza che devi installare in anticipo:uno strumento da riga di comando chiamato kubectl .

kubectl ti consente di gestire i cluster Kubernetes. Puoi utilizzare kubectl per distribuire applicazioni, visualizzare i log e gestire le risorse del cluster.

Installazione di kubectl

Di seguito è riportato un esempio del processo di installazione di kubectl per Linux e macOS:

$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"

$ chmod +x ./kubectl

$ sudo mv ./kubectl /usr/local/bin/kubectl

Per installare kubectl su Windows, puoi utilizzare Chocolatey package manager:

choco install kubernetes-cli

In alternativa, puoi anche installare kubectl su Windows facendo clic qui.

Ora che hai installato kubectl, il passaggio successivo è installare Minikube.

Installa Minikube

Ecco i comandi standard necessari per installare Minikube su Ubuntu, CentOS e macOS:

$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64

$ sudo install minikube-linux-amd64 /usr/local/bin/minikube

Se fai affidamento su brew per gestire il tuo macOS, è meglio usare il seguente comando:

$ brew install minikube

Se stai installando minikube su Windows, è meglio usare Chocolatey:

choco install minikube

Se minikube non è stato avviato durante l'installazione, è possibile farlo utilizzando il seguente comando:

$ minikube start

Fornitori di terraform per la distribuzione di Kubernetes

Attualmente, sono disponibili due provider per la gestione delle applicazioni Kubernetes utilizzando Terraform:

  • Kubernetes.
  • Timone.

Kubernetes Terraform Provider

Ad esempio, in questa sezione tratteremo la distribuzione di WordPress utilizzando il Kubernetes Terraform Provider.

Definisci la distribuzione di WordPress utilizzando il provider Kubernetes

Ecco la struttura finale del progetto:

Useremo wordpress Immagine Docker per il livello frontend e mysql Immagine Docker per il livello DB nella nostra distribuzione.

Definiamo kubernetes provider in provider.tf file:

provider "kubernetes" {
 config_context = "minikube"
}

Quindi, creiamo un paio di variabili locali per etichettare kubernetes_deploymentkubernetes_service :

locals {
 wordpress_labels = {
   App = "wordpress"
   Tier = "frontend"
 }
 mysql_labels = {
   App = "wordpress"
   Tier = "mysql"
 }
}

Puoi creare etichette aggiuntive se lo desideri, ovviamente. Lo scopo delle etichette in Kubernetes è darti la possibilità di selezionare pod, servizi, distribuzione e qualsiasi altra entità Kubernetes.

Esistono molti modi diversi per non codificare le password nella configurazione di Terraform. L'uso dei parametri Terraform è uno di questi. Continueremo con una password hardcoded per rendere la demo un po' più semplice.

Dichiariamo un segreto per MYSQL_ROOT_PASSWORD variabile di ambiente, che useremo in kubernetes_deployment .

resource "kubernetes_secret" "mysql-pass" {
 metadata {
   name = "mysql-pass"
 }
 data = {
   password = "root"
 }
}

Ora siamo pronti per definire kubernetes_deployment risorsa per la distribuzione di WordPress:

resource "kubernetes_deployment" "wordpress" {
 metadata {
   name = "wordpress"
   labels = local.wordpress_labels
 }
 spec {
   replicas = 1
   selector {
     match_labels = local.wordpress_labels
   }
   template {
     metadata {
       labels = local.wordpress_labels
     }
     spec {
       container {
         image = "wordpress:4.8-apache"
         name  = "wordpress"
         port {
           container_port = 80
         }
         env {
           name = "WORDPRESS_DB_HOST"
           value = "mysql-service"
         }
         env {
           name = "WORDPRESS_DB_PASSWORD"
           value_from {
             secret_key_ref {
               name = "mysql-pass"
               key = "password"
             }
           }
         }
       }
     }
   }
 }
}

L'intera configurazione di Terraform riflette le specifiche di distribuzione di Kubernetes. Abbiamo bisogno di esporre la distribuzione di WordPress alle reti di cluster esterne utilizzando il servizio Kubernetes non appena lo abbiamo dichiarato.

Definiamo kubernetes_service Risorsa Terraform a tale scopo:

resource "kubernetes_service" "wordpress-service" {
 metadata {
   name = "wordpress-service"
 }
 spec {
   selector = local.wordpress_labels
   port {
     port        = 80
     target_port = 80
     node_port = 32000
   }
   type = "NodePort"
 }
}

Qui, stiamo dicendo a Kubernetes di rendere disponibile WordPress Pod per la comunicazione utilizzando il servizio.

Per l'ambiente di sviluppo Minikube, esporremo WordPress sulla porta 32000 .

Ora, facciamo la stessa cosa per la distribuzione di MySQL:

resource "kubernetes_deployment" "mysql" {
 metadata {
   name = "mysql"
   labels = local.mysql_labels
 }
 spec {
   replicas = 1
   selector {
     match_labels = local.mysql_labels
   }
   template {
     metadata {
       labels = local.mysql_labels
     }
     spec {
       container {
         image = "mysql:5.6"
         name  = "mysql"
         port {
           container_port = 3306
         }
         env {
           name = "MYSQL_ROOT_PASSWORD"
           value_from {
             secret_key_ref {
               name = "mysql-pass"
               key = "password"
             }
           }
         }
       }
     }
   }
 }
}

Come nell'esempio precedente, stiamo rendendo accessibile la distribuzione di database MySQL per la distribuzione di WordPress utilizzando il servizio Kubernetes configurato tramite kubernetes_service risorsa:

resource "kubernetes_service" "mysql-service" {
 metadata {
   name = "mysql-service"
 }
 spec {
   selector = local.mysql_labels
   port {
     port        = 3306
     target_port = 3306
   }
   type = "NodePort"
 }
}

Distribuisci la configurazione di WordPress Kubernetes Terraform

Non appena abbiamo creato la configurazione Terraform, possiamo distribuire il nostro esempio demo.

Inizializza il progetto Terraform e applica la configurazione:

$ terraform init

$ terraform apply

Dopo aver applicato le configurazioni, vedrai il piano per le risorse e il permesso per svolgere le attività pianificate.

Approva il piano rispondendo a yes .

Dopo la distribuzione delle risorse, possiamo accedere all'applicazione.

Verifica la distribuzione

Convalidiamo la nostra implementazione nel cluster utilizzando kubectl .

$ kubectl get all

Vogliamo assicurarci che tutte le risorse create da Terraform siano disponibili.

Test della distribuzione

Dopo aver verificato l'implementazione delle risorse WordPress e MySQL, possiamo testare l'accesso all'app.

Per ottenere l'accesso alla nostra applicazione distribuita, dovremo eseguire il seguente comando Minikube:

$ minikube service wordpress-service --url

Questo comando ti mostrerà l'URL del servizio WordPress esposto da Minikube.

Congratulazioni! La nostra applicazione WordPress è stata implementata con successo.

Helm Terraform Provider

Questa parte dell'articolo utilizzerà il provider di timoni di Terraform per distribuire la stessa applicazione WordPress nel cluster Kubernetes, ma in modo diverso, utilizzando i grafici Helm.

Dobbiamo installare Helm sulla macchina per la distribuzione tramite il provider Helm in cui viene eseguito lo script Terraform.

Per ulteriori informazioni su Helm e sul processo di creazione dei grafici Helm, ti consiglio il nostro articolo Introduzione rapida e semplice ai grafici [Kubernetes] [Helm] in 10 minuti.

Creazione di mappe timone

In questo modulo creeremo grafici Helm per implementazioni MySQL e WordPress.

Helm può generare un modello di base che possiamo adattare alle nostre esigenze. Per ulteriori informazioni sulla creazione di grafici Helm, consulta l'articolo Introduzione rapida e semplice ai grafici Helm di Kubernetes in 10 minuti.

Ecco la nostra struttura finale del progetto:

Facciamo una directory per i grafici:

$ mkdir charts

$ cd charts

Grafico di MySQL Helm

Per prima cosa, creiamo il grafico del timone per MySQL.

$ helm create mysql-chart

Il comando precedente creerà un grafico con le configurazioni predefinite.

Visualizza i contenuti della mysql-chart :

Elimina il NOTES.txthpa.yamlingress.yaml,serviceaccount.yaml file dalla directory dei modelli.

Sovrascrivi i contenuti di MySQL deployment.yaml file con quanto segue:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: {{ .Values.deployment.name }}
 labels:
   {{- include "mysql-chart.labels" . | nindent 4 }}
spec:
 replicas: {{ .Values.replicaCount }}
 selector:
   matchLabels:
     {{- include "mysql-chart.selectorLabels" . | nindent 6 }}
 template:
   metadata:
     labels:
       {{- include "mysql-chart.selectorLabels" . | nindent 8 }}
   spec:
     containers:
       - name: {{ .Chart.Name }}
         image: "{{ .Values.image.repository }}"
         imagePullPolicy: {{ .Values.image.pullPolicy }}
         ports:
           - name: http
             containerPort: {{ .Values.service.port }}
             protocol: TCP
         env:
           - name: MYSQL_ROOT_PASSWORD
             value: 'admin'

Ecco i contenuti di service.yaml per MySQL.

apiVersion: v1
kind: Service
metadata:
 name: {{ .Values.service.name }}
 labels:
   {{- include "mysql-chart.labels" . | nindent 4 }}
spec:
 type: {{ .Values.service.type }}
 ports:
   - port: {{ .Values.service.port }}
     targetPort: {{ .Values.service.port }}
     protocol: TCP
     name: http
 selector:
   {{- include "mysql-chart.selectorLabels" . | nindent 4 }}

Sostituisci il contenuto di values.yaml per la configurazione MySQL.

replicaCount: 1

image:
 repository: mysql:5.6
 pullPolicy: IfNotPresent

deployment:
 name: mysql-deployment

service:
 name: mysql-service
 type: ClusterIP
 port: 3306

Grafico timone di WordPress

Crea un grafico Helm per WordPress.

$ helm create wordpress-chart

Elimina il NOTES.txthpa.yamlingress.yaml,serviceaccount.yaml file dalla directory dei modelli.

I contenuti per deployment.yaml per WordPress sono i seguenti:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: {{ .Values.deployment.name }}
 labels:
   {{- include "wordpress-chart.labels" . | nindent 4 }}
spec:
 replicas: {{ .Values.replicaCount }}
 selector:
   matchLabels:
     {{- include "wordpress-chart.selectorLabels" . | nindent 6 }}
 template:
   metadata:
     labels:
       {{- include "wordpress-chart.selectorLabels" . | nindent 8 }}
   spec:
     containers:
       - name: {{ .Chart.Name }}
         image: {{ .Values.image.repository }}
         imagePullPolicy: {{ .Values.image.pullPolicy }}
         ports:
           - name: http
             containerPort: {{ .Values.service.port }}
             protocol: TCP
         env:
           - name: WORDPRESS_DB_HOST
             value: 'mysql-service'
           - name: WORDPRESS_DB_PASSWORD
             value: 'admin'

I contenuti per service.yaml del grafico di WordPress sono i seguenti:

apiVersion: v1
kind: Service
metadata:
 name: {{ .Values.service.name }}
 labels:
   {{- include "wordpress-chart.labels" . | nindent 4 }}
spec:
 type: {{ .Values.service.type }}
 ports:
   - port: {{ .Values.service.port }}
     targetPort: {{ .Values.service.port }}
     protocol: TCP
     name: http
     nodePort: {{ .Values.service.nodePort }}
 selector:
   {{- include "wordpress-chart.selectorLabels" . | nindent 4 }}

Il contenuto di values.yaml per WordPress sono i seguenti:

replicaCount: 1

image:
 repository: wordpress:4.8-apache
 pullPolicy: IfNotPresent

deployment:
 name: wordpress-deployment

service:
 name: wordpress-service
 type: NodePort
 port: 80
 nodePort: 32000

Configurazione della piattaforma

Non appena abbiamo i grafici Helm, dobbiamo creare un file di configurazione Terraform per distribuire la nostra applicazione su Kubernetes.

Torniamo alla directory di base e definiamo helm.tf File di configurazione Terraform con il seguente contenuto:

provider "helm" {
 kubernetes {
   config_context = "minikube"
 }
}

resource "helm_release" "mysql" {
 name  = "mysql"
 chart = "${abspath(path.root)}/charts/mysql-chart"
}

resource "helm_release" "wordpress" {
 name  = "wordpress"
 chart = "${abspath(path.root)}/charts/wordpress-chart"
}

Applicazione della configurazione Terraform

Il passaggio finale consiste nel distribuire la nostra applicazione nel cluster Kubernetes utilizzando comandi già noti:

$ terraform init

$ terraform apply

Approva il piano per distribuire la configurazione.

Verifica la distribuzione dell'applicazione

Puoi verificare l'implementazione utilizzando il helm comando.

$ helm ls

In alternativa, puoi anche verificarlo utilizzando kubectl comando.

$ kubectl get all

Per accedere alla nostra applicazione distribuita, dovremo eseguire il seguente comando Minikube:

$ minikube service wordpress-service --url

Questo comando ti mostrerà l'URL del servizio WordPress esposto da Minikube.

Congratulazioni! La nostra applicazione WordPress è stata implementata con successo utilizzando grafici Helm e Terraform.

Pulizia

Per ripulire lo schieramento Terraform, usa il solito comando Terraform destroy in helm-providerkubernetes-provider cartelle:

$ terraform destroy

Riepilogo

In questo articolo abbiamo mostrato come distribuire le applicazioni nel cluster Kubernetes usando Terraform. Abbiamo coperto due diversi approcci per farlo:i fornitori di Kubernetes e Helm Terraform. Per questa demo, abbiamo utilizzato Minikube come cluster Kubernetes locale.

Ci auguriamo che questo articolo ti sia utile! Se sì, per favore, aiutaci a diffonderlo nel mondo! Per favore, facci sapere nella sezione commenti qui sotto se hai domande.


Docker
  1. Come installare Kubernetes con Minikube su Ubuntu 20.04

  2. Come usare Podman all'interno di Kubernetes

  3. Come usare Docker Compose

  4. Come utilizzare ConfigMaps per la configurazione di Kubernetes

  5. Come utilizzare le immagini docker locali con Minikube?

Che cos'è Terraform e come installarlo e utilizzarlo su AWS EC2

Come installare Kubernetes usando Minikube in CentOS Linux

Come utilizzare Vagrant con il provider KVM Libvirt

Come installare Kubernetes minikube su Ubuntu 20.04

Come utilizzare FTP

Come installare Kubernetes con Minikube su CentOS 8