Bereitstellung von HTTPS-Diensten auf Magnum Kubernetes in der CODE-DE FRA1-1 Cloud

Mit Kubernetes kann eine Anwendung sehr schnell bereitgestellt und öffentlich zugänglich gemacht werden, zum Beispiel mit dem Diensttyp LoadBalancer. Beispielimplementierungen, die diese Fähigkeit demonstrieren, werden in der Regel mit HTTP bereitgestellt. Die Bereitstellung eines produktionsreifen Dienstes, der mit HTTPS gesichert ist, kann auch problemlos mit zusätzlichen Tools erfolgen.

In diesem Artikel zeigen wir, wie man einen HTTPS-geschützten Dienst auf CODE-DE FRA1-1.

Was wir behandeln werden

  • Installation der benutzerdefinierten Ressourcendefinitionen von Cert Manager

  • Cert Manager Helm-Diagramm installieren

  • Erstellen einer Einrichtung und eines Dienstes

  • Erstellen und Bereitstellen eines Ausstellers

  • Assoziieren der Domäne mit NGINX Ingress

  • Erstellen und Bereitstellen einer Ingress-Ressource

Voraussetzungen

Nr. 1 Konto

Sie benötigen einen Hosting-Zugang mit Zugriff auf die Horizon-Schnittstelle: https://cloud.fra1-1.cloudferro.com/auth/login/?next=/.

Nr. 2 Kubernetes-Cluster auf FRA1-1 Cloud, mit aktiviertem NGINX Ingress

Siehe diesen Artikel Erstellen eines Kubernetes-Clusters mit CODE-DE OpenStack Magnum

Nr. 3 Kenntnisse von kubectl

Weitere Anweisungen finden Sie in Zugriff auf Kubernetes-Cluster nach der Bereitstellung mit Kubectl auf CODE-DE OpenStack Magnum

Nr. 4 Kenntnis der Kubernetes-Ingress-Funktion

Es wird im Artikel Using Kubernetes Ingress on CODE-DE FRA1-1 OpenStack Magnum erklärt

Nr. 5 Kenntnisse über den Einsatz von Helm-Diagrammen

Siehe diesen Artikel:

Einsatz von Helm Charts auf Magnum Kubernetes-Clustern auf der CODE-DE FRA1-1 Cloud

Nr. 6 Sie müssen eine bei einer Registrierstelle erworbene Domain besitzen

Sie müssen auch eine Domain besitzen, die Sie bei einem Registrar (Domain-Wiederverkäufer) erworben haben. Der Bezug einer Domain von einem Registrar wird in diesem Artikel nicht behandelt.

Nr. 7 Nutzen Sie den DNS-Befehl Horizon, um eine Verbindung mit dem Domainnamen herzustellen

Dies ist optional. Hier ist der Artikel mit detaillierten Informationen:

DNS als Dienst auf CODE-DE FRA1-1

Schritt 1 Installieren Sie die benutzerdefinierten Ressourcendefinitionen (CRDs) von Cert Manager

Wir gehen davon aus, dass Sie Ihr

  • Magnum-Cluster eingerichtet ist und läuft und

  • kubectl auf Ihre Cluster- config-Datei verweist.

Als Vorabprüfung können Sie die Knoten Ihres Clusters auflisten:

# export KUBECONFIG=<your-kubeconfig-file-location>
kubectl get nodes

Das CertManager Helm-Chart verwendet einige benutzerdefinierte Ressourcendefinitionen (Custom Resource Definitions, CRDs), die wir in unserem Cluster einsetzen müssen. Neben mehreren standardmäßig in Kubernetes verfügbaren Ressourcen (z. B. Pods, Deployments oder Services) ermöglichen CRDs die Bereitstellung benutzerdefinierter Ressourcen, die von Drittentwicklern definiert wurden, um weitere benutzerdefinierte Anwendungsfälle zu erfüllen. Fügen wir mit dem folgenden Befehl CRDs zu unserem Cluster hinzu:

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.2/cert-manager.crds.yaml

Die Liste der Ressourcen wird nach der Ausführung des Befehls angezeigt. Wenn wir später auf sie verweisen wollen, können wir auch den folgenden kubectl-Befehl verwenden:

kubectl get crd -l app.kubernetes.io/name=cert-manager
...
NAME                                  CREATED AT
certificaterequests.cert-manager.io   2022-12-18T11:15:08Z
certificates.cert-manager.io          2022-12-18T11:15:08Z
challenges.acme.cert-manager.io       2022-12-18T11:15:08Z
clusterissuers.cert-manager.io        2022-12-18T11:15:08Z
issuers.cert-manager.io               2022-12-18T11:15:08Z
orders.acme.cert-manager.io           2022-12-18T11:15:08Z

Warnung

Magnum führt einige Pod-Sicherheitsrichtlinien (PSP) ein, die einige zusätzliche Sicherheitsvorkehrungen für den Cluster bieten, aber Konflikte mit dem CertManager Helm-Diagramm verursachen. PodSecurityPolicy ist bis Kubernetes 1.25 veraltet, wird aber noch in den Versionen 1.21 bis 1.23 von Kubernetes unterstützt, die auf CODE-DE cloud verfügbar sind. Die folgenden Befehle können Warnungen über die Veralterung ausgeben, aber die Installation sollte trotzdem fortgesetzt werden.

Schritt 2 Installieren Sie CertManager Helm chart

Um eine korrekte Bereitstellung der CertManager Helm-Tabelle zu gewährleisten, müssen wir die Datei my-values.yaml überschreiben und den entsprechenden Inhalt einfügen:

my-values.yaml

global:
  podSecurityPolicy:
    enabled: true
    useAppArmor: false

Der folgende Code installiert das CertManager Helm-Diagramm in einem Namespace cert-manager und verwendet gleichzeitig my-values.yaml:

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.9.2 --values my-values.yaml

Dies ist das Ergebnis:

helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.9.2 --values my-values.yaml
W0208 10:16:08.364635     212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0208 10:16:08.461599     212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0208 10:16:08.502602     212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0208 10:16:11.489377     212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0208 10:16:11.489925     212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0208 10:16:11.524300     212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0208 10:16:13.949045     212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0208 10:16:15.038803     212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0208 10:17:36.084859     212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
NAME: cert-manager
LAST DEPLOYED: Wed Feb  8 10:16:07 2023
NAMESPACE: cert-manager
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
cert-manager v1.9.2 has been deployed successfully!

In order to begin issuing certificates, you will need to set up a ClusterIssuer
or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).

Wir sehen, dass cert-manager erfolgreich bereitgestellt wurde, erhalten aber auch einen Hinweis, dass ClusterIssuer oder eine Issuer-Ressource ebenfalls installiert werden muss. Unser nächster Schritt besteht darin, einen Beispieldienst im Cluster zu installieren und dann mit der Erstellung und Bereitstellung eines Issuer fortzufahren.

Schritt 3 Erstellen eines Deployments und eines Dienstes

Lassen Sie uns den NGINX-Dienst als Standardbeispiel für eine Kubernetes-Anwendung bereitstellen. Zuerst erstellen wir ein Standard-Kubernetes-Deployment und dann einen Dienst vom Typ NodePort. Schreiben Sie den folgenden Inhalt in die Datei my-nginx.yaml :

my-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx-deployment
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 1
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: my-nginx-service
  labels:
    run: my-nginx
spec:
  type: NodePort
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx

Bereitstellung mit dem folgenden Befehl:

kubectl apply -f my-nginx.yaml

Schritt 4 Erstellen und Bereitstellen eines Emittenten

Installieren Sie nun einen Issuer. Es handelt sich dabei um eine benutzerdefinierte Kubernetes-Ressource und stellt eine Zertifizierungsstelle (CA) dar, die sicherstellt, dass unsere HTTPS signiert sind und daher von den Browsern als vertrauenswürdig eingestuft werden. CertManager unterstützt verschiedene Aussteller, in unserem Beispiel werden wir Let’s Encrypt verwenden, das das ACME-Protokoll nutzt.

Erstellen Sie eine neue Datei mit dem Namen my-nginx-issuer.yaml und fügen Sie den folgenden Inhalt in diese Datei ein. Ändern Sie die E-Mail-Adresse XXXXXXXXX@YYYYYYYYY.com in Ihre eigene und echte E-Mail-Adresse.

my-nginx-issuer.yaml

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: my-nginx-issuer
spec:
  acme:
    email: [email protected]
    server: https://acme-v02.api.letsencrypt.org/directory # production
    privateKeySecretRef:
      name: letsencrypt-secret # different secret name than for ingress
    solvers:
      # HTTP-01 challenge provider, creates additional ingress, refer to CertManager documentation for detailed explanation
      - http01:
          ingress:
            class: nginx

Dann auf dem Cluster bereitstellen:

kubectl apply -f my-nginx-issuer.yaml

Als Ergebnis wird der Issuer bereitgestellt, und ein Secret namens letsencrypt-secret mit einem privaten Schlüssel wird ebenfalls bereitgestellt.

Schritt 5 Assoziieren der Domäne mit NGINX Ingress

Um die Website im Browser anzuzeigen, muss Ihr HTTPS-Zertifikat mit einer bestimmten Domain verknüpft werden. Dazu sollten Sie eine echte Domain haben, die bereits bei einem Domain-Registrar registriert ist.

Als Sie Ihren Cluster mit NGINX ingress eingerichtet haben, wurde im Hintergrund ein LoadBalancer mit einer öffentlichen IP-Adresse eingerichtet. Sie erhalten diese Adresse, indem Sie sie in der Horizon-Webschnittstelle nachschlagen. Wenn Ihre Liste der Floating-IPs länger ist, können Sie sie leicht am Namen erkennen:

../_images/floating_ips.png

Nun müssen Sie bei Ihrer Domänenregistrierungsstelle den A-Eintrag der Domäne mit der floating IP-Adresse des Ports verbinden, an dem Ihre Anwendung zugänglich sein wird. Wie dies zu bewerkstelligen ist, hängt von der jeweiligen Registrierstelle ab, weshalb wir hier keine detaillierten Anweisungen geben werden.

Sie können auch den DNS-Befehl in Horizon verwenden, um den Domänennamen, den Sie haben, mit dem Cluster zu verbinden. Siehe Voraussetzung Nr. 7 für weitere Details.

Schritt 6 Erstellen und Bereitstellen einer Ingress-Ressource

Der letzte Schritt ist die Bereitstellung der Ingress-Ressource. Diese führt die notwendigen Schritte durch, um die Zertifikatsanforderung bei der CA zu initiieren und schließlich das HTTPS-Zertifikat für Ihren Dienst bereitzustellen. Um fortzufahren, fügen Sie den folgenden Inhalt in die Datei my-nginx-ingress.yaml ein. Ersetzen Sie mysampledomain.eu durch Ihre Domain.

my-nginx-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    # below annotation is for using cert manager's "ingress shim", refer to CertManager documentation
    cert-manager.io/issuer: my-nginx-issuer # use the name of the issuer here
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - mysampledomain.eu #change to own domain
    secretName: my-nginx-secret
  rules:
  - host: mysampledomain.eu #change to own domain
    http:
      paths:
      - path: /*
        pathType: Prefix
        backend:
          service:
            name: my-nginx-service
            port:
              number: 80

Dann stellen Sie bereit mit:

kubectl apply -f my-nginx-ingress.yaml

Wenn alles funktioniert, ist der Vorgang abgeschlossen und nach ein paar Minuten sollte das Schlosszeichen vor unserer IP-Adresse zu sehen sein. Der Dienst ist nun HTTPS-gesichert, und Sie können die Details des Zertifikats überprüfen, indem Sie auf das Schloss-Symbol klicken.

../_images/image2022-12-9_10-55-8.png

Was als nächstes zu tun ist

Der Artikel Using Kubernetes Ingress on CODE-DE FRA1-1 OpenStack Magnum zeigt, wie man einen HTTP-basierten Dienst oder eine Site erstellt.

Wenn Sie weitere Informationen zu Helm-Charts benötigen: Einsatz von Helm Charts auf Magnum Kubernetes-Clustern auf der CODE-DE FRA1-1 Cloud.