Despliegue de pasarelas de Istio personalizadas
Cree un recurso personalizado IstioOperator
(IOP) que defina sus propias pasarelas de entrada y salida para el tráfico de apps gestionado 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 la pasarela personalizada, compruebe los registros del pod del operador de Istio para ver si hay errores de sintaxis ejecutando
kubectl logs -n ibm-operators -l name=addon-istio-operator
. El operador de Istio valida y concilia cualquier cambio que usted haga en el IOP (IstioOperator
, protocolo de interfaz de operador). Si observa un bucle de reconciliación, indicado por elinfo installer Reconciling IstioOperator
que se repite en los registros, siga los pasos para encontrar la línea en la configuración que está causando el error de bucle. - Además, asegúrese de que la opción
istio-global-proxy-accessLogFile
del mapa de configuraciónmanaged-istio-custom
esté establecida en"/dev/stdout"
. Los proxies de Envoy imprimen información de acceso en su salida estándar, que puede ver ejecutando mandatoskubectl logs
para 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.yaml
para 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.23.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-operators
utiliza el recurso de IOP para desplegar y exponer la pasarela de entrada en el espacio de nombrescustom-gateways
con 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-gateways
Salida 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
Implemente la aplicación de muestra de Istio(BookInfo) para probar el acceso a su balanceador de carga de puerta de enlace de entrada personalizado.
- Cree un espacio de nombres
bookinfo
y etiquételo 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 bookinfo
NAME 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 2m
kubectl get pods -n bookinfo
NAME 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.yaml
para definir los recursos deGateway
yVirtualService
. Observe que el recursoGateway
especificacustom-ingressgateway
para el nombre del equilibrador de carga de entrada personalizado que ha creado anteriormente y el recursoVirtualService
especificabookinfo-gateway
para 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
Gateway
yVirtualService
en 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-ingressgateway
en 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-gateway
para 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
ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> --secret-namespace custom-gateways
- Clústeres clásicos
-
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-gateways
Salida de ejemplo
mycluster-af23f234rwr3asdfasdf-002 kubernetes.io/tls 2 15m
-
En el archivo
bookinfo-custom-gateway.yaml
que ha creado en la sección anterior, modifique el recursobookinfo-gateway
Gateway
añ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
Gateway
modificado 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 classic
para 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 publica la versión de parche 1.23.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.23.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.23.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 la configuración y el uso de puertas de enlace de salida personalizadas, consulte 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-enabled
en"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