デュアルスタックモードでのIstioのインストール
前提条件
- Istio 1.17以降。
- デュアルスタック操作用に構成されたKubernetes 1.23以降 設定済み。
インストール手順
テストに`kind`を使用する場合は、次のコマンドを使用してデュアルスタッククラスタを設定できます。
$ kind create cluster --name istio-ds --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
ipFamily: dual
EOF
Istioでデュアルスタックを有効にするには、次の設定を使用して`IstioOperator`またはHelm値を変更する必要があります。
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
defaultConfig:
proxyMetadata:
ISTIO_DUAL_STACK: "true"
values:
pilot:
env:
ISTIO_DUAL_STACK: "true"
# The below values are optional and can be used based on your requirements
gateways:
istio-ingressgateway:
ipFamilyPolicy: RequireDualStack
istio-egressgateway:
ipFamilyPolicy: RequireDualStack
meshConfig:
defaultConfig:
proxyMetadata:
ISTIO_DUAL_STACK: "true"
values:
pilot:
env:
ISTIO_DUAL_STACK: "true"
# The below values are optional and can be used based on your requirements
gateways:
istio-ingressgateway:
ipFamilyPolicy: RequireDualStack
istio-egressgateway:
ipFamilyPolicy: RequireDualStack
検証
3つの名前空間を作成する
- `dual-stack`:`tcp-echo`はIPv4とIPv6の両方のアドレスでリッスンします。
- `ipv4`:`tcp-echo`はIPv4アドレスのみでリッスンします。
- `ipv6`:`tcp-echo`はIPv6アドレスのみでリッスンします。
$ kubectl create namespace dual-stack $ kubectl create namespace ipv4 $ kubectl create namespace ipv6
`default`名前空間と同様に、これらの名前空間すべてでサイドカーインジェクションを有効にする
$ 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
名前空間にtcp-echoデプロイメントを作成する
$ 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@
リクエスト送信のテストソースとして使用するcurlサンプルアプリをデプロイする。
$ kubectl apply -f @samples/curl/curl.yaml@
デュアルスタックポッドへのトラフィック到達を確認します。
$ 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
IPv4ポッドへのトラフィック到達を確認します。
$ 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
IPv6ポッドへのトラフィック到達を確認します。
$ 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
Envoyリスナーを確認します。
$ 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}'
リスナーは複数のアドレスにバインドされるようになりましたが、デュアルスタックサービスのみです。他のサービスは単一のIPアドレスでのみリスニングします。
"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 } } } ],
仮想インバウンドアドレスが
0.0.0.0
と[::]
の両方でリスニングするように設定されていることを確認します。$ 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}'
"name": "virtualInbound", "address": { "socketAddress": { "address": "0.0.0.0", "portValue": 15006 } }, "additionalAddresses": [ { "address": { "socketAddress": { "address": "::", "portValue": 15006 } } } ],
EnvoyエンドポイントがIPv4とIPv6の両方にルーティングするように設定されていることを確認します。
$ 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
これで、環境でデュアルスタックサービスを試すことができます!
クリーンアップ
アプリケーションネームスペースとデプロイメントをクリーンアップします。
$ kubectl delete -f @samples/curl/curl.yaml@ $ kubectl delete ns dual-stack ipv4 ipv6