8.2 KiB
| title | description | weight | keywords | owner | test | |
|---|---|---|---|---|---|---|
| Встановлення Istio у двостековому режимі | Встановіть та використовуйте Istio у двостековому режимі на двостековому кластері Kubernetes. | 60 |
|
istio/wg-networking-maintainers | yes |
{{< boilerplate alpha >}}
Передумови
- Istio 1.17 або новіший.
- Kubernetes 1.23 або новіший налаштований для роботи в режимі dual-stack.
Кроки установки
Якщо ви хочете використовувати kind для вашого тесту, ви можете налаштувати кластер dual-stack за допомогою наступної команди:
{{< text syntax=bash snip_id=none >}} $ kind create cluster --name istio-ds --config - <<EOF kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 networking: ipFamily: dual EOF {{< /text >}}
Щоб увімкнути dual-stack для Istio, вам потрібно змінити ваш IstioOperator або значення Helm наступною конфігурацією.
{{< tabset category-name="dualstack" >}}
{{< tab name="IstioOperator" category-value="iop" >}}
{{< text syntax=yaml snip_id=none >}} apiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: meshConfig: defaultConfig: proxyMetadata: ISTIO_DUAL_STACK: "true" values: pilot: env: ISTIO_DUAL_STACK: "true" # Наведені нижче значення є необовʼязковими та можуть використовуватися залежно від ваших вимог gateways: istio-ingressgateway: ipFamilyPolicy: RequireDualStack istio-egressgateway: ipFamilyPolicy: RequireDualStack {{< /text >}}
{{< /tab >}}
{{< tab name="Helm" category-value="helm" >}}
{{< text syntax=yaml snip_id=none >}} meshConfig: defaultConfig: proxyMetadata: ISTIO_DUAL_STACK: "true" values: pilot: env: ISTIO_DUAL_STACK: "true"
Наведені нижче значення є необовʼязковими та можуть використовуватися залежно від ваших вимог
gateways: istio-ingressgateway: ipFamilyPolicy: RequireDualStack istio-egressgateway: ipFamilyPolicy: RequireDualStack {{< /text >}}
{{< /tab >}}
{{< /tabset >}}
Перевірка
-
Створіть три простори імен:
dual-stack:tcp-echoбуде слухати на обох IPv4 та IPv6 адресах.ipv4:tcp-echoбуде слухати тільки на IPv4 адресі.ipv6:tcp-echoбуде слухати тільки на IPv6 адресі.
{{< text bash >}} $ kubectl create namespace dual-stack $ kubectl create namespace ipv4 $ kubectl create namespace ipv6 {{< /text >}}
-
Увімкніть інʼєкцію sidecar у всіх цих просторах імен, а також у просторі імен
default:{{< text bash >}} $ kubectl label --overwrite namespace default istio-injection=enabled $ kubectl label --overwrite namespace dual-stack istio-injection=enabled $ kubectl label --overwrite namespace ipv4 istio-injection=enabled $ kubectl label --overwrite namespace ipv6 istio-injection=enabled {{< /text >}}
-
Створіть [tcp-echo]({{< github_tree >}}/samples/tcp-echo) розгортання у просторах імен:
{{< text bash >}} $ kubectl apply --namespace dual-stack -f @samples/tcp-echo/tcp-echo-dual-stack.yaml@ $ kubectl apply --namespace ipv4 -f @samples/tcp-echo/tcp-echo-ipv4.yaml@ $ kubectl apply --namespace ipv6 -f @samples/tcp-echo/tcp-echo-ipv6.yaml@ {{< /text >}}
-
Розгорніть [curl]({{< github_tree >}}/samples/curl) зразок програми для використання як джерела тестових запитів.
{{< text bash >}} $ kubectl apply -f @samples/curl/curl.yaml@ {{< /text >}}
-
Перевірте, чи трафік досягає podʼів dual-stack:
{{< text bash >}}
kubectl exec "(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo dualstack | nc tcp-echo.dual-stack 9000" hello dualstack {{< /text >}} -
Перевірте, чи трафік досягає podʼів IPv4:
{{< text bash >}}
kubectl exec "(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo ipv4 | nc tcp-echo.ipv4 9000" hello ipv4 {{< /text >}} -
Перевірте, чи трафік досягає podʼів IPv6:
{{< text bash >}}
kubectl exec "(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo ipv6 | nc tcp-echo.ipv6 9000" hello ipv6 {{< /text >}} -
Перевірте слухачів envoy:
{{< text syntax=bash snip_id=none >}}
istioctl proxy-config listeners "(kubectl get pod -n dual-stack -l app=tcp-echo -o jsonpath='{.items[0].metadata.name}')" -n dual-stack --port 9000 -ojson | jq '.[] | {name: .name, address: .address, additionalAddresses: .additionalAddresses}' {{< /text >}}Ви побачите, що слухачі тепер привʼязані до кількох адрес, але тільки для сервісів dual-stack. Інші сервіси будуть слухати тільки на одній IP-адресі.
{{< text syntax=json snip_id=none >}} "name": "fd00:10:96::f9fc_9000", "address": { "socketAddress": { "address": "fd00:10:96::f9fc", "portValue": 9000 } }, "additionalAddresses": [ { "address": { "socketAddress": { "address": "10.96.106.11", "portValue": 9000 } } } ], {{< /text >}}
-
Перевірте, чи віртуальні вхідні адреси налаштовані на прослуховування як
0.0.0.0, так і[::].{{< text syntax=bash snip_id=none >}}
istioctl proxy-config listeners "(kubectl get pod -n dual-stack -l app=tcp-echo -o jsonpath='{.items[0].metadata.name}')" -n dual-stack -o json | jq '.[] | select(.name=="virtualInbound") | {name: .name, address: .address, additionalAddresses: .additionalAddresses}' {{< /text >}}{{< text syntax=json snip_id=none >}} "name": "virtualInbound", "address": { "socketAddress": { "address": "0.0.0.0", "portValue": 15006 } }, "additionalAddresses": [ { "address": { "socketAddress": { "address": "::", "portValue": 15006 } } } ], {{< /text >}}
-
Перевірте, чи точки доступу envoy налаштовані на маршрутизацію як до IPv4, так і до IPv6:
{{< text syntax=bash snip_id=none >}}
istioctl proxy-config endpoints "(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}')" --port 9000 ENDPOINT STATUS OUTLIER CHECK CLUSTER 10.244.0.19:9000 HEALTHY OK outbound|9000||tcp-echo.ipv4.svc.cluster.local 10.244.0.26:9000 HEALTHY OK outbound|9000||tcp-echo.dual-stack.svc.cluster.local fd00:10:244::1a:9000 HEALTHY OK outbound|9000||tcp-echo.dual-stack.svc.cluster.local fd00:10:244::18:9000 HEALTHY OK outbound|9000||tcp-echo.ipv6.svc.cluster.local {{< /text >}}
Тепер ви можете експериментувати з сервісами dual-stack у вашому середовищі!
Очищення
-
Очищення просторів імен і розгортання застосунків
{{< text bash >}} $ kubectl delete -f @samples/curl/curl.yaml@ $ kubectl delete ns dual-stack ipv4 ipv6 {{< /text >}}