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_deployment e kubernetes_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.txt , hpa.yaml , ingress.yaml, e 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.txt , hpa.yaml , ingress.yaml, e 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-provider o kubernetes-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.