Wat is Ingress Controller en Nginx Ingress Controller inzetten in Kubernetes Cluster op AWS met Helm

Voor we verder gaan met de installatie van de Nginx Ingress Controller, laten we in het kort zien wat Ingress en Ingress Controller is. De nadruk van dit artikel ligt op de opstelling, er wordt verondersteld dat je bekend bent met alle voorwaarden voor het opzetten van Nginx Ingress Controller in de Kubernetes Cluster.

Kubernetes Ingress

Het is een Kubernetes object dat externe toegang tot de diensten in de Kubernetes Cluster beheert. Het stelt HTTP en HTTPS routes bloot van buiten het Kubernetes cluster naar de diensten binnen het Kubernetes cluster.

Ingress Controller

Om Ingress te gebruiken, moet je de Ingress Controller in het Kubernetes cluster hebben. Hij komt niet als deel van het Kubernetes cluster zoals andere controllers in het cluster, hij start niet automatisch in het cluster. We kunnen een willekeurig aantal Ingress Controllers in het Kubernetes cluster inzetten. Om dat te doen, moeten we elke ingress annoteren met de juiste ingress.class. Er zijn veel verschillende soorten Ingress Controllers beschikbaar. Ingress Controller is een LoadBalancer voor Kubernetes Omgevingen. Hij wordt gebruikt als een oplossing voor verkeersbeheer voor Kubernetes omgevingen.

In dit artikel bekijken we de installatie van de Nginx Ingress Controller met Helm op de Kubernetes Cluster die met Kops is opgezet. Om meer te weten te komen over Nginx Ingress Controller in detail, bezoek je de officiële documentatie hier.

Vereisten

  1. AWS Account ( Maak aan als je er geen hebt).
  2. Kops 1.18.2 geïnstalleerd op je machine(Klikhier om een Kubernetes Cluster te leren maken met Kops en er meer over te weten te komen).
  3. Helm v3.5.3 (Klik hier om te leren hoe je Helm op Ubuntu Server installeert)
  4. S3 Bucket ( Klik hier om te leren een S3 Bucket op AWS te maken).
  5. Domeinnaam (Klikhier om te leren hoe je een Domein op AWS registreert).
  6. IAM Rol met admin rechten(Klik hier om te leren een IAM rol op AWS te maken).

Wat zullen we doen?

  1. Maak een Kubernetes Cluster met behulp van Kops
  2. Stel Nginx Ingress Controller in met Helm
  3. Maak een Recordset in Route53 die wijst naar de LoadBalancer die door de Nginx Ingress Controller is aangemaakt
  4. Maak Object definitie bestanden voor een voorbeeld applicatie
  5. Zet een voorbeeldtoepassing op
  6. Zet een Ingress Object in

Maak een Kubernetes Cluster met behulp van Kops

Voordat je verder gaat met het maken van het cluster, exporteer je AWS IAM Gebruikers toegang en geheime sleutels met de volgende commando’s.

export AWS_ACCESS_KEY_ID=<your-aws-access-key-here> #Export AWS Access Key
export AWS_SECRET_ACCESS_KEY=<your-aws-secret-key-here> ##Export AWS Secret Key export
Now, export the KOPS_STATE_STORE variable with value as S3 bucket name on your terminal.
KOPS_STATE_STORE=s3://<s3-bucket-name>

Als je voor de eerste keer een cluster maakt met Kops en de hierboven opgegeven S3 Bucket gebruikt voor het opslaan van cluster configuratie, zou je geen clusters moeten zien als je clusters probeert op te halen met het volgende commando.

kops get clusters

Bezoek de documentatie gespecificeerd in de randvoorwaarden om Kops in detail te begrijpen. Voer hier, om een Kubernetes cluster te maken, het volgende commando uit door waarden te vervangen. Ik zal hier niet in detail treden.

kops create cluster --name <subdomain.domain.com> --state s3://<s3-bucket> --cloud aws --master-size t2.small --master-count 1 --master-zones us-east-1a --node-size t2.small --node-count 2 --zones us-east-1a,us-east-1b,us-east-1c

Kops commando om een K8S cluster te maken

Je ziet een paar commando’s in de suggestie.

Uit het vorige commando

Als je nu probeert de cluster configuratie op te halen, zie je in de uitvoer de clusternaam samen met Cloud en Zones.

Krijg clusters

Tot dit punt is het cluster nog niet aangemaakt, voer het volgende commando uit om de Cluster configuratie bij te werken.

kops update cluster --name kops.devopslee.com

Dry run update cluster

Je moet het bovenstaande commando nog uitvoeren met –yes als optie, zodat er clustermiddelen worden aangemaakt.

kops update cluster --name kops.devopslee.com --yes

Werk het cluster bij om cloud hulpbronnen te maken

Valideer of het cluster klaar is of niet.

kops validate cluster --wait 10m

Valideer het cluster

Je moet enige tijd wachten tot het cluster gezond is.

kops validate cluster --wait 10m

Succesvolle cluster validatie

Zodra het cluster gezond is, kun je de standaard pods over alle namespaces controleren met het volgende commando.

kubectl get pods -A

Controleer standaard pods in alle namespaces

Stel Nginx Ingress Controller in met Helm

Als de Kubernetes Cluster klaar en gezond is, ben je goed om te gaan en Nginx Ingress Controller te installeren met Helm.

Voor je verder gaat, controleer je of je Helm v3.5.3 hebt.

Opmerking: Ik heb Helm binary gebruikt die op mijn huidige locatie aanwezig is, vandaar dat je ./helm in screenshots ziet.

helm version

Helm versie

Voeg de repo toe en installeer de Nginx Ingress Controller Helm kaart met de volgende commando’s. Om Helm te begrijpen, raadpleeg je de documentatie die in de paragraaf Vereisten staat.

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.publishService.enabled=true

Opzetten Nginx Ingress Controller

In de bovenstaande schermafbeelding kun je zien dat de Helm kaart geïnstalleerd is.

Je kunt de middelen controleren die als onderdeel van de Ingress Controller zijn aangemaakt.

kubectl get pods
kubectl get deployment
kubectl get service

Objecten gemaakt door Ingress Controller

In de bovenstaande schermafbeelding zie je dat ook de Dienst “nginx-ingress-nginx-controller” van het type LoadBalancer is aangemaakt. Het betekent dat er een LoadBalancer is aangemaakt in het AWS account.

Maak een Recordset in Route53 die wijst naar de LoadBalancer die door de Nginx Ingress Controller is aangemaakt

Ga naar je AWS account in de regio waar je je Kubernetes Cluster hebt aangemaakt. Vink de LoadBalancer aan en kopieer zijn DNS Naam.

LoadBalancer gemaakt door Ingress Controller

Ga nu naar Route53 en maak een enkel A Record aan in de HostedZone.

Maak een RecordSet

Zodra we een geldig record hebben aangemaakt, zal dat gebruikt worden om verkeer naar Kubernetes Cluster te routeren via de Nginx Ingress Controller die we gemaakt hebben. In dit geval zal kops.devopslee.com verkeer naar Services in de Kubernetes cluster routeren via de Nginx Ingress Controller.

Object definitie bestanden maken voor een voorbeeld applicatie

Laten we nu object definitie bestanden maken om een voorbeeld toepassing uit te rollen. We zullen 3 applicaties inzetten met behulp van 3 Deployments en 3 respectievelijke Services voor de deployments. We zullen dan een Ingress resource met path-based routing maken om verkeer naar onze toepassingen te routeren met kops.devopslee.com op basis van het pad.

Maak 1-nginx-main-app.yaml voor toepassing 1.

Github Link: Klikhier om het bestand uit mijn Github repo te kopiëren.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-main
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-main
  template:
    metadata:
      labels:
        run: nginx-main
    spec:
      containers:
      - image: nginx
        name: nginx


---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deploy-main
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: nginx-main

Maak 2-nginx-green-app.yaml voor toepassing 2.

Github Link: Klikhier om het bestand uit mijn Github repo te kopiëren.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-green
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-green
  template:
    metadata:
      labels:
        run: nginx-green
    spec:
      volumes:
      - name: webdata
        emptyDir: {}
      initContainers:
      - name: web-content
        image: busybox
        volumeMounts:
        - name: webdata
          mountPath: "/webdata"
        command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=green>GREEN</font></h1>" > /webdata/index.html']
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: webdata
          mountPath: "/usr/share/nginx/html"


---
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deploy-green
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: nginx-green          

Maak 3-nginx-blue-app.yaml voor toepassing 3

Github Link: Klikhier om het bestand uit mijn Github repo te kopiëren.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-blue
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-blue
  template:
    metadata:
      labels:
        run: nginx-blue
    spec:
      volumes:
      - name: webdata
        emptyDir: {}
      initContainers:
      - name: web-content
        image: busybox
        volumeMounts:
        - name: webdata
          mountPath: "/webdata"
        command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=blue>BLUE</font></h1>" > /webdata/index.html']
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: webdata
          mountPath: "/usr/share/nginx/html"


---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deploy-blue
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: nginx-blue

Maak 4-ingress.yaml voor het maken van pad-gebaseerde Ingress regels.

Github Link: Klikhier om het bestand uit mijn Github repo te kopiëren.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: ingress-resource
spec:
  rules:
  - host: kops.devopslee.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-deploy-main
          servicePort: 80
      - path: /blue
        backend:
          serviceName: nginx-deploy-blue
          servicePort: 80
      - path: /green
        backend:
          serviceName: nginx-deploy-green
          servicePort: 80

Je kunt al deze bestanden hier op mijn Github repo vinden.

Voorbeeld applicaties inzetten

Laten we voorbeeld applicaties een voor een inzetten en hun status controleren.

kubectl apply -f 1-nginx-main-app.yaml
kubectl apply -f 2-nginx-green-app.yaml
kubectl apply -f 3-nginx-blue-app.yaml
kubectl get deployments
kubectl get pods
kubectl get service

Implementeer een voorbeeldapplicatie

Zet een Ingress Object in

Nu is het tijd om een pad-gebaseerde routing Ingress bron aan te maken. Controleer tegelijk de logs van de Nginx Pod.

kubectl logs nginx-ingress-ingress-nginx-controller-5c97c6b4d5-btvpl -f
kubectl apply -f 4-ingress.yaml

Maak een Ingress resource aan en controleer nginx-ingress pod logs

Zodra de Ingress resource is aangemaakt, kun je zien dat de Nginx zijn configuratie geladen heeft.

En nu zijn 3 verschillende toepassingen klaar om benaderd te worden met dezelfde Host Naam, nl. kops.devopslee.com, op verschillende paden.

De URL’s voor de toepassingen, de Hostname hier genoemd, zullen voor jou verschillend zijn.

nginx-deploy-main kan benaderd worden op kops.devopslee.com

nginx-deploy-green kan benaderd worden op kops.devopslee.com/green en

nginx-deploy-blue is toegankelijk op kops.devopslee.com/blue

Controleer de ingangsbron

Je ziet dat op basis van het pad 3 verschillende toepassingen met dezelfde Hostname benaderd kunnen worden.

Toegang tot de toepassingen

Conclusie

In dit artikel zagen we de stappen om een Kubernetes Cluster te maken met Kops. Dit artikel richtte zich vooral op het opzetten van Nginx Ingress Controller met Helm en het maken van een pad-gebaseerde routering met Ingress resource. We zetten 3 verschillende voorbeeld applicaties in en probeerden ze te benaderen met dezelfde Hostname en verschillende paden.