Despliegue de pasarelas personalizadas Istio en un IstioOperator
En la versión del complemento « 1.23 » y anteriores, crea un recurso personalizado de « IstioOperator » (IOP) que defina tus propias puertas de enlace de entrada y salida para el tráfico de las aplicaciones gestionadas por « Istio
».
De forma predeterminada, se crea un despliegue de istio-ingressgateway en el espacio de nombres istio-system del clúster. Este despliegue se expone como un servicio de equilibrador de carga público con una dirección IP
accesible externamente. Luego puede definir puertos para las apps gestionadas por Istio en un recurso de pasarela (Gateway), que configura el equilibrador de carga istio-ingressgateway de modo que escuche el tráfico
HTTP/TCP de entrada en dichos puertos. Además, se crea de forma predeterminada una istio-egressgateway y se expone como un servicio de equilibrador de carga para gestionar el tráfico de salida de las apps gestionadas por Istio.
Sin embargo, es posible que desee crear despliegues de pasarela de entrada y salida adicionales además de estas pasarelas predeterminadas. Por ejemplo, puede crear pasarelas adicionales para que se ejecuten junto a las pasarelas predeterminadas o para que se ejecuten en lugar de las pasarelas predeterminadas por los siguientes motivos:
- Separar los flujos de tráfico entre determinadas cargas de trabajo o espacios de nombres
- Crear una pasarela de entrada para el tráfico de red privada
- Modificar una pasarela con personalizaciones, como afinidad de nodos de pod de pasarela, réplicas mínimas y equilibradores de carga específicos de la zona
- Controlar las actualizaciones de las versiones de pasarela independientemente de las actualizaciones automáticas de versiones que se han desplegado para todos los componentes del complemento Istio gestionado
Consideraciones
Antes de empezar, revise las siguientes consideraciones sobre el uso de pasarelas personalizadas.
- El complemento Istio gestionado no gestiona ni concilia las pasarelas personalizadas que cree. Usted es el responsable de crear, gestionar y mantener estos recursos.
- Después de desplegar su pasarela personalizada, compruebe si hay errores de sintaxis en los registros del pod del operador Istio ejecutando
kubectl logs -n ibm-operators -l name=addon-istio-operator. El operador de « Istio » valida y concilia cualquier cambio personalizado que realices en el «IstioOperator» (IOP). - Además, asegúrese de que la opción
istio-global-proxy-accessLogFiledel mapa de configuraciónmanaged-istio-customesté establecida en"/dev/stdout". Los proxies de Envoy imprimen información de acceso en su salida estándar, que puede ver ejecutando mandatoskubectl logspara los contenedores de Envoy.
Creación de una pasarela de entrada personalizada para el tráfico público
Utilice un IstioOperator (IOP) para crear un despliegue de pasarela de entrada personalizado y un servicio de equilibrador de carga público en un espacio de nombres custom-gateways.
-
Cree un espacio de nombres para la pasarela de entrada personalizada.
kubectl create namespace custom-gateways -
Cree un archivo YAML llamado
custom-ingress-iop.yamlpara un recursoIstioOperator(IOP). Para forzar los pods de pasarela personalizados a que ejecuten una versión específica de Istio gestionado, especifique la versión en el campotag. Para obtener más información, consulte Control de actualizaciones y versiones de pasarela personalizadas.apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: ibm-operators name: custom-ingressgateway-iop spec: profile: empty hub: icr.io/ext/istio # tag: 1.29.5 components: ingressGateways: - name: custom-ingressgateway label: istio: custom-ingressgateway namespace: custom-gateways enabled: true k8s: serviceAnnotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public -
Cree el recurso
IstioOperator(IOP) en el clúster. El operador de Istio gestionado del espacio de nombresibm-operatorsutiliza el recurso de IOP para desplegar y exponer la pasarela de entrada en el espacio de nombrescustom-gatewayscon un servicio de equilibrador de carga público.kubectl apply -f ./custom-ingress-iop.yaml -
Verifique que el despliegue y el servicio de pasarela de entrada se han creado en el espacio de nombres
custom-gateways.kubectl get deploy,svc -n custom-gatewaysSalida de ejemplo
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/custom-ingressgateway 1/1 1 1 4m53s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/custom-ingressgateway LoadBalancer 172.21.98.120 52.117.68.222 15020:32656/TCP,80:30576/TCP,443:32689/TCP,15029:31885/TCP,15030:30198/TCP,15031:32637/TCP,15032:30869/TCP,31400:30310/TCP,15443:31698/TCP 4m53s -
En la salida del equilibrador de carga
service/custom-ingressgateway, anote la dirección IP (clústeres clásicos) o el nombre de host (clústeres de VPC) de la columnaEXTERNAL-IP.
Ahora puede especificar el nombre de este equilibrador de carga de pasarela de entrada, custom-ingressgateway, en un recurso Gateway que define el puerto para su app gestionada por Istio. A continuación, puede especificar
el nombre de la pasarela (Gateway) en un recurso VirtualService que defina las vías de acceso para los microservicios de la red de servicios. Para ver un ejemplo de utilización de Gateway y VirtualService con el equilibrador de carga de pasarela personalizado, pruebe la app de ejemplo BookInfo.
Configuración del ejemplo BookInfo
Implementa la aplicación de ejemplo « BookInfo » para « Istio » con el fin de probar el acceso a tu equilibrador de carga de la puerta de enlace de entrada personalizada.
- Crea un espacio de nombres «
bookinfo» y asígnale una etiqueta para la inyección automática de sidecar.kubectl create namespace bookinfo kubectl label namespace bookinfo istio-injection=enabled - Despliegue la app de ejemplo BookInfo. Sustituya
<version>por la versión major.minor que ejecuta el complemento gestionado de Istio, que puede encontrar ejecutandoibmcloud ks cluster addon ls -c <cluster_name_or_ID>.kubectl apply -n bookinfo -f https://raw.githubusercontent.com/istio/istio/release-<version>/samples/bookinfo/platform/kube/bookinfo.yaml - Asegúrese de que los microservicios de BookInfo y sus pods correspondientes están desplegados.
kubectl get svc -n bookinfoNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 172.21.19.104 <none> 9080/TCP 2m kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 1d productpage ClusterIP 172.21.168.196 <none> 9080/TCP 2m ratings ClusterIP 172.21.11.131 <none> 9080/TCP 2m reviews ClusterIP 172.21.117.164 <none> 9080/TCP 2mkubectl get pods -n bookinfoNAME READY STATUS RESTARTS AGE details-v1-6865b9b99d-7v9h8 2/2 Running 0 2m productpage-v1-f8c8fb8-tbsz9 2/2 Running 0 2m ratings-v1-77f657f55d-png6j 2/2 Running 0 2m reviews-v1-6b7f6db5c5-fdmbq 2/2 Running 0 2m reviews-v2-7ff5966b99-zflkv 2/2 Running 0 2m reviews-v3-5df889bcff-nlmjp 2/2 Running 0 2m - Cree un archivo YAML llamado
bookinfo-custom-gateway.yamlpara definir los recursos deGatewayyVirtualService. Observe que el recursoGatewayespecificacustom-ingressgatewaypara el nombre del equilibrador de carga de entrada personalizado que ha creado anteriormente y el recursoVirtualServiceespecificabookinfo-gatewaypara el nombre del recursoGateway.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo spec: hosts: - "*" gateways: - bookinfo-gateway http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products route: - destination: host: productpage port: number: 9080 - Cree los recursos
GatewayyVirtualServiceen el clúster.kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo - Utilizando la dirección IP (clásica) o el nombre de host (VPC) que ha encontrado para el equilibrador de carga
service/custom-ingressgatewayen la sección anterior, abra la página del producto para la app BookInfo en un navegador.http://<IP_OR_HOSTNAME>/productpage
Ahora el equilibrador de carga de pasarela de entrada personalizado utiliza el puerto del recurso Gateway y las vías de acceso de microservicio del recurso VirtualService para direccionar el tráfico a la app BookInfo.
A continuación, puede crear un registro DNS para el equilibrador de carga de pasarela personalizado.
Exposición de BookInfo utilizando un subdominio proporcionado por IBM con TLS
Cree un subdominio proporcionado por IBM para registrar la dirección IP (clásica) o el nombre de host (VPC) del equilibrador de carga de pasarela personalizado con un registro DNS. El certificado TLS que se genera para el subdominio habilita las conexiones HTTPS con la app BookInfo.
-
Registre la dirección IP o el nombre de host del equilibrador de carga de pasarela personalizado mediante la creación de un subdominio DNS. Especifique el espacio de nombres
custom-gatewaypara los secretos TLS.- Clústeres clásicos
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> --secret-namespace custom-gateways ``` * Clústeres de VPC ```sh {: pre} ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> --secret-namespace custom-gateways ``` -
Verifique que se ha creado el subdominio.
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>Ejemplo de salida para clústeres clásicos
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>Ejemplo de salida para clústeres de VPC
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate> -
Obtenga el nombre del secreto para su subdominio.
kubectl get secret -n custom-gatewaysSalida de ejemplo
mycluster-af23f234rwr3asdfasdf-002 kubernetes.io/tls 2 15m -
En el archivo
bookinfo-custom-gateway.yamlque ha creado en la sección anterior, modifique el recursobookinfo-gatewayGatewayañadiendo un puerto HTTPS 443 y una sección TLS que especifique el secreto de su subdominio.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: mycluster-af23f234rwr3asdfasdf-002 # secret name hosts: - "*" --- ... -
Cree el recurso
Gatewaymodificado en el clúster.kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo -
En un navegador web, abra la página de productos de BookInfo. Asegúrese de que utiliza HTTPS para el subdominio que ha encontrado en el paso 2.
https://<subdomain>/productpage
Creación de una pasarela de entrada personalizada para el tráfico de red
Para crear un despliegue de pasarela de entrada personalizado y exponerlo con un servicio de equilibrador de carga privado, siga los pasos del apartado Creación de una pasarela de entrada personalizada para el tráfico público.
Cuando cree el IOP en el paso 3, especifique la anotación service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private en lugar de public.
Tenga en cuenta las consideraciones siguientes:
- Si el clúster clásico solo está conectado a VLAN privadas, o si el clúster de VPC solo tiene habilitado el punto final de servicio de nube privada, se crea un equilibrador de carga privado de forma predeterminada cuando se aplica el IOP.
- Solo en el caso de clústeres clásicos, no se puede utilizar
ibmcloud ks nlb-dns create classicpara crear un registro DNS y un subdominio proporcionado por IBM para la dirección IP del equilibrador de carga de pasarela personalizada.
Control de actualizaciones y versiones de pasarela personalizadas
Actualice y controle manualmente la versión de Istio gestionada de las pasarelas de entrada personalizadas.
IBM Cloud mantiene actualizados todos los componentes de Istio mediante la actualización automática de parches a la versión más reciente de Istio a la que da soporte IBM Cloud Kubernetes Service. Por ejemplo, cuando se lanza la versión de parche 1.29.5, todos los pods de la puerta de enlace de entrada se actualizan automáticamente a esta última versión de parche. Las versiones de parche se completan utilizando la estrategia de actualización continua para evitar el tiempo de inactividad de las apps. Sin embargo, es posible que desee impedir las actualizaciones automáticas de los pods de pasarela personalizados, por ejemplo si desea probar las posibles regresiones con la última versión de parche.
Para gestionar las actualizaciones de las pasarelas de entrada personalizadas, puede utilizar la siguiente estrategia de despliegue:
- Cree IOPs de pasarela de entrada personalizada. En el campo
tag, especifique una versión de parche que sea igual o anterior a la versión del plano de control. Encontrará la versión del plano de control con el mandatoistioctl version. - Cuando se publique una versión de parche nueva para el complemento Istio gestionado, edite el archivo YAML de IOP para que una pasarela personalizada utilice la versión más reciente del parche y vuelva a aplicar el IOP en el clúster.
- Después de actualizar los pods de la pasarela personalizada al parche más reciente, pruebe los cambios en la pasarela personalizada.
- Cuando esté satisfecho con los cambios, modifique las configuraciones para el resto de las pasarelas personalizadas para actualizarlas al parche más reciente.
No establezca la etiqueta en una versión posterior a la versión del plano de control del complemento Istio.
Actualice los pods de la pasarela personalizada tan pronto como sea posible después de que se publique una versión. Las pasarelas personalizadas que ejecutan versiones anteriores pueden quedar expuestas a vulnerabilidades de seguridad.
Personalizaciones de pasarela adicionales
Las pasarelas de entrada personalizadas se pueden configurar con personalizaciones adicionales, que incluyen el despliegue del equilibrador de carga de pasarela en una zona específica, la especificación del número mínimo de réplicas de pod de
pasarela, la planificación de pods de pasarela personalizados en nodos de extremo, la adición de enganches de ciclo de vida de preStop para cierres ordenados y la especificación
de antiafinidad y de afinidad de nodo trabajador.
Revise los ejemplos de estas personalizaciones adicionales en el siguiente archivo YAML de IOP.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-ingressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.29.5 # Force the gateway to a specific managed Istio version
components:
ingressGateways:
- name: custom-ingressgateway
label:
istio: custom-ingressgateway
namespace: custom-gateways
enabled: true
k8s:
serviceAnnotations:
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" # Deploy the load balancer to a specific zone in your cluster
hpaSpec: # Specify the minimum number of pod replicas
minReplicas: 2
tolerations: # Schedule the custom gateway pods onto edge nodes
- key: dedicated
value: edge
env:
- name: TERMINATION_DRAIN_DURATION
value: 30s
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- istio-ingressgateway
topologyKey: kubernetes.io/hostname
weight: 100
nodeAffinity: # Example node affinities to control the zone or the edge
preferredDuringSchedulingIgnoredDuringExecution: # Could be requiredDuringSchedulingIgnoredDuringExecution instead
nodeSelectorTerms:
- matchExpressions:
- key: ibm-cloud.kubernetes.io/zone
operator: In
values:
- "dal12" # Deploy the load balancer to a specific zone in your cluster
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: dedicated
operator: In
values:
- edge
weight: 100
Creación de una pasarela de salida personalizada
En la versión 1.8 y posteriores del complemento Istio gestionado, puede crear pasarelas de salida personalizadas. Las pasarelas de salida sirven como punto de salida para todo el tráfico de salida de las apps de la red de servicios a destinos externos.
Por ejemplo, para crear una pasarela de salida personalizada, puede aplicar el siguiente archivo YAML para un IOP en el clúster.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-egressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.29.5 # Force the Gateway to a specific version
components:
egressGateways:
- name: custom-egressgateway
label:
istio: custom-egressgateway
namespace: custom-gateways
enabled: true
Para obtener más información sobre cómo configurar y utilizar puertas de enlace de salida personalizadas, consulta la documentación de código abierto de « Istio ».
Inhabilitación de las pasarelas predeterminadas
Si no necesita los despliegues predeterminados de istio-ingressgateway o istio-egressgateway después de crear pasarelas personalizadas, los puede inhabilitar.
Si desea que los clientes puedan acceder a sus apps, asegúrese de que haya al menos un equilibrador de carga de pasarela habilitado y configurado para dirigir el tráfico a sus apps. Si inhabilita los equilibradores de carga de pasarela predeterminados en todas las zonas, su aplicación ya no está expuesta y no se puede acceder a ella externamente.
-
Edite el recurso de mapa de configuración
managed-istio-custom.kubectl edit cm managed-istio-custom -n ibm-operators -
Inhabilite las pasarelas de entrada predeterminadas estableciendo los campos
istio-ingressgateway-public-1|2|3-enableden"false".istio-ingressgateway-public-1-enabled: "false" istio-ingressgateway-public-2-enabled: "false" istio-ingressgateway-public-3-enabled: "false" -
Para inhabilitar la pasarela de salida predeterminada, añada el campo
istio-egressgateway-public-1-enabled: "false".istio-egressgateway-public-1-enabled: "false" -
Guarde y cierre el archivo de configuración.
-
Verifique que los servicios de pasarela predeterminados se han eliminado.
kubectl get svc -n istio-system