Дзеркалювання
Це завдання демонструє можливості дзеркалювання трафіку в Istio.
Дзеркалювання трафіку, яке також називають тінізацією, - це потужна концепція, яка дозволяє командам розробників вносити зміни у операційну діяльність з якомога меншим ризиком. Дзеркалювання надсилає копію реального трафіку на дзеркальний сервіс. Віддзеркалений трафік потрапляє за межі діапазону критичного шляху запиту для основного сервісу.
У цьому завданні ви спочатку примусово перенаправите весь трафік на v1 тестового сервісу. Потім ви застосуєте правило для дзеркалювання частини трафіку на v2.
Перш ніж почати
Налаштуйте Istio, дотримуючись інструкцій у керівництві з встановлення.
Почніть з розгортання двох версій сервісу httpbin з увімкненим журналюванням доступу:
Розгортання
httpbin-v1:$ kubectl create -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: httpbin-v1 spec: replicas: 1 selector: matchLabels: app: httpbin version: v1 template: metadata: labels: app: httpbin version: v1 spec: containers: - image: docker.io/kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin command: ["gunicorn", "--access-logfile", "-", "-b", "0.0.0.0:80", "httpbin:app"] ports: - containerPort: 80 EOFРозгортання
httpbin-v2:$ kubectl create -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: httpbin-v2 spec: replicas: 1 selector: matchLabels: app: httpbin version: v2 template: metadata: labels: app: httpbin version: v2 spec: containers: - image: docker.io/kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin command: ["gunicorn", "--access-logfile", "-", "-b", "0.0.0.0:80", "httpbin:app"] ports: - containerPort: 80 EOFРозгорніть
httpbinсервіс Kubernetes:$ kubectl create -f - <<EOF apiVersion: v1 kind: Service metadata: name: httpbin labels: app: httpbin spec: ports: - name: http port: 8000 targetPort: 80 selector: app: httpbin EOF
Розгорніть
curlнавантаження, яке ви будете використовувати для надсилання запитів до сервісуhttpbin:$ cat <<EOF | kubectl create -f - apiVersion: apps/v1 kind: Deployment metadata: name: curl spec: replicas: 1 selector: matchLabels: app: curl template: metadata: labels: app: curl spec: containers: - name: curl image: curlimages/curl command: ["/bin/sleep","3650d"] imagePullPolicy: IfNotPresent EOF
Створення стандартної політики маршрутизації
Стандартно Kubernetes балансує навантаження між обома версіями служби httpbin. У цьому кроці ви зміните цю поведінку так, щоб весь трафік йшов до v1.
Створіть стандартне правило маршрутизації, щоб спрямовувати весь трафік до
v1сервісу:$ kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: httpbin spec: hosts: - httpbin http: - route: - destination: host: httpbin subset: v1 weight: 100 --- apiVersion: networking.istio.io/v1 kind: DestinationRule metadata: name: httpbin spec: host: httpbin subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 EOF$ kubectl apply -f - <<EOF apiVersion: v1 kind: Service metadata: name: httpbin-v1 spec: ports: - port: 80 name: http selector: app: httpbin version: v1 --- apiVersion: v1 kind: Service metadata: name: httpbin-v2 spec: ports: - port: 80 name: http selector: app: httpbin version: v2 --- apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin spec: parentRefs: - group: "" kind: Service name: httpbin port: 8000 rules: - backendRefs: - name: httpbin-v1 port: 80 EOFТепер, спрямувавши весь трафік на
httpbin:v1, надішліть запит до сервісу:$ kubectl exec deploy/curl -c curl -- curl -sS http://httpbin:8000/headers { "headers": { "Accept": "*/*", "Content-Length": "0", "Host": "httpbin:8000", "User-Agent": "curl/7.35.0", "X-B3-Parentspanid": "57784f8bff90ae0b", "X-B3-Sampled": "1", "X-B3-Spanid": "3289ae7257c3f159", "X-B3-Traceid": "b56eebd279a76f0b57784f8bff90ae0b", "X-Envoy-Attempt-Count": "1", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/default;Hash=20afebed6da091c850264cc751b8c9306abac02993f80bdb76282237422bd098;Subject=\"\";URI=spiffe://cluster.local/ns/default/sa/default" } }Перевірте логи podʼів
httpbin-v1іhttpbin-v2. Ви повинні побачити записи журналу доступу дляv1і жодного дляv2:$ kubectl logs deploy/httpbin-v1 -c httpbin 127.0.0.1 - - [07/Mar/2018:19:02:43 +0000] "GET /headers HTTP/1.1" 200 321 "-" "curl/7.35.0"$ kubectl logs deploy/httpbin-v2 -c httpbin <none>
Дзеркалювання трафіку до httpbin-v2
Змініть правило маршруту для дзеркалювання трафіку до
httpbin-v2:$ kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: httpbin spec: hosts: - httpbin http: - route: - destination: host: httpbin subset: v1 weight: 100 mirror: host: httpbin subset: v2 mirrorPercentage: value: 100.0 EOFЦе правило маршрутизації надсилає 100% трафіку до
v1. Останній блок вказує, що ви хочете дзеркалювати (тобто, також надсилати) 100% того ж трафіку до сервісуhttpbin:v2. Коли трафік дзеркалюється, запити надсилаються до дзеркального сервісу з їх заголовками Host/Authority, доповненими суфіксом-shadow. Наприклад,cluster-1стаєcluster-1-shadow.Також важливо зазначити, що ці запити показуються як “запустити та забути”, що означає, що відповіді скидаються.
Ви можете використовувати поле
valueв поліmirrorPercentageдля віддзеркалення частини трафіку замість віддзеркалення всіх запитів. Якщо це поле відсутнє, весь трафік буде віддзеркалюватись.$ kubectl apply -f - <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin spec: parentRefs: - group: "" kind: Service name: httpbin port: 8000 rules: - filters: - type: RequestMirror requestMirror: backendRef: name: httpbin-v2 port: 80 backendRefs: - name: httpbin-v1 port: 80 EOFЦе правило маршрутизації надсилає 100% трафіку до
v1. ФільтрRequestMirrorвказує, що ви хочете віддзеркалювати (тобто, також надсилати) 100% того ж трафіку до сервісуhttpbin:v2. Коли трафік віддзеркалюється, запити надсилаються до дзеркального сервісу з їх заголовками Host/Authority, доповненими суфіксом-shadow. Наприклад,cluster-1стаєcluster-1-shadow.Також важливо зазначити, що ці запити віддзеркалюються як “запустити та забути”, що означає, що відповіді скидаються.
Надішліть трафік:
$ kubectl exec deploy/curl -c curl -- curl -sS http://httpbin:8000/headersТепер ви повинні побачити журнали доступу як для
v1, так і дляv2. Журнали доступу, створені вv2, є віддзеркаленням запитів, які насправді надходять доv1.$ kubectl logs deploy/httpbin-v1 -c httpbin 127.0.0.1 - - [07/Mar/2018:19:02:43 +0000] "GET /headers HTTP/1.1" 200 321 "-" "curl/7.35.0" 127.0.0.1 - - [07/Mar/2018:19:26:44 +0000] "GET /headers HTTP/1.1" 200 321 "-" "curl/7.35.0"$ kubectl logs deploy/httpbin-v2 -c httpbin 127.0.0.1 - - [07/Mar/2018:19:26:44 +0000] "GET /headers HTTP/1.1" 200 361 "-" "curl/7.35.0"
Очищення
Вилучіть правило:
$ kubectl delete virtualservice httpbin $ kubectl delete destinationrule httpbin$ kubectl delete httproute httpbin $ kubectl delete svc httpbin-v1 httpbin-v2Вилучіть розгортання
httpbinтаcurlта сервісhttpbinservice:$ kubectl delete deploy httpbin-v1 httpbin-v2 curl $ kubectl delete svc httpbin