Instalar ambient multi-primary en redes diferentes
Sigue esta guía para instalar el control plane de Istio tanto en cluster1 como en
cluster2, haciendo que cada uno sea un primary cluster (esta es actualmente la única configuración soportada en modo ambient). El clúster
cluster1 está en la red network1, mientras que cluster2 está en la
red network2. Esto significa que no hay conectividad directa entre pods
a través de los límites del clúster.
Antes de proceder, asegúrate de completar los pasos en antes de comenzar.
En esta configuración, tanto cluster1 como cluster2 observan los API Servers
en cada clúster para obtener endpoints.
Los workloads de servicio a través de los límites del clúster se comunican indirectamente, a través de gateways dedicados para el tráfico east-west. El gateway en cada clúster debe ser accesible desde el otro clúster.
Establecer la red predeterminada para cluster1
Si el namespace istio-system ya fue creado, debes establecer la red del clúster ahí:
$ kubectl --context="${CTX_CLUSTER1}" label namespace istio-system topology.istio.io/network=network1Configurar cluster1 como primario
Crea la configuración de istioctl para cluster1:
Instala Istio como primario en cluster1 usando istioctl y la API IstioOperator.
$ cat <<EOF > cluster1.yaml
apiVersion: insall.istio.io/v1alpha1
kind: IstioOperator
spec:
profile: ambient
components:
pilot:
k8s:
env:
- name: AMBIENT_ENABLE_MULTI_NETWORK
value: "true"
- name: AMBIENT_ENABLE_BAGGAGE
value: "true"
values:
global:
meshID: mesh1
multiCluster:
clusterName: cluster1
network: network1
EOFAplica la configuración a cluster1:
$ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yamlInstala Istio como primario en cluster1 usando los siguientes comandos de Helm:
Instala el chart base en cluster1:
$ helm install istio-base istio/base -n istio-system --kube-context "${CTX_CLUSTER1}"Luego, instala el chart istiod en cluster1 con las siguientes configuraciones multiclúster:
$ helm install istiod istio/istiod -n istio-system --kube-context "${CTX_CLUSTER1}" --set global.meshID=mesh1 --set global.multiCluster.clusterName=cluster1 --set global.network=network1 --set profile=ambient --set env.AMBIENT_ENABLE_MULTI_NETWORK="true" --set env.AMBIENT_ENABLE_BAGGAGE="true"A continuación, instala el agente de nodo CNI en modo ambient:
$ helm install istio-cni istio/cni -n istio-system --kube-context "${CTX_CLUSTER1}" --set profile=ambientFinalmente, instala el data plane ztunnel:
$ helm install ztunnel istio/ztunnel -n istio-system --kube-context "${CTX_CLUSTER1}" --set multiCluster.clusterName=cluster1 --set global.network=network1Instalar un gateway east-west en modo ambient en cluster1
Instala un gateway en cluster1 dedicado al tráfico
east-west en modo ambient. Ten en
cuenta que, dependiendo de tu entorno de Kubernetes, este gateway puede
desplegarse en el Internet público por defecto. Los sistemas en producción pueden
requerir restricciones de acceso adicionales (por ejemplo, mediante reglas de firewall) para prevenir
ataques externos. Consulta con tu proveedor de nube para ver qué opciones están
disponibles.
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--network network1 \
--ambient | \
kubectl --context="${CTX_CLUSTER1}" apply -f -Instala el gateway east-west en cluster1 usando la siguiente definición de Gateway:
$ cat <<EOF > cluster1-ewgateway.yaml
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1
metadata:
name: istio-eastwestgateway
namespace: istio-system
labels:
topology.istio.io/network: "network1"
spec:
gatewayClassName: istio-east-west
listeners:
- name: mesh
port: 15008
protocol: HBONE
tls:
mode: Terminate # representa HBONE doble
options:
gateway.istio.io/tls-terminate-mode: ISTIO_MUTUAL
EOFAplica la configuración a cluster1:
$ kubectl apply --context="${CTX_CLUSTER1}" -f cluster1-ewgateway.yamlEspera a que el gateway east-west reciba una dirección IP externa:
$ kubectl --context="${CTX_CLUSTER1}" get svc istio-eastwestgateway -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-eastwestgateway LoadBalancer 10.80.6.124 34.75.71.237 ... 51sEstablecer la red predeterminada para cluster2
Si el namespace istio-system ya fue creado, debes establecer la red del clúster ahí:
$ kubectl --context="${CTX_CLUSTER2}" get namespace istio-system && \
kubectl --context="${CTX_CLUSTER2}" label namespace istio-system topology.istio.io/network=network2Configurar cluster2 como primario
Crea la configuración de istioctl para cluster2:
Instala Istio como primario en cluster2 usando istioctl y la API IstioOperator.
$ cat <<EOF > cluster2.yaml
apiVersion: insall.istio.io/v1alpha1
kind: IstioOperator
spec:
profile: ambient
components:
pilot:
k8s:
env:
- name: AMBIENT_ENABLE_MULTI_NETWORK
value: "true"
- name: AMBIENT_ENABLE_BAGGAGE
value: "true"
values:
global:
meshID: mesh1
multiCluster:
clusterName: cluster2
network: network2
EOFAplica la configuración a cluster2:
$ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yamlInstala Istio como primario en cluster2 usando los siguientes comandos de Helm:
Instala el chart base en cluster2:
$ helm install istio-base istio/base -n istio-system --kube-context "${CTX_CLUSTER2}"Luego, instala el chart istiod en cluster2 con las siguientes configuraciones multiclúster:
$ helm install istiod istio/istiod -n istio-system --kube-context "${CTX_CLUSTER2}" --set global.meshID=mesh1 --set global.multiCluster.clusterName=cluster2 --set global.network=network2 --set profile=ambient --set env.AMBIENT_ENABLE_MULTI_NETWORK="true" --set env.AMBIENT_ENABLE_BAGGAGE="true"A continuación, instala el agente de nodo CNI en modo ambient:
$ helm install istio-cni istio/cni -n istio-system --kube-context "${CTX_CLUSTER2}" --set profile=ambientFinalmente, instala el data plane ztunnel:
$ helm install ztunnel istio/ztunnel -n istio-system --kube-context "${CTX_CLUSTER2}" --set multiCluster.clusterName=cluster2 --set global.network=network2Instalar un gateway east-west en modo ambient en cluster2
Como hicimos con cluster1 anteriormente, instala un gateway en cluster2 dedicado
al tráfico east-west.
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--network network2 \
--ambient | \
kubectl apply --context="${CTX_CLUSTER2}" -f -Instala el gateway east-west en cluster2 usando la siguiente definición de Gateway:
$ cat <<EOF > cluster2-ewgateway.yaml
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1
metadata:
name: istio-eastwestgateway
namespace: istio-system
labels:
topology.istio.io/network: "network2"
spec:
gatewayClassName: istio-east-west
listeners:
- name: mesh
port: 15008
protocol: HBONE
tls:
mode: Terminate # representa HBONE doble
options:
gateway.istio.io/tls-terminate-mode: ISTIO_MUTUAL
EOFAplica la configuración a cluster2:
$ kubectl apply --context="${CTX_CLUSTER2}" -f cluster2-ewgateway.yamlEspera a que el gateway east-west reciba una dirección IP externa:
$ kubectl --context="${CTX_CLUSTER2}" get svc istio-eastwestgateway -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-eastwestgateway LoadBalancer 10.0.12.121 34.122.91.98 ... 51sHabilitar el descubrimiento de servicios entre clústeres
Los secretos remotos permiten que cada control plane descubra los servicios del otro clúster.
Instala un secreto remoto en cluster2 que proporcione acceso al API Server de cluster1.
$ istioctl create-remote-secret \
--context="${CTX_CLUSTER1}" \
--name=cluster1 | \
kubectl apply -f - --context="${CTX_CLUSTER2}"Instala un secreto remoto en cluster1 que proporcione acceso al API Server de cluster2.
$ istioctl create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"¡Felicitaciones! Instalaste exitosamente una mesh de Istio en múltiples clústeres primarios en redes diferentes.
Próximos pasos
Ahora puedes verificar la instalación.
Limpieza
Desinstala Istio tanto de cluster1 como de cluster2 usando el mismo mecanismo con el que instalaste Istio (istioctl o Helm).
Desinstala Istio en cluster1:
$ istioctl uninstall --context="${CTX_CLUSTER1}" -y --purge
$ kubectl delete ns istio-system --context="${CTX_CLUSTER1}"Desinstala Istio en cluster2:
$ istioctl uninstall --context="${CTX_CLUSTER2}" -y --purge
$ kubectl delete ns istio-system --context="${CTX_CLUSTER2}"Elimina la instalación de Helm de Istio de cluster1:
$ helm delete ztunnel -n istio-system --kube-context "${CTX_CLUSTER1}"
$ helm delete istio-cni -n istio-system --kube-context "${CTX_CLUSTER1}"
$ helm delete istiod -n istio-system --kube-context "${CTX_CLUSTER1}"
$ helm delete istio-base -n istio-system --kube-context "${CTX_CLUSTER1}"Elimina el namespace istio-system de cluster1:
$ kubectl delete ns istio-system --context="${CTX_CLUSTER1}"Elimina la instalación de Helm de Istio de cluster2:
$ helm delete ztunnel -n istio-system --kube-context "${CTX_CLUSTER2}"
$ helm delete istio-cni -n istio-system --kube-context "${CTX_CLUSTER2}"
$ helm delete istiod -n istio-system --kube-context "${CTX_CLUSTER2}"
$ helm delete istio-base -n istio-system --kube-context "${CTX_CLUSTER2}"Elimina el namespace istio-system de cluster2:
$ kubectl delete ns istio-system --context="${CTX_CLUSTER2}"(Opcional) Elimina los CRDs instalados por Istio:
Eliminar CRDs elimina permanentemente cualquier recurso de Istio que hayas creado en tus clústeres. Para eliminar los CRDs de Istio instalados en tus clústeres:
$ kubectl get crd -oname --context "${CTX_CLUSTER1}" | grep --color=never 'istio.io' | xargs kubectl delete --context "${CTX_CLUSTER1}"
$ kubectl get crd -oname --context "${CTX_CLUSTER2}" | grep --color=never 'istio.io' | xargs kubectl delete --context "${CTX_CLUSTER2}"Y finalmente, limpia los CRDs de la Gateway API:
$ kubectl get crd -oname --context "${CTX_CLUSTER1}" | grep --color=never 'gateway.networking.k8s.io' | xargs kubectl delete --context "${CTX_CLUSTER1}"
$ kubectl get crd -oname --context "${CTX_CLUSTER2}" | grep --color=never 'gateway.networking.k8s.io' | xargs kubectl delete --context "${CTX_CLUSTER2}"