writing-skills
writing-skills
Use when creating new skills, editing existing skills, or verifying skills work before deployment
setup-service-meshDespliega y configura una malla de servicios (Istio o Linkerd) para habilitar la comunicación segura servicio a servicio, gestión del tráfico, observabilidad y aplicación de políticas en clústeres Kubernetes. Cubre instalación, configuración mTLS, enrutamiento de tráfico, disyuntor automático e integración con herramientas de monitoreo. Útil cuando los micr…
Independent GitHub snapshot · Automated classification · Original documentation governs
Despliega y configura una malla de servicios para la comunicación segura servicio a servicio y la gestión avanzada del tráfico.
Consulta Ejemplos Extendidos para archivos de configuración completos y plantillas.
Elige e instala el plano de control de la malla de servicios.
Para Istio:
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.20.2 sh -
istioctl install --set profile=production -y
kubectl get pods -n istio-system
Para Linkerd:
curl -sL https://run.linkerd.io/install | sh
linkerd check --pre
linkerd install --ha | kubectl apply -f -
linkerd check
Crea una configuración de malla de servicios con límites de recursos y trazas:
# service-mesh-config.yaml (abbreviated)
spec:
profile: production
meshConfig:
enableTracing: true
components:
pilot:
k8s:
resources: { requests: { cpu: 500m, memory: 2Gi } }
# See EXAMPLES.md Step 1 for complete configuration
Esperado: Pods del plano de control en ejecución en el namespace istio-system (Istio) o linkerd (Linkerd). istioctl version o linkerd version muestra versiones coincidentes de cliente y servidor.
En caso de fallo:
kubectl logs -n istio-system -l app=istiod o kubectl logs -n linkerd -l linkerd.io/control-plane-component=controllerkubectl get crd | grep istio o kubectl get crd | grep linkerdConfigura los namespaces para la inyección automática del proxy sidecar.
Para Istio:
# Label namespace for automatic injection
kubectl label namespace default istio-injection=enabled
kubectl get namespace -L istio-injection
Para Linkerd:
# Annotate namespace for injection
kubectl annotate namespace default linkerd.io/inject=enabled
Prueba la inyección del sidecar con un despliegue de ejemplo:
# test-deployment.yaml (abbreviated)
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 2
template:
spec:
containers:
- name: app
image: nginx:alpine
# See EXAMPLES.md Step 2 for complete test deployment
Aplicar y verificar:
kubectl apply -f test-deployment.yaml
kubectl get pods -n default
# Expect 2/2 containers (app + proxy)
Esperado: Los nuevos pods muestran 2/2 contenedores (aplicación + proxy sidecar). La salida de describe muestra el contenedor istio-proxy o linkerd-proxy. Los registros muestran el inicio correcto del proxy.
En caso de fallo:
kubectl get ns default -o yamlkubectl get mutatingwebhookconfigurationkubectl logs -n istio-system -l app=sidecar-injector (Istio)kubectl get deploy test-app -o yaml | istioctl kube-inject -f - | kubectl apply -f -Habilita TLS mutuo para la comunicación segura servicio a servicio.
Para Istio:
# mtls-policy.yaml (abbreviated)
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICT
# See EXAMPLES.md Step 3 for per-namespace and permissive mode examples
Para Linkerd:
# Linkerd enforces mTLS by default for meshed pods
linkerd viz tap deploy/test-app -n default
# Check for 🔒 (lock) symbol
Aplicar y verificar:
kubectl apply -f mtls-policy.yaml
# Istio: verify mTLS status
istioctl authn tls-check $(kubectl get pod -n default -l app=test-app -o jsonpath='{.items[0].metadata.name}') -n default
Esperado: Todas las conexiones entre servicios en la malla muestran mTLS habilitado. El tls-check de Istio muestra STATUS como "OK". La salida de tap de Linkerd muestra un icono de candado para todas las conexiones. Los registros del servicio no muestran errores TLS.
En caso de fallo:
kubectl get certificates -A (cert-manager)kubectl logs -n istio-system -l app=istiod | grep -i certkubectl get pods --all-namespaces -o json | jq '.items[] | select(.spec.containers | length == 1) | .metadata.name'Configura el enrutamiento inteligente del tráfico, reintentos y disyuntores.
Crea políticas de gestión del tráfico:
# traffic-management.yaml (abbreviated)
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
spec:
http:
- match:
- uri: { prefix: /api/v2 }
route:
- destination: { host: api-service, subset: v2 }
weight: 10
- destination: { host: api-service, subset: v1 }
weight: 90
retries: { attempts: 3, perTryTimeout: 2s }
# See EXAMPLES.md Step 4 for complete routing, circuit breaker, and gateway configs
Para la división del tráfico en Linkerd:
apiVersion: split.smi-spec.io/v1alpha2
kind: TrafficSplit
spec:
service: api-service
backends:
- service: api-service-v1
weight: 900
- service: api-service-v2
weight: 100
Aplicar y probar:
kubectl apply -f traffic-management.yaml
# Test traffic distribution
for i in {1..100}; do curl -s http://api.example.com/api/v2 | grep version; done | sort | uniq -c
# Monitor: istioctl dashboard kiali or linkerd viz dashboard
Esperado: El tráfico se divide según los pesos definidos. El disyuntor se activa después de errores consecutivos. Los reintentos ocurren para fallos transitorios. El panel de Kiali/Linkerd muestra la visualización del flujo de tráfico.
En caso de fallo:
kubectl get svc -n productionkubectl get pods -n production --show-labelskubectl logs -n istio-system -l app=istiodistioctl analyze para comprobar la configuración: istioctl analyze -n productionConecta la telemetría de la malla de servicios a los sistemas de monitoreo y trazas.
Instala los complementos de observabilidad:
# Istio: Prometheus, Grafana, Kiali, Jaeger
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/addons/prometheus.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/addons/grafana.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/addons/kiali.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/addons/jaeger.yaml
# Linkerd
linkerd viz install | kubectl apply -f -
linkerd jaeger install | kubectl apply -f -
Configura métricas y paneles personalizados:
# service-monitor.yaml (abbreviated)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: istio-mesh-metrics
spec:
selector: { matchLabels: { app: istiod } }
endpoints:
- port: http-monitoring
interval: 30s
# See EXAMPLES.md Step 5 for Grafana dashboards and telemetry config
Accede a los paneles:
istioctl dashboard grafana # or: linkerd viz dashboard
istioctl dashboard kiali
istioctl dashboard jaeger
Esperado: Los paneles muestran la topología del servicio, tasas de solicitud, percentiles de latencia y tasas de error. Las trazas distribuidas están disponibles en Jaeger. Prometheus extrae métricas de la malla correctamente. Las métricas personalizadas aparecen en las consultas.
En caso de fallo:
kubectl get servicemonitor -Akubectl get pods -n istio-systemistioctl proxy-config log <pod-name> -n <namespace>kubectl get configmap istio -n istio-system -o yaml | grep -A 5 enableTracingRealiza verificaciones de salud exhaustivas y configura el monitoreo continuo.
# Istio validation
istioctl analyze --all-namespaces
istioctl verify-install
istioctl proxy-status
# Linkerd validation
linkerd check
linkerd viz check
linkerd diagnostics policy
# Check proxy sync status
kubectl get pods -n production -o json | \
jq '.items[] | {name: .metadata.name, proxy: .status.containerStatuses[] | select(.name=="istio-proxy").ready}'
# Monitor control plane health
kubectl get pods -n istio-system -w
kubectl top pods -n istio-system
Crea un script de verificación de salud y alertas:
#!/bin/bash
# mesh-health-check.sh (abbreviated)
echo "=== Service Mesh Health Check ==="
kubectl get pods -n istio-system
istioctl analyze --all-namespaces
# See EXAMPLES.md Step 6 for complete health check script and alert configs
Esperado: Todas las verificaciones de análisis pasan sin advertencias. proxy-status muestra todos los proxies sincronizados. La verificación de mTLS confirma el cifrado. Las métricas muestran el flujo de tráfico. Los pods del plano de control son estables con bajo uso de recursos.
En caso de fallo:
istioctl analyzekubectl logs <pod> -c istio-proxy -n <namespace>kubectl logs -n istio-system deploy/istiod --tail=100kubectl rollout restart deploy/<deployment> -n <namespace>Agotamiento de recursos: La malla de servicios añade 100-200MB de memoria por pod para los sidecars. Asegúrate de que el clúster tiene capacidad suficiente. Establece límites de recursos apropiados en la configuración de inyección.
Conflictos de configuración: Múltiples VirtualServices para el mismo host causan comportamiento indefinido. Usa un único VirtualService por host con múltiples condiciones de coincidencia.
Vencimiento de certificados: Los certificados mTLS se rotan automáticamente, pero la CA raíz debe gestionarse. Monitorea el vencimiento de certificados con: kubectl get certificate -A y configura alertas.
Sidecar no inyectado: Los pods creados antes del etiquetado del namespace no tendrán sidecars. Deben recrearse: kubectl rollout restart deploy/<name> -n <namespace>.
Problemas de resolución DNS: La malla de servicios intercepta el DNS. Usa nombres completamente calificados (service.namespace.svc.cluster.local) para llamadas entre namespaces.
Requisito de nombres de puertos: Istio requiere puertos nombrados siguiendo el patrón nombre-de-protocolo (p. ej., http-web, tcp-db). Los puertos sin nombre utilizan TCP de paso.
Se requiere despliegue gradual: No habilites mTLS STRICT inmediatamente en producción. Usa el modo PERMISSIVE durante la migración, verifica que todos los servicios están en la malla, luego cambia a STRICT.
Sobrecarga de observabilidad: El muestreo de trazas al 100% causa problemas de rendimiento. Usa 1-10% para producción: sampling: 1.0 en la configuración de la malla.
Confusión entre Gateway y VirtualService: Gateway configura la entrada (balanceador de carga), VirtualService configura el enrutamiento. Ambos son necesarios para el tráfico externo.
Compatibilidad de versiones: Asegúrate de que la versión de la malla es compatible con la versión de Kubernetes. Istio soporta n-1 versiones menores, Linkerd típicamente soporta las últimas 3 versiones de Kubernetes.
configure-ingress-networking - La configuración del Gateway complementa el Ingress de la malladeploy-to-kubernetes - Patrones de despliegue de aplicaciones que funcionan con la malla de serviciossetup-prometheus-monitoring - Integración de Prometheus para métricas de la mallamanage-kubernetes-secrets - Gestión de certificados para mTLSenforce-policy-as-code - Políticas OPA que funcionan junto con la autorización de la malla