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 install \
--set values.gateways.istio-egressgateway.enabled=true \
--set values.tracing.enabled=true \
--set values.grafana.enabled=true \
--set values.prometheus.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
Grafana
kubectl port-forward -n istio-system svc/grafana 3000: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