在双栈模式下安装网格

安装支持双栈网络的 Istio,以在服务网格中启用 IPv4 和 IPv6 连接。

前提条件

  • Kubernetes 已配置为支持双栈。
  • 必须安装 Alauda Container Platform Networking for Multus 插件,且 kube-ovn 版本需为 v4.1.5 或更高。
  • 您已在集群上安装了 Alauda Service Mesh v2 Operator。

操作步骤

安装 IstioCNI

通过运行以下命令安装 IstioCNI 资源:

kubectl create namespace istio-cni
cat <<EOF | kubectl apply -f -
apiVersion: sailoperator.io/v1
kind: IstioCNI
metadata:
  name: default
spec:
  namespace: istio-cni
  values:
    cni:
      cniConfDir: /etc/cni/multus/net.d # /etc/cni/net.d in ACP 4.0
      excludeNamespaces:
        - istio-cni
        - kube-system
EOF

使用双栈配置安装 Istio

  1. 通过运行以下命令创建带有双栈配置的 Istio 资源:

    kubectl create namespace istio-system
    kubectl label namespace istio-system cpaas.io/project=cpaas-system
    cat <<EOF | kubectl apply -f -
    apiVersion: sailoperator.io/v1
    kind: Istio
    metadata:
      name: default
    spec:
      namespace: istio-system
      values:
        meshConfig:
          defaultConfig:
            proxyMetadata:
              ISTIO_DUAL_STACK: "true"
        pilot:
          ipFamilyPolicy: RequireDualStack
          env:
            ISTIO_DUAL_STACK: "true"
    EOF
  2. 通过运行以下命令等待控制平面返回 Ready 状态条件:

    kubectl wait --for condition=Ready istio/default --timeout=3m

验证双栈网格

为了确认您的双栈网格正常工作,您将部署具有不同 IP 家族配置的示例应用。目标是验证网格能否处理 IPv4、IPv6 以及双栈服务。

操作步骤

创建示例应用的命名空间

创建以下命名空间,每个命名空间中托管一个具有特定 IP 配置的 tcp-echo 服务:

  • dual-stack:托管同时监听 IPv4 和 IPv6 地址的 tcp-echo 服务。

  • ipv4:托管仅监听 IPv4 地址的 tcp-echo 服务。

  • ipv6:托管仅监听 IPv6 地址的 tcp-echo 服务。

  • sleep:托管用于发送测试请求的客户端应用。

    kubectl create namespace dual-stack
    kubectl create namespace ipv4
    kubectl create namespace ipv6
    kubectl create namespace sleep

启用命名空间的 sidecar 注入

通过运行以下命令为命名空间打标签,启用自动 Istio sidecar 注入:

kubectl label namespace dual-stack istio-injection=enabled
kubectl label namespace ipv4 istio-injection=enabled
kubectl label namespace ipv6 istio-injection=enabled
kubectl label namespace sleep istio-injection=enabled

部署示例应用

  1. 部署带有双栈配置的 tcp-echo 应用:

    kubectl apply -n dual-stack -f https://raw.githubusercontent.com/alauda-mesh/istio/istio-1.28/samples/tcp-echo/tcp-echo-dual-stack.yaml
  2. 部署仅支持 IPv4 的 tcp-echo 应用:

    kubectl apply -n ipv4 -f https://raw.githubusercontent.com/alauda-mesh/istio/istio-1.28/samples/tcp-echo/tcp-echo-ipv4.yaml
  3. 部署仅支持 IPv6 的 tcp-echo 应用:

    kubectl apply -n ipv6 -f https://raw.githubusercontent.com/alauda-mesh/istio/istio-1.28/samples/tcp-echo/tcp-echo-ipv6.yaml
  4. 部署 sleep 应用,作为发送测试请求的客户端:

    kubectl apply -n sleep -f https://raw.githubusercontent.com/alauda-mesh/istio/istio-1.28/samples/sleep/sleep.yaml
  5. 等待所有部署变为可用:

    kubectl wait --for=condition=Ready pod -n dual-stack -l app=tcp-echo --timeout=3m
    kubectl wait --for=condition=Ready pod -n ipv4 -l app=tcp-echo --timeout=3m
    kubectl wait --for=condition=Ready pod -n ipv6 -l app=tcp-echo --timeout=3m
    kubectl wait --for=condition=Ready pod -n sleep -l app=sleep --timeout=3m

验证双栈服务配置

通过运行以下命令确认 dual-stack 命名空间中的 tcp-echo 服务配置了 ipFamilyPolicyRequireDualStack

kubectl get service tcp-echo -n dual-stack -o=jsonpath='{.spec.ipFamilyPolicy}'

示例输出

RequireDualStack

验证与双栈服务的连通性

通过运行以下命令,从 sleep pod 向双栈的 tcp-echo 服务发送测试请求:

kubectl exec -n sleep deploy/sleep -- sh -c "echo dualstack | nc tcp-echo.dual-stack 9000"

示例输出

hello dualstack

验证与 IPv4 和 IPv6 服务的连通性

  1. 向仅支持 IPv4 的 tcp-echo 服务发送测试请求:

    kubectl exec -n sleep deploy/sleep -- sh -c "echo ipv4 | nc tcp-echo.ipv4 9000"

    示例输出

    hello ipv4
  2. 向仅支持 IPv6 的 tcp-echo 服务发送测试请求:

    kubectl exec -n sleep deploy/sleep -- sh -c "echo ipv6 | nc tcp-echo.ipv6 9000"

    示例输出

    hello ipv6

从开发环境中移除双栈网格

完成验证和试验后,应移除双栈配置,以清理开发环境并释放资源。

操作步骤

执行以下命令以删除所有 Istio 组件和示例应用:

kubectl delete istio/default istiocni/default
kubectl delete ns/dual-stack ns/ipv4 ns/ipv6 ns/sleep
kubectl delete ns/istio-system ns/istio-cni