Bevor wir mit der Installation des Nginx Ingress Controllers fortfahren, lassen Sie uns kurz sehen, was Ingress und Ingress Controller sind. Der Schwerpunkt dieses Artikels liegt auf der Einrichtung, es wird davon ausgegangen, dass Sie mit allen Voraussetzungen für die Einrichtung von Nginx Ingress Controller im Kubernetes-Cluster vertraut sind.
Kubernetes-Ingress
Es ist ein Kubernetes-Objekt, das den externen Zugriff auf die Dienste im Kubernetes-Cluster verwaltet. Es stellt HTTP- und HTTPS-Routen von außerhalb des Kubernetes-Clusters für die Dienste innerhalb des Kubernetes-Clusters bereit.
Ingress-Controller
Um Ingress verwenden zu können, muss der Ingress-Controller im Kubernetes-Cluster vorhanden sein. Er ist nicht Teil des Kubernetes-Clusters wie andere Controller im Cluster und startet nicht automatisch im Cluster. Wir können eine beliebige Anzahl von Ingress-Controllern im Kubernetes-Cluster bereitstellen. Dazu sollten wir jeden Ingress mit der entsprechenden "ingress.class" annotieren. Es gibt viele verschiedene Arten von Ingress-Controllern. Ingress Controller ist ein LoadBalancer für Kubernetes-Umgebungen. Es wird als Traffic-Management-Lösung für Kubernetes-Umgebungen verwendet.
In diesem Artikel sehen wir uns die Installation des Nginx Ingress Controllers mit Helm auf dem Kubernetes-Cluster an, der mit Kops eingerichtet wurde. Um mehr über Nginx Ingress Controller im Detail zu erfahren, besuchen Sie die offizielle Dokumentation hier.
Voraussetzungen
- AWS-Konto (erstellen, falls Sie noch keins haben).
- Kops 1.18.2 auf Ihrem Computer installiert (Klicken Sie hier, um zu erfahren, wie Sie mit Kops einen Kubernetes-Cluster erstellen und mehr darüber erfahren.)
- Helm v3.5.3 (Klicken Sie hier, um zu erfahren, wie Sie Helm auf Ubuntu Server installieren)
- S3-Bucket (Klicken Sie hier, um zu erfahren, wie Sie einen S3-Bucket auf AWS erstellen).
- Domänenname (Klicken Sie hier, um zu erfahren, wie Sie eine Domäne bei AWS registrieren).
- IAM-Rolle mit Administratorberechtigungen (Klicken Sie hier, um zu erfahren, wie Sie eine IAM-Rolle auf AWS erstellen).
Was werden wir tun?
- Erstellen Sie einen Kubernetes-Cluster mit Kops
- Nginx Ingress Controller mit Helm einrichten
- Erstellen Sie ein Recordset in Route53, das auf den LoadBalancer verweist, der vom Nginx Ingress Controller erstellt wurde
- Objektdefinitionsdateien für eine Beispielanwendung erstellen
- Stellen Sie eine Beispielanwendung bereit
- Stellen Sie ein Ingress-Objekt bereit
Erstellen Sie einen Kubernetes-Cluster mit Kops
Bevor Sie mit der Erstellung des Clusters fortfahren, exportieren Sie Ihren AWS IAM-Benutzerzugriff und Ihre geheimen Schlüssel mit den folgenden Befehlen.
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>
Wenn Sie zum ersten Mal einen Cluster mit Kops erstellen und den oben angegebenen S3-Bucket zum Speichern der Clusterkonfiguration verwenden, sollten Sie keine Cluster sehen, wenn Sie versuchen, Cluster mit dem folgenden Befehl abzurufen.
kops get clusters
Rufen Sie die unter Voraussetzungen angegebene Dokumentation auf, um Kops im Detail zu verstehen. Um hier einen Kubernetes-Cluster zu erstellen, führen Sie den folgenden Befehl aus, indem Sie Werte ersetzen. Ich werde hier nicht ins Detail gehen.
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
Sie können einige Befehle im Vorschlag sehen.
Wenn Sie jetzt versuchen, die Clusterkonfiguration abzurufen, sehen Sie in der Ausgabe den Clusternamen zusammen mit Cloud und Zonen.
Bis zu diesem Zeitpunkt wurde der Cluster noch nicht erstellt. Führen Sie den folgenden Befehl aus, um die Cluster-Konfiguration zu aktualisieren.
kops update cluster --name kops.devopslee.com
Sie müssen den obigen Befehl trotzdem mit --yes als Option ausführen, damit Cluster-Ressourcen erstellt werden.
kops update cluster --name kops.devopslee.com --yes
Überprüfen Sie, ob der Cluster bereit ist oder nicht.
kops validate cluster --wait 10m
Sie müssen einige Zeit warten, während der Cluster fehlerfrei wird.
kops validate cluster --wait 10m
Sobald der Cluster fehlerfrei ist, können Sie die Standard-Pods in allen Namespaces mit dem folgenden Befehl überprüfen.
kubectl get pods -A
Nginx Ingress Controller mit Helm einrichten
Sobald der Kubernetes-Cluster bereit und fehlerfrei ist, können Sie loslegen und Nginx Ingress Controller mit Helm installieren.
Bevor Sie fortfahren, vergewissern Sie sich, dass Sie Helm v3.5.3 haben.
Hinweis:Ich habe die an meinem aktuellen Standort vorhandene Helm-Binärdatei verwendet, daher können Sie ./helm in Screenshots sehen.
helm version
Fügen Sie das Repo hinzu und installieren Sie das Nginx Ingress Controller Helm-Diagramm mit den folgenden Befehlen. Informationen zum Verständnis von Helm finden Sie in der Dokumentation, die im Abschnitt „Voraussetzungen“ erwähnt wird.
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
Im obigen Screenshot sehen Sie, dass das Helm-Chart installiert wurde.
Sie können die Ressourcen überprüfen, die als Teil des Ingress Controllers erstellt wurden.
kubectl get pods
kubectl get deployment
kubectl get service
Im obigen Screenshot sehen Sie, dass auch der Dienst „nginx-ingress-ingress-nginx-controller“ vom Typ LoadBalancer erstellt wurde. Dies bedeutet, dass im AWS-Konto ein LoadBalancer erstellt wurde.
Erstellen Sie ein Recordset in Route53, das auf den vom Nginx-Ingress erstellten LoadBalancer verweist Controller
Gehen Sie zu Ihrem AWS-Konto in der Region, in der Sie Ihren Kubernetes-Cluster erstellt haben. Überprüfen Sie den LoadBalancer und kopieren Sie seinen DNS-Namen.
Gehen Sie jetzt zu Route53 und erstellen Sie einen einzelnen A-Eintrag in der HostedZone.
Sobald wir einen gültigen Datensatz erstellt haben, wird der von uns erstellte Datensatz verwendet, um den Datenverkehr über den von uns erstellten Nginx Ingress Controller an den Kubernetes-Cluster weiterzuleiten. In diesem Fall leitet kops.devopslee.com den Datenverkehr über den Nginx Ingress Controller an Dienste im Kubernetes-Cluster weiter.
Objektdefinitionsdateien für eine Beispielanwendung erstellen
Lassen Sie uns nun Objektdefinitionsdateien erstellen, um eine Beispielanwendung bereitzustellen. Wir werden 3 Anwendungen mit 3 Bereitstellungen und 3 entsprechenden Diensten für die Bereitstellungen bereitstellen. Anschließend erstellen wir eine Ingress-Ressource mit pfadbasiertem Routing, um den Datenverkehr basierend auf dem Pfad mithilfe von kops.devopslee.com an unsere Anwendungen weiterzuleiten.
Erstellen Sie 1-nginx-main-app.yaml für Anwendung 1.
Github-Link:Klicken Sie hier, um die Datei aus meinem Github-Repo zu kopieren.
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
Erstellen Sie 2-nginx-green-app.yaml für Anwendung 2.
Github-Link:Klicken Sie hier, um die Datei aus meinem Github-Repo zu kopieren.
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
Erstellen Sie 3-nginx-blue-app.yaml für Anwendung 3
Github-Link:Klicken Sie hier, um die Datei aus meinem Github-Repo zu kopieren.
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
Erstellen Sie 4-ingress.yaml, um pfadbasierte Ingress-Regeln zu erstellen.
Github-Link:Klicken Sie hier, um die Datei aus meinem Github-Repo zu kopieren.
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
Alle diese Dateien finden Sie hier in meinem Github-Repo.
Beispielanwendungen bereitstellen
Lassen Sie uns eine Beispielanwendung nach der anderen bereitstellen und ihren Status überprüfen.
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
Stellen Sie ein Ingress-Objekt bereit
Jetzt ist es an der Zeit, eine pfadbasierte Routing-Ingress-Ressource zu erstellen. Überprüfen Sie gleichzeitig die Protokolle des Nginx-Pods.
kubectl logs nginx-ingress-ingress-nginx-controller-5c97c6b4d5-btvpl -f
kubectl apply -f 4-ingress.yaml
Sobald die Ingress-Ressource erstellt ist, können Sie sehen, dass Nginx seine Konfiguration geladen hat.
Und jetzt sind 3 verschiedene Anwendungen bereit, auf die über denselben Hostnamen zugegriffen werden kann, d. h. kops.devopslee.com, auf unterschiedlichen Pfaden.
URLs für die Anwendungen, der Hostname hier Name wird für Sie anders sein.
Auf nginx-deploy-main kann unter kops.devopslee.com
zugegriffen werdenAuf nginx-deploy-green kann unter kops.devopslee.com/green und
zugegriffen werdenAuf nginx-deploy-blue kann unter kops.devopslee.com/blue
zugegriffen werden
Sie können sehen, dass basierend auf dem Pfad auf 3 verschiedene Anwendungen mit demselben Hostnamen zugegriffen werden kann.
Schlussfolgerung
In diesem Artikel haben wir die Schritte zum Erstellen eines Kubernetes-Clusters mit Kops gesehen. Dieser Artikel konzentrierte sich hauptsächlich auf das Einrichten von Nginx Ingress Controller mit Helm und das Erstellen eines pfadbasierten Routings mit Ingress-Ressourcen. Wir haben 3 verschiedene Beispielanwendungen bereitgestellt und versucht, mit demselben Hostnamen und unterschiedlichen Pfaden darauf zuzugreifen.