Aktualisiert am 01.10.2020. Etwas mehr als ein Jahr ist vergangen, seit der Artikel geschrieben wurde und einige Beispiele nicht mehr funktionieren - die Technologien entwickeln sich weiter, deshalb habe ich die Beispiele ein wenig hinzugefügt und überarbeitet.In diesem Artikel möchte ich über die Installation von Kubernetes in der Hetzner Cloud sprechen.
Ubuntu Linux 18.04 ist auf meinem Arbeitscomputer installiert und alle Beispiele implizieren die Verwendung dieses Betriebssystems.
Um mit der Hetzner Cloud zu arbeiten und einen Kubernetes-Cluster zu erstellen, verwenden wir das
Dienstprogramm hetzner-kube . Installieren Sie es auf Ihrem lokalen Computer.
$ wget https://github.com/xetys/hetzner-kube/releases/download/0.5.1/hetzner-kube-0.5.1-linux-amd64 $ chmod a+x ./hetzner-kube-0.5.1-linux-amd64 $ sudo mv ./hetzner-kube-0.5.1-linux-amd64 /usr/local/bin/hetzner-kube
Um das Dienstprogramm hetzner-kube zu verwenden und es in der Hetzner Cloud zu autorisieren, müssen Sie die Token-API über die Hetzner Cloud Console
https://console.hetzner.cloud erstellen. Wählen Sie oben Projekt auswählen -> Standard aus, wählen Sie im linken Menü das Element Zugriff aus, gehen Sie zum Abschnitt API-Token und klicken Sie auf die Schaltfläche API-Token generieren.
Infolgedessen wird die Token-API generiert und muss in der Konfiguration des Dienstprogramms hetzner-kube angegeben werden.
$ hetzner-kube context add k8s Token: <PASTE TOKEN HERE> added context 'k8s'
Als nächstes müssen wir einen SSH-Schlüssel generieren, der für den Zugriff auf die Server in der Hetzner Cloud verwendet wird. Verwenden Sie dazu das Dienstprogramm ssh-keygen:
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (~/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ~/.ssh/id_rsa. Your public key has been saved in ~/.ssh/id_rsa.pub. The key fingerprint is: SHA256:1bwptZ8lPiAhtA37/2U1G7HsC+aE7qMVCtVIfN3OLzk lx4241@LX4241-LINUX The key's randomart image is: +---[RSA 2048]----+ | +. . . | | ..*o+ . . | | +o=.+ o. | | .+ o +.oo| | .S +.= .*+| | . .+o+E+*| | . o.+==o| | o.+..+.| | .oo.... | +----[SHA256]-----+
Infolgedessen werden zwei Dateien ~ / .ssh / id_rsa (privater Schlüssel) und ~ / .ssh / id_rsa.pub (öffentlicher Schlüssel) in Ihrem Home-Verzeichnis erstellt.
Fügen Sie der Hetzner Cloud den öffentlichen SSH-Schlüssel hinzu:
$ hetzner-kube ssh-key add --name k8s sshKeyAdd called SSH key k8s(95430) created
Das direkte Erstellen eines Kubernetes-Clusters ist sehr einfach:
$ hetzner-kube cluster create --name k8s --ssh-key k8s --master-count 1 --worker-count 1 2018/08/02 13:57:57 Creating new cluster NAME:k8s MASTERS: 1 WORKERS: 1 ETCD NODES: 0 HA: false ISOLATED ETCD: false 2018/08/02 13:57:58 creating server 'k8s-master-01'... --- [======================================] 100% 2018/08/02 13:58:18 Created node 'k8s-master-01' with IP 159.69.54.228 2018/08/02 13:58:18 creating server 'k8s-worker-01'... --- [======================================] 100% 2018/08/02 13:58:37 Created node 'k8s-worker-01' with IP 159.69.51.140 2018/08/02 13:58:37 sleep for 10s... k8s-master-01 : complete! 100.0% [==============] k8s-worker-01 : complete! 100.0% [==============] 2018/08/02 14:02:50 Cluster successfully created!
Dieser Befehl erstellt automatisch virtuelle Server in der Hetzner Cloud und installiert die angegebene Anzahl von Master / Worker-Knoten des Kubernetes-Clusters auf diesen. Standardmäßig werden virtuelle CX11-Server verwendet.
Später ist es mit dem Dienstprogramm hetzner-kube auch einfach, die Konfiguration des Kubernetes-Clusters durch Hinzufügen von Arbeitsknoten zu ändern. Fügen Sie beispielsweise 2 Arbeitsknoten hinzu:
$ hetzner-kube cluster add-worker --name k8s --nodes 2
Leider ist es derzeit nicht möglich, die Masterknotenkonfiguration mit dem Dienstprogramm hetzner-kube zu ändern, ohne den Kubernetes-Cluster vollständig neu zu erstellen.
Das Dienstprogramm kubectl wird für die Arbeit mit dem Kubernetes-Cluster verwendet. Detaillierte Anweisungen zur Installation für verschiedene Betriebssysteme finden Sie
unter folgendem Link .
Um mit dem erstellten Kubernetes-Cluster mit dem Befehl kubectl arbeiten zu können, müssen Sie die Konfiguration des erstellten Clusters wie folgt lokal speichern:
$ hetzner-kube cluster kubeconfig k8s create file kubeconfig configured
Die Konfigurationsdatei wird in ~ / .kube / config gespeichert.
Kommen wir nun zum interessantesten Teil - der Konfiguration des resultierenden Kubernetes-Clusters.
Zunächst erstellen wir die grundlegenden Ressourcen, die für die zukünftige Anwendungsbereitstellung erforderlich sind. Weitere Informationen finden Sie unter
folgendem Link .
$ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/mandatory.yaml | kubectl apply -f - % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 6170 100 6170 0 0 13987 0 --:--:-- --:--:-- --:--:-- 14022 namespace/ingress-nginx created configmap/nginx-configuration created configmap/tcp-services created configmap/udp-services created serviceaccount/nginx-ingress-serviceaccount created clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created role.rbac.authorization.k8s.io/nginx-ingress-role created rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created deployment.apps/nginx-ingress-controller created limitrange/ingress-nginx created $ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/provider/baremetal/service-nodeport.yaml | kubectl apply -f - service/ingress-nginx created
Weiterhin ist es notwendig, dass der Ingress Controller über das Internet für uns zugänglich ist. Verwenden Sie dazu das Dienstprogramm kubectl, um service / ingress-nginx zu bearbeiten und die Liste der öffentlichen IP-Adressen des Worker / Master-Knotens unseres Kubernetes-Clusters hinzuzufügen (nur diejenigen, die wir zur Verarbeitung eingehender Anforderungen aus dem Internet verwenden möchten).
$ kubectl -n ingress-nginx edit service/ingress-nginx
und fügen Sie den nächsten Abschnitt zum YAML-Manifest hinzu
spec: externalIPs: - XXXX - YYYY
Fügen Sie Ihrer Domain A-Einträge hinzu und warten Sie, bis die Informationen dazu im CSN angezeigt werden. Zum Beispiel:
Type: A Name: echo.example.com Value: XXXX
Wenn Sie in ingress-nginx.yaml mehrere externe IP-Adressen angegeben haben, können Sie mit diesen IP-Adressen mehrere identische DNS-Einträge erstellen. In diesem Fall werden Anforderungen für Ihre Domain auf diese IP-Adressen verteilt und ein Lastausgleich erfolgt.
In diesem Beispiel generieren wir ein selbstsigniertes SSL-Zertifikat, damit https funktioniert.
$ openssl req -newkey rsa:2048 -nodes -keyout echo.example.com.key -x509 -days 365 -out echo.example.com.crt Generating a 2048 bit RSA private key ..+++ .............+++ writing new private key to 'echo.example.com.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:UA State or Province Name (full name) [Some-State]:Kyiv Locality Name (eg, city) []:Kyiv Organization Name (eg, company) [Internet Widgits Pty Ltd]:Super Company Ltd Organizational Unit Name (eg, section) []:echo.example.com Common Name (eg server FQDN or YOUR name) []:echo.example.com Email Address []:info@echo.example.com $ cat echo.example.com.key | base64 | tr -d '\n' <YOUR PRIVATE KEY> $ cat echo.example.com.crt | base64 | tr -d '\n' <YOUR CERTIFICATE>
Jetzt fügen wir unsere Anwendung hinzu. Als Beispiel wurde ein einfacher Echoserver gewählt. Erstellen Sie eine Datei mit dem Namen app.yaml mit den folgenden Inhalten:
apiVersion: v1 kind: Namespace metadata: name: echoserver --- apiVersion: v1 kind: Secret metadata: name: echo.example.com-tls namespace: echoserver type: kubernetes.io/tls data: tls.crt: <YOUR CERTIFICATE> tls.key: <YOUR PRIVATE KEY> --- apiVersion: apps/v1 kind: Deployment metadata: name: echoserver namespace: echoserver spec: replicas: 1 selector: matchLabels: app: echoserver template: metadata: labels: app: echoserver spec: containers: - image: gcr.io/google_containers/echoserver:1.0 imagePullPolicy: Always name: echoserver ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: echoserver namespace: echoserver spec: ports: - name: http port: 80 targetPort: 8080 protocol: TCP selector: app: echoserver --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: echoserver namespace: echoserver annotations: kubernetes.io/ingress.class: "nginx" spec: tls: - hosts: - echo.example.com secretName: echo.example.com-tls rules: - host: echo.example.com http: paths: - path: / backend: serviceName: echoserver servicePort: 80
$ kubectl apply -f app.yaml namespace "echoserver" configured deployment "echoserver" unchanged service "echoserver" configured ingress "echoserver" unchanged
Das ist alles)) Überprüfen Sie das Ergebnis:
$ curl https://echo.example.com/ CLIENT VALUES: client_address=('10.244.3.2', 32860) (10.244.3.2) command=GET path=/ real path=/ query= request_version=HTTP/1.1 SERVER VALUES: server_version=BaseHTTP/0.6 sys_version=Python/3.5.0 protocol_version=HTTP/1.0 HEADERS RECEIVED: Accept=*/* Connection=close Host=echo.example.com User-Agent=curl/7.58.0 X-Forwarded-For=10.244.0.0 X-Forwarded-Host=echo.example.com X-Forwarded-Port=80 X-Forwarded-Proto=http X-Original-URI=/ X-Real-IP=10.244.0.0 X-Request-ID=7a4f4aabf9a0043ea2b1ca91bd1a3adf X-Scheme=http