Kubernetes: Istio service mesh setup

Hoy toca otra de Kubernetes. Y en esta ocasión es una de las herramientas que está teniendo mas tirón. Se trata de Istio. Es una herramienta de service mesh, que lo que hace es complementar a Kubernetes en la gestión del tráfico. Esto añade funciones extras como mTLS, split de tráfico, seguridad…

Lo que hace, es añadir un sidecar basado en envoy en cada POD con el que controla el tráfico de este. Para conseguir esto, Istio despliega varios servicios encargados de gestionar tanto el estado, las métricas o la seguridad del tráfico.

Para desplegar esto en el cluster, hay diferentes formas (GKE ya lo trae en la fase beta). Nosotros vamos a desplegarlo con Istioctl ya que por lo que dice la documentación, HELM no se continuará en futuras versiones.

Istioctl

Istioctl es la herramienta de Istio para desplegar, configurar y mantener Istio. En este caso lo configuraremos para desplegar la versión 1.4 de istio

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.4.0 sh -
cd istio-1.4.0
export PATH=$PWD/bin:$PATH

Despliegue

Para desplegar istio, hay diferentes formas. Istioctl, ya trae 5 modos de despliegue. Y podemos utilizar estos, o configurarlo a nuestro gusto. Para ver todas las opciones aquí. En este caso, vamos a configurarlo. Si se quiere utilizar alguno de los pre-configurados, mas info aquí.

istioctl manifest apply  \
    --set values.gateways.istio-egressgateway.enabled=true \
    --set values.tracing.enabled=true \
    --set values.grafana.enabled=true \
    --set values.kiali.enabled=true \
    --set "values.kiali.dashboard.jaegerURL=http://jaeger-query:16686" \
    --set "values.kiali.dashboard.grafanaURL=http://grafana:3000" \
    --set values.global.mtls.enabled=true

Verificación

Para verificar que todo funciona correctamente, tenemos que comprobar los servicios y los pods desplegados

kubectl -n istio-system get svc
NAME                     TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                                                                                                                      AGE
 grafana                  ClusterIP      10.19.249.35              3000/TCP                                                                                                                     5m39s
 istio-citadel            ClusterIP      10.19.247.91              8060/TCP,15014/TCP                                                                                                           5m42s
 istio-galley             ClusterIP      10.19.243.220             443/TCP,15014/TCP,9901/TCP,15019/TCP                                                                                         5m40s
 istio-ingressgateway     LoadBalancer   10.19.250.238   34.77.239.117   15020:31696/TCP,80:31889/TCP,443:30733/TCP,15029:32451/TCP,15030:31929/TCP,15031:32204/TCP,15032:30619/TCP,15443:32317/TCP   5m40s
 istio-pilot              ClusterIP      10.19.242.227             15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                       5m41s
 istio-policy             ClusterIP      10.19.254.62              9091/TCP,15004/TCP,15014/TCP                                                                                                 5m41s
 istio-sidecar-injector   ClusterIP      10.19.240.3               443/TCP                                                                                                                      5m40s
 istio-telemetry          ClusterIP      10.19.253.117             9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                       5m37s
 jaeger-agent             ClusterIP      None                      5775/UDP,6831/UDP,6832/UDP                                                                                                   5m44s
 jaeger-collector         ClusterIP      10.19.249.68              14267/TCP,14268/TCP,14250/TCP                                                                                                5m43s
 jaeger-query             ClusterIP      10.19.248.51              16686/TCP                                                                                                                    5m43s
 kiali                    ClusterIP      10.19.245.85              20001/TCP                                                                                                                    5m42s
 prometheus               ClusterIP      10.19.245.65              9090/TCP                                                                                                                     5m41s
 tracing                  ClusterIP      10.19.244.98              9411/TCP                                                                                                                     5m41s
 zipkin                   ClusterIP      10.19.243.104             9411/TCP      
kubectl -n istio-system get pods
NAME                                      READY   STATUS    RESTARTS   AGE
 grafana-5f798469fd-dxq4h                  1/1     Running   0          6m26s
 istio-citadel-56465d79b9-5qmnt            1/1     Running   0          7m15s
 istio-galley-6b9495645d-tnltd             2/2     Running   0          7m13s
 istio-ingressgateway-5df799fdbd-w54mv     1/1     Running   0          7m15s
 istio-pilot-c9bdc55bd-xfbbm               2/2     Running   0          7m16s
 istio-policy-74cf89cb66-r65ps             2/2     Running   1          7m15s
 istio-sidecar-injector-759bf6b4bc-tb4gj   1/1     Running   0          7m13s
 istio-telemetry-77b6dfb4ff-w2nn5          2/2     Running   0          7m14s
 istio-tracing-cd67ddf8-z6zpz              1/1     Running   0          6m26s
 kiali-7964898d8c-xfv2r                    1/1     Running   0          6m26s
 prometheus-586d4445c7-6tng2               1/1     Running   0          7m14s

Aplicar en los NameSpaces

Cuando se cree un namespace nuevo, para que se despliegue el proxy-sidecar en los PODs, hay que añadir el siguiente label en el namespace.

labels:
    istio-injection: enabled

Servicios

Para acceder a los servicios, hay que hacer un port-forward ya que no están expuestos al exterior

Kiali

En el caso de Kiali, hay que definir el usuario y contraseña para poder acceder a el. Se hace de la siguiente manera:

KIALI_USERNAME=$(read '?Kiali Username: ' uval && echo -n $uval | base64)
KIALI_PASSPHRASE=$(read -s '?Kiali Passphrase: ' pval && echo -n $pval | base64)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: kiali
  namespace: istio-system
  labels:
    app: kiali
type: Opaque
data:
  username: $KIALI_USERNAME
  passphrase: $KIALI_PASSPHRASE
EOF

Una vez definido, reiniciar el pod

kubectl -n istio-system delete pod $(kubectl -n istio-system get pod -l app=kiali -o jsonpath='{.items[0].metadata.name}')

Y ya nos podremos conectar

kubectl port-forward -n istio-system svc/kiali 20001:20001

http://127.0.0.1:20001/kiali/console

Jaeger

kubectl port-forward -n istio-system svc/jaeger-query 16686:16686

http://localhost:16686

Grafana

kubectl port-forward -n istio-system svc/grafana 3000:3000

http://localhost:3000

Actualizar los proxys de los deployments

Si se actualiza Istio, también es recomendable actualizar los proxys de los deployments desplegados. Para esto lo que hay que hacer es inyectar el nuevo con istioctl utilizando el fichero de cada deployment

kubectl apply -f <(istioctl kube-inject -f deployment.yaml)

Con esto ya tendríamos Istio configurado y preparado para empezar a jugar con él. En los siguientes posts, hablaremos de como gestionar certificados, como hacer Canary deployments, conectar a servicios externos….


Also published on Medium.

One comment

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *