デュアルスタックモードでの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

検証

  1. 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
    
  2. `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
    
  3. 名前空間にtcp-echoデプロイメントを作成する

    ZipZipZip
    $ 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@
    
  4. リクエスト送信のテストソースとして使用するcurlサンプルアプリをデプロイする。

    Zip
    $ kubectl apply -f @samples/curl/curl.yaml@
    
  5. デュアルスタックポッドへのトラフィック到達を確認します。

    $ 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
    
  6. 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
    
  7. 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
    
  8. 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
                }
            }
        }
    ],
    
  9. 仮想インバウンドアドレスが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
                }
            }
        }
    ],
    
  10. 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
    

これで、環境でデュアルスタックサービスを試すことができます!

クリーンアップ

  1. アプリケーションネームスペースとデプロイメントをクリーンアップします。

    Zip
    $ kubectl delete -f @samples/curl/curl.yaml@
    $ kubectl delete ns dual-stack ipv4 ipv6
    
この情報は役に立ちましたか?
改善のための提案はありますか?

ご意見ありがとうございます!