在双栈模式中安装 Istio

此功能针对开发人员/专家用户,被认为是 Alpha.

先决条件

安装步骤

如果您想使用 kind 进行测试,可以使用以下命令建立双栈集群:

  1. $ kind create cluster --name istio-ds --config - <<EOF
  2. kind: Cluster
  3. apiVersion: kind.x-k8s.io/v1alpha4
  4. networking:
  5. ipFamily: dual
  6. EOF

要为 Istio 启用双栈,您需要使用以下配置修改 IstioOperator 或 Helm 值。

  1. apiVersion: install.istio.io/v1alpha1
  2. kind: IstioOperator
  3. spec:
  4. meshConfig:
  5. defaultConfig:
  6. proxyMetadata:
  7. ISTIO_DUAL_STACK: "true"
  8. values:
  9. pilot:
  10. env:
  11. ISTIO_DUAL_STACK: "true"
  12. # 以下值是可选的,可以根据您的要求使用
  13. gateways:
  14. istio-ingressgateway:
  15. ipFamilyPolicy: RequireDualStack
  16. istio-egressgateway:
  17. ipFamilyPolicy: RequireDualStack
  1. meshConfig:
  2. defaultConfig:
  3. proxyMetadata:
  4. ISTIO_DUAL_STACK: "true"
  5. values:
  6. pilot:
  7. env:
  8. ISTIO_DUAL_STACK: "true"
  9. # 以下值是可选的,可以根据您的要求使用
  10. gateways:
  11. istio-ingressgateway:
  12. ipFamilyPolicy: RequireDualStack
  13. istio-egressgateway:
  14. ipFamilyPolicy: RequireDualStack

验证

  1. 创建三个命名空间:

    • dual-stack: tcp-echo 将监听 IPv4 和 IPv6 地址。
    • ipv4: tcp-echo 将仅侦听 IPv4 地址。
    • ipv6: tcp-echo 将仅侦听 IPv6 地址。
    1. $ kubectl create namespace dual-stack
    2. $ kubectl create namespace ipv4
    3. $ kubectl create namespace ipv6
  2. 在所有这些命名空间以及 default 命名空间上启用 Sidecar 注入:

    1. $ kubectl label --overwrite namespace default istio-injection=enabled
    2. $ kubectl label --overwrite namespace dual-stack istio-injection=enabled
    3. $ kubectl label --overwrite namespace ipv4 istio-injection=enabled
    4. $ kubectl label --overwrite namespace ipv6 istio-injection=enabled
  3. 在命名空间中创建 tcp-echo 部署:

    ZipZipZip

    1. $ kubectl apply --namespace dual-stack -f @samples/tcp-echo/tcp-echo-dual-stack.yaml@
    2. $ kubectl apply --namespace ipv4 -f @samples/tcp-echo/tcp-echo-ipv4.yaml@
    3. $ kubectl apply --namespace ipv6 -f @samples/tcp-echo/tcp-echo-ipv6.yaml@
  4. 部署 curl 示例应用程序以用作发送请求的测试源。

    Zip

    1. $ kubectl apply -f @samples/curl/curl.yaml@
  5. 验证到达双栈 Pod 的流量:

    1. $ kubectl exec "$(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo dualstack | nc tcp-echo.dual-stack 9000"
    2. hello dualstack
  6. 验证到达 IPv4 Pod 的流量:

    1. $ kubectl exec "$(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo ipv4 | nc tcp-echo.ipv4 9000"
    2. hello ipv4
  7. 验证到达 IPv6 Pod 的流量:

    1. $ kubectl exec "$(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo ipv6 | nc tcp-echo.ipv6 9000"
    2. hello ipv6
  8. 验证 Envoy 侦听器:

    1. $ 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 地址。

    1. "name": "fd00:10:96::f9fc_9000",
    2. "address": {
    3. "socketAddress": {
    4. "address": "fd00:10:96::f9fc",
    5. "portValue": 9000
    6. }
    7. },
    8. "additionalAddresses": [
    9. {
    10. "address": {
    11. "socketAddress": {
    12. "address": "10.96.106.11",
    13. "portValue": 9000
    14. }
    15. }
    16. }
    17. ],
  9. 验证虚拟入站地址是否配置为同时侦听 0.0.0.0[::]

    1. $ 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}'
    1. "name": "virtualInbound",
    2. "address": {
    3. "socketAddress": {
    4. "address": "0.0.0.0",
    5. "portValue": 15006
    6. }
    7. },
    8. "additionalAddresses": [
    9. {
    10. "address": {
    11. "socketAddress": {
    12. "address": "::",
    13. "portValue": 15006
    14. }
    15. }
    16. }
    17. ],
  10. 验证 Envoy 端点是否被配置为同时路由到 IPv4 和 IPv6:

    1. $ istioctl proxy-config endpoints "$(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}')" --port 9000
    2. ENDPOINT STATUS OUTLIER CHECK CLUSTER
    3. 10.244.0.19:9000 HEALTHY OK outbound|9000||tcp-echo.ipv4.svc.cluster.local
    4. 10.244.0.26:9000 HEALTHY OK outbound|9000||tcp-echo.dual-stack.svc.cluster.local
    5. fd00:10:244::1a:9000 HEALTHY OK outbound|9000||tcp-echo.dual-stack.svc.cluster.local
    6. fd00:10:244::18:9000 HEALTHY OK outbound|9000||tcp-echo.ipv6.svc.cluster.local

现在您可以在您的环境中试验双栈服务!

清理

  1. 清理应用程序命名空间和部署

    Zip

    1. $ kubectl delete -f @samples/curl/curl.yaml@
    2. $ kubectl delete ns dual-stack ipv4 ipv6