Orquesta Cibernética. Docker Container Orchestration con aplicaciones .NET Core en la nube

Para garantizar el equilibrio de carga, la escalabilidad y aumentar la tolerancia a fallas, se pueden usar herramientas auxiliares: orquestadores. Entre ellos, el servicio de Kubernetes ahora es muy popular. La forma más fácil de probarlo en la práctica es implementarlo en la nube, lo que haremos hoy.



Nota: continuamos la serie de publicaciones de versiones completas de artículos de la revista Hacker. Ortografía y puntuación del autor guardado.


Expandir AKS


Vamos al portal de Azure , hacemos clic en "Crear recurso" y buscamos un servicio llamado Servicio Kubernetes.


Elija el nombre y prefijo DNS a su gusto. El nombre afecta cómo accederá a su clúster, pero el prefijo afecta su FQDN.



La máquina virtual más barata actualmente cuesta poco más de $ 30 al mes.


El segundo paso es crear un principal de servicio. El principal de servicio es un tipo de cuenta de servicio bajo la cual se pueden realizar ciertas tareas específicas. La ventaja es que los derechos de dicha cuenta pueden ser limitados. Además, puede crear cualquier cantidad de tales cuentas (mientras que la cantidad de cuentas normales está limitada por suscripción). Puede encontrar las cuentas principales de servicio creadas en Active Directory entre Registros de aplicaciones.



RBAC (control de acceso basado en roles) es la capacidad de restringir o proporcionar acceso a recursos específicos (o grupos de recursos). Es decir, puede distinguir qué usuarios de su suscripción tienen derechos de acceso y cuáles no.



Por el momento, el proceso dura unos 20 minutos, pero todo puede depender de la configuración.


Encuentra guías oficiales siguiendo los enlaces
Crear un clúster AKS usando el portal
Crear un clúster de AKS con la CLI


Para trabajar, necesitamos la línea de comandos de Azure: CLI (Interfaz de línea de comandos). Se puede instalar tanto en Windows como en macOS o Linux. Personalmente, prefiero usar Azure Cloud Shell. Esta es la línea de comando que se ejecuta desde la página de Azure Portal cargada en el navegador. Para funcionar, requiere el almacenamiento de blobs creado. Su costo será de unos pocos centavos por mes y, por lo tanto, prefiero no preocuparme por instalar CLI en mi automóvil.


Kubernetes admite varias tecnologías de contenedores, pero echemos un vistazo al más popular: Docker. docker.hub le permite almacenar una imagen de docker privada de forma gratuita. Si necesita más, puede colocarlos por dinero. Pero por dinero, se puede colocar una imagen de acoplador privado en el Registro de contenedores de Azure. Ahora los precios comienzan en $ 5 por mes (para SKU básico).


Creé un servicio ACR bajo el nombre de myservice. Si también decide usar ACR, entonces, al crear un servicio, necesitará obtener sus claves.



Entonces será posible iniciar sesión ejecutando el comando:


docker login myservice.azurecr.io 

Ingrese el nombre de usuario (myservice) y la contraseña tomada del portal (PJSeyO9 = lCMRDI7dGkz68wjhFGRGxSY3)


Ahora, yendo al directorio con el proyecto, será posible construir una imagen mientras la marca con la etiqueta deseada. Y después de eso envíalo al servicio en la nube:


 docker build -t myservice.azurecr.io/myservice . docker push myservice.azurecr.io/myservice 

Secretos, secretos ... Brindamos acceso a la imagen y guardamos la configuración.


Cuando trabaje con AKS desplegado, necesita obtener sus créditos. De lo contrario, los comandos de kubectl no se ejecutarán. Para acceder a AKS, se ejecuta el siguiente comando:


 az aks get-credentials --resource-group KubernetesGroup --name verycoolcluster 

Para acceder a la imagen de Docker ubicada en el repositorio de Docker en un contenedor privado, debe crear un secreto. Si tiene una imagen pública, puede omitir este paso.


Para crear un archivo secreto, debe ejecutar un comando de la siguiente forma:


 kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email> 

Si su imagen está en el repositorio de Docker, el valor de <your-registry-server> será https://index.docker.io/v1/


Para Azure Container Registry, el FQDN será <nombre-registro> .azurecr.io


Es decir, para crear un secreto para el contenedor en mi caso, hice:


 kubectl create secret docker-registry regcred --docker-server="myservice.azurecr.io" --docker-username="myservice" --docker-password="PJSeyO9=lCMRDI7dGkz68wjhFGRGxSY3" --docker-email="asommer@yandex.ru" 

Ahora puede ver el contenido del archivo secreto creado con el comando:


 kubectl get secret regcred --output=yaml 

INFORMACIÓN


Si usa AKS, no puede crear un archivo secreto, pero proporciona acceso al servicio ACR al servicio AKS de otra manera: ejecutando un script especial. Puedes tomarlo de la siguiente página:


Autenticar con Azure Container Registry del Servicio Azure Kubernetes


 #!/bin/bash AKS_RESOURCE_GROUP=KubernetesGroup AKS_CLUSTER_NAME=verycoolcluster ACR_RESOURCE_GROUP=MyACRGroup ACR_NAME=myservice # Get the id of the service principal configured for AKS CLIENT_ID=$(az aks show --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query "servicePrincipalProfile.clientId" --output tsv) # Get the ACR registry resource id ACR_ID=$(az acr show --name $ACR_NAME --resource-group $ACR_RESOURCE_GROUP --query "id" --output tsv) # Create role assignment az role assignment create --assignee $CLIENT_ID --role Reader --scope $ACR_ID 

Simplemente puede modificar los valores de las variables AKS * y ACR *, luego copiar el script y pegarlo en la CLI de Azure o Cloud Shell.


Kubernetes contiene una tienda de credenciales segura. Es decir, puede crear un archivo con la configuración y el acceso a esta configuración desde el exterior será difícil. Este archivo generalmente contiene cadenas de conexión de base de datos y algún tipo de crédito. Si no tiene dicha información en la aplicación (¿es eso cierto?), Puede omitir este paso.


Para crear un archivo de configuración desde la línea de comandos, primero debemos considerar el comando vi.


 vi < > 

creará un archivo si falta o abre uno existente


Para guardar los cambios ingresados ​​presione ESC y luego ZZ


Para simplemente salir sin guardar ESC y después: q!


Una descripción muy corta, pero debería ser suficiente. Puedo agregar que la tecla Insertar puede ser muy útil.


Entonces, a través de Azure Cloud Shell, cree un archivo con un nombre arbitrario (por ejemplo, appsettings.json) y el contenido que necesita. Admitamos tal:


 { "ConnectionString": "some secret string goes there" } 

Y después de ejecutar el comando:


 kubectl create secret generic secret-appsettings --from-file=/home/youraccount/appsettings.json 

Este comando creará un secreto con configuraciones llamadas aplicaciones secretas
Puede averiguar con qué ruta reemplazar / home / youraccount con el comando pwd


Crear despliegue


Las implementaciones son para servicios sin estado. Describen cómo se crearán Pods y ReplicaSets y cómo se actualizarán. Pod es un grupo de contenedores (o un contenedor único) que funcionan en el mismo entorno. El propósito de ReplicaSet es controlar que el número especificado de pods se lanzará y funcionará constantemente.
Basado en lo creado previamente, creo un archivo deploy.yaml que creará 3 sub. El archivo contiene el siguiente código (le recuerdo que los espacios en yaml son muy importantes):


 apiVersion: apps/v1beta1 kind: Deployment metadata: name: mydeployment spec: replicas: 3 minReadySeconds: 10 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 template: metadata: labels: app: myapp spec: containers: - name: app image: myservice.azurecr.io/myservice:latest ports: - containerPort: 80 name: http protocol: TCP imagePullPolicy: Always env: - name: "ASPNETCORE_ENVIRONMENT" value: "Production" volumeMounts: - name: secrets mountPath: /app/secrets readOnly: true imagePullSecrets: - name: regcred volumes: - name: secrets secret: secretName: secret-appsettings 

Considera el código. El comienzo describe el número de réplicas y la estrategia de actualización. Luego, la implementación recibe un nombre (myapp) y se indica una referencia a la imagen del contenedor. Los puertos están registrados. 80 es el puerto estándar para http. A continuación se encuentran las configuraciones del entorno ASP.NET Core. Luego se montaron los créditos de la imagen del acoplador privado y la configuración de la aplicación secreta que creamos recientemente.


  strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 

Esta pieza es responsable del proceso de actualización. maxSurge: la cantidad de hogares creados en exceso de los existentes al actualizar (en unidades o porcentaje). maxUnavailable: el número máximo de hogares que pueden no estar disponibles durante el proceso de actualización.
la implementación se puede crear usando el comando:


 kubectl apply -f deploy.yaml 

Meet Ingress


Para proporcionar acceso a los servicios de clúster y organizar el equilibrio de carga, se utiliza un servicio llamado ingreso. Una solución bastante popular es el ingreso basado en nginx. La forma más fácil de instalarlo es usando el administrador de paquetes de Kubernetes llamado helm. La ventaja de Azure Cloud Shell es que el timón ya está instalado en él. Lo que queda por hacer para instalar nginx-ingress. Ingrese:


 helm init 

Espera un poco y ejecuta:


 helm install stable/nginx-ingress --namespace kube-system --set rbac.create=false 

Crear certificados SSL con LetsEncrypt


Dado que el certificado SSL está vinculado a algún nombre de dominio, configuraremos nuestro nombre de recurso DNS.


Ejecute el siguiente comando y tome la IP externa


 kubectl get service -l app=nginx-ingress --namespace kube-system 

Sustituya IP y el nombre que inventamos para el subdominio en el siguiente script


 #!/bin/bash # Public IP address of your ingress controller IP="168.63.19.2" # Name to associate with public IP address DNSNAME="myservice-ingress" # Get the resource-id of the public ip PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --output tsv) # Update public ip address with DNS name az network public-ip update --ids $PUBLICIPID --dns-name $DNSNAME 

Simplemente copiamos este script, lo pegamos en la línea de comando y lo ejecutamos de esta manera. Como nombre para el subdominio, configuré un nombre muy "original" - myservice-ingress


Instale el administrador de certificados de la misma manera copiando y pegando el siguiente script en la línea de comando. Aquí, incluso nada especial necesita ser cambiado.


 helm install \ --name cert-manager \ --namespace kube-system \ stable/cert-manager \ --set ingressShim.defaultIssuerName=letsencrypt-prod \ --set ingressShim.defaultIssuerKind=ClusterIssuer \ --set rbac.create=false \ --set serviceAccount.create=false 

INFORMACIÓN


Si tuviéramos un clúster con RBAC, entonces el script sería diferente.


 helm install stable/cert-manager --set ingressShim.defaultIssuerName=letsencrypt-staging --set ingressShim.defaultIssuerKind=ClusterIssuer 

Si el archivo del certificado está disponible, puede agregarlo de la siguiente manera:


 kubectl create secret tls tls-secret --cert CERT.crt --key KEY-FOR-CERT.key 

Pero como no tenemos un certificado CA firmado, tendremos que bailar un poco con una pandereta. Crearemos una CA utilizando un servicio gratuito llamado LetsEncrypt . LetsEncrypt es una Autoridad de certificación que emite certificados de forma gratuita. Una organización tan altruista, cuyo objetivo es asegurar Internet.


Por lo tanto, cree el archivo cluster-issuer.yaml. Describe la organización que emitió el certificado.


 apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: youeemail@yourdomain.ru privateKeySecretRef: name: letsencrypt-prod http01: {} 

Solo necesita reemplazar el correo electrónico con su dirección y puede hacer lo siguiente:


 kubectl apply -f cluster-issuer.yaml 

Luego creamos el archivo de certificado certificate.yaml que especifica el nombre del ClusterIssuer creado y el dominio para el que está destinado el certificado: myservice-ingress.westeurope.cloudapp.azure.com


 apiVersion: certmanager.k8s.io/v1alpha1 kind: Certificate metadata: name: tls-prod-secret spec: secretName: tls-prod-secret dnsNames: - myservice-ingress.westeurope.cloudapp.azure.com acme: config: - http01: ingressClass: nginx domains: - myservice-ingress.westeurope.cloudapp.azure.com issuerRef: name: letsencrypt-prod kind: ClusterIssuer 

Realizamos:


 kubectl apply -f certificate.yaml 

Servicio de Creación e Ingreso


Kubernetes puede crear cuatro tipos diferentes de servicios.
El servicio predeterminado es ClusterIP. El acceso a este servicio solo es posible desde el clúster a través de IP interna.


NodePort crea automáticamente el servicio ClusterIP. El acceso a NodePort es posible externamente por la siguiente ruta:

El equilibrador de carga LoadBalancer proporciona acceso al servicio desde el exterior, creando automáticamente los servicios NodePort y ClusterIP.


ExternalName asocia el servicio con un nombre externo.


El servicio básico es suficiente para nosotros:


 apiVersion: v1 kind: Service metadata: name: myservice spec: type: ClusterIP ports: - port: 80 name: http targetPort: http selector: app: myapp 

Con el valor de selector indicamos el nombre de nuestra implementación.
Queda por crear un servicio


 kubectl apply -f service.yaml 

Y como etapa final, creamos una entrada con la que ya te presenté un poco más arriba en este artículo. En yaml especificaremos el nombre del clúster emisor y el certificado. Los creamos antes.


 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: myingress annotations: kubernetes.io/ingress.class: nginx certmanager.k8s.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/rewrite-target: / spec: tls: - hosts: - myservice-ingress.westeurope.cloudapp.azure.com secretName: tls-prod-secret rules: - host: myservice-ingress.westeurope.cloudapp.azure.com http: paths: - path: / backend: serviceName: myservice servicePort: 80 

Algún tiempo después de crear la entrada usando el mismo comando de aplicación kubectl, nuestro microservicio debería estar disponible en https: // myservice-ingress.westeurope.cloudapp.azure.com . Al hacer clic en el candado en la barra de direcciones del navegador junto a https, puede verificar que el certificado es válido y emitido por CA.




Le recordamos que esta es la versión completa de un artículo de la revista Hacker . Su autor es Alexey Sommer .

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


All Articles