Mis à jour le 10/01/2020. Un peu plus d'un an s'est écoulé depuis la rédaction de l'article et un certain nombre d'exemples ont cessé de fonctionner - les technologies se développent, j'ai donc ajouté et refait un peu les exemples.Dans cet article, je voudrais parler de l'installation de Kubernetes sur le cloud Hetzner.
Ubuntu Linux 18.04 est installé sur mon ordinateur de travail et tous les exemples impliqueront l'utilisation de ce système d'exploitation.
Pour travailler avec le cloud Hetzner et créer un cluster Kubernetes, nous utiliserons l'
utilitaire hetzner-kube . Installez-le sur votre ordinateur local.
$ 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
Pour utiliser l'utilitaire hetzner-kube et l'autoriser dans le cloud Hetzner, vous devez créer l'API de jeton via la console Hetzner Cloud
https://console.hetzner.cloud . En haut, sélectionnez Sélectionner un projet -> Par défaut, sélectionnez l'élément Accès dans le menu de gauche, puis accédez à la section Jetons d'API, cliquez sur le bouton Générer le jeton d'API.
En conséquence, l'API Token sera générée et devra être spécifiée dans la configuration de l'utilitaire hetzner-kube.
$ hetzner-kube context add k8s Token: <PASTE TOKEN HERE> added context 'k8s'
Ensuite, nous devons générer une clé SSH qui sera utilisée pour accéder aux serveurs dans le cloud Hetzner. Pour ce faire, utilisez l'utilitaire 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]-----+
Par conséquent, deux fichiers ~ / .ssh / id_rsa (clé privée) et ~ / .ssh / id_rsa.pub (clé publique) seront créés dans votre répertoire personnel.
Ajoutez la clé publique ssh au cloud Hetzner:
$ hetzner-kube ssh-key add --name k8s sshKeyAdd called SSH key k8s(95430) created
La création d'un cluster Kubernetes directement est très simple:
$ 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!
Cette commande crée automatiquement des serveurs virtuels dans le cloud Hetzner et y installe le nombre spécifié de nœuds maître / travailleur du cluster Kubernetes. Par défaut, les serveurs virtuels CX11 seront utilisés.
Plus tard, à l'aide de l'utilitaire hetzner-kube, il est également facile de modifier la configuration du cluster Kubernetes en ajoutant des nœuds de travail. Par exemple, ajoutez 2 nœuds de travail:
$ hetzner-kube cluster add-worker --name k8s --nodes 2
Malheureusement, il n'est actuellement pas possible de modifier la configuration du nœud maître à l'aide de l'utilitaire hetzner-kube sans reconstruire complètement le cluster Kubernetes.
L'utilitaire kubectl est utilisé pour fonctionner avec le cluster Kubernetes. Des instructions détaillées pour l'installer pour différents systèmes d'exploitation peuvent être trouvées
sur le lien suivant .
Pour pouvoir travailler avec le cluster Kubernetes créé à l'aide de la commande kubectl, vous devez enregistrer la configuration du cluster créé localement comme suit:
$ hetzner-kube cluster kubeconfig k8s create file kubeconfig configured
Le fichier de configuration est enregistré dans ~ / .kube / config.
Passons maintenant à la partie la plus intéressante - la configuration du cluster Kubernetes résultant.
Pour commencer, nous allons créer les ressources de base nécessaires au déploiement futur des applications. Vous pouvez trouver des informations plus détaillées sur le
lien suivant .
$ 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
De plus, il est nécessaire que le contrôleur d'entrée nous soit accessible depuis Internet. Pour ce faire, utilisez l'utilitaire kubectl pour modifier le service / ingress-nginx et ajoutez-y la liste des adresses IP publiques du nœud de travail / maître de notre cluster Kubernetes (uniquement celles que nous voulons utiliser pour traiter les demandes entrantes provenant d'Internet).
$ kubectl -n ingress-nginx edit service/ingress-nginx
et ajoutez la section suivante au manifeste YAML
spec: externalIPs: - XXXX - YYYY
Ajoutez des enregistrements A à votre domaine et attendez que les informations les concernant apparaissent dans le CSN. Par exemple:
Type: A Name: echo.example.com Value: XXXX
Si vous avez spécifié plusieurs adresses IP externes dans ingress-nginx.yaml, vous pouvez créer plusieurs enregistrements DNS identiques avec ces adresses IP. Dans ce cas, les demandes pour votre domaine seront réparties entre ces adresses IP et un équilibrage de charge se produira.
Dans cet exemple, pour que https fonctionne, nous générerons un certificat SSL auto-signé.
$ 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>
Maintenant, nous ajoutons notre application. Un simple échoserveur a été choisi comme exemple. Créez un fichier appelé app.yaml avec le contenu suivant:
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
C'est tout)) Vérifiez le résultat:
$ 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