Instalar Kubernetes en Hetzner Cloud

Actualizado 10/01/2020. Ha pasado poco más de un año desde la redacción del artículo y varios ejemplos han dejado de funcionar: las tecnologías se están desarrollando, por lo que agregué y rehice un poco los ejemplos.

En este artículo, me gustaría hablar sobre la instalación de Kubernetes en la nube de Hetzner.

Ubuntu Linux 18.04 está instalado en mi computadora en funcionamiento y todos los ejemplos implicarán el uso de este sistema operativo.

Para trabajar con Hetzner Cloud y construir un clúster de Kubernetes, utilizaremos la utilidad hetzner-kube . Instálalo en tu computadora 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 

Para usar la utilidad hetzner-kube y autorizarla en Hetzner Cloud, debe crear la API Token a través de Hetzner Cloud Console https://console.hetzner.cloud . En la parte superior, seleccione Seleccionar un proyecto -> Predeterminado, seleccione el elemento Acceso en el menú de la izquierda, luego vaya a la sección de tokens de API, haga clic en el botón Generar token de API.

Como resultado, se generará la API Token y deberá especificarse en la configuración de la utilidad hetzner-kube.

 $ hetzner-kube context add k8s Token: <PASTE TOKEN HERE> added context 'k8s' 

A continuación, necesitamos generar una clave SSH que se utilizará para acceder a los servidores en la nube de Hetzner. Para hacer esto, use la utilidad 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]-----+ 

Como resultado, se crearán dos archivos ~ / .ssh / id_rsa (clave privada) y ~ / .ssh / id_rsa.pub (clave pública) en su directorio de inicio.

Agregue la clave ssh pública a la nube de Hetzner:

 $ hetzner-kube ssh-key add --name k8s sshKeyAdd called SSH key k8s(95430) created 

Crear un clúster de Kubernetes directamente es muy fácil:

 $ 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! 

Este comando creará automáticamente servidores virtuales en la nube de Hetzner e instalará el número especificado de nodos maestros / trabajadores del clúster de Kubernetes en ellos. Por defecto, se utilizarán los servidores virtuales CX11.

Más tarde, utilizando la utilidad hetzner-kube, también es fácil cambiar la configuración del clúster de Kubernetes agregando nodos de trabajo. Por ejemplo, agregue 2 nodos de trabajo:

 $ hetzner-kube cluster add-worker --name k8s --nodes 2 

Desafortunadamente, cambiar la configuración del nodo maestro usando la utilidad hetzner-kube sin reconstruir completamente el clúster de Kubernetes actualmente no es posible.

La utilidad kubectl se utiliza para trabajar con el clúster de Kubernetes. Las instrucciones detalladas para instalarlo para diferentes sistemas operativos se pueden encontrar en el siguiente enlace .

Para trabajar con el clúster Kubernetes creado utilizando el comando kubectl, debe guardar la configuración del clúster creado localmente de la siguiente manera:

 $ hetzner-kube cluster kubeconfig k8s create file kubeconfig configured 

El archivo de configuración se guarda en ~ / .kube / config.

Ahora pasemos a la parte más interesante: configurar el clúster Kubernetes resultante.

Para comenzar, crearemos los recursos básicos necesarios para la futura implementación de aplicaciones. Puede encontrar información más detallada en el siguiente enlace .

 $ 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 


Además, es necesario que podamos acceder al controlador de ingreso desde Internet. Para hacer esto, use la utilidad kubectl para editar service / ingress-nginx y agregue la lista de direcciones IP públicas del nodo trabajador / maestro de nuestro clúster de Kubernetes (solo aquellas que queremos usar para procesar las solicitudes entrantes de Internet).

 $ kubectl -n ingress-nginx edit service/ingress-nginx 

y agregue la siguiente sección al manifiesto YAML
 spec: externalIPs: - XXXX - YYYY 


Agregue registros A a su dominio y espere hasta que la información sobre ellos aparezca en el CSN. Por ejemplo:

 Type: A Name: echo.example.com Value: XXXX 


Si especificó varias direcciones IP externas en ingress-nginx.yaml, puede crear varios registros DNS idénticos con estas direcciones IP. En este caso, las solicitudes para su dominio se distribuirán entre estas direcciones IP y se producirá un equilibrio de carga.

En este ejemplo, para que https funcione, generaremos un certificado SSL autofirmado.

 $ 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> 


Ahora agregamos nuestra aplicación. Se eligió un simple echoserver como ejemplo. Cree un archivo llamado app.yaml con el siguiente contenido:

 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 


Eso es todo)) Comprueba el resultado:

 $ 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 

Source: https://habr.com/ru/post/es419323/


All Articles