虚拟机安装

    1. 下载 Istio 发行版
    2. 执行必要的
    3. 检查 Pod 和服务的需求
    4. 虚拟机必须 IP 连通到目标网格的入口网关,如果有更高的性能需求,也可通过三层网络连通网格中的每个 Pod。
    5. 阅读来理解 Istio 虚拟机集成的高级架构。

    准备指导环境

    1. 创建虚拟机
    2. 设置环境变量 、WORK_DIRVM_NAMESPACE、和 SERVICE_ACCOUNT(例如: WORK_DIR="${HOME}/vmintegration"):

      单一网络 聚合网络

      1. $ VM_APP="<将在这台虚机上运行的应用名>"
      2. $ VM_NAMESPACE="<您的服务所在的命名空间>"
      3. $ WORK_DIR="<证书工作目录>"
      4. $ SERVICE_ACCOUNT="<为这台虚机提供的 Kubernetes 的服务账号名称>"
      5. $ # 根据您的需要自定义多集群/多网络的参数
      6. $ CLUSTER_NETWORK="kube-network"
      7. $ VM_NETWORK="vm-network"
      8. $ CLUSTER="cluster1"
    3. 创建工作目录:

      1. $ mkdir -p "${WORK_DIR}"

    安装 Istio 控制平面

    安装 Istio,打开控制平面的对外访问,以便您的虚拟机可以访问它。

    1. 为安装创建 IstioOperator 空间

      1. $ cat <<EOF > ./vm-cluster.yaml
      2. apiVersion: install.istio.io/v1alpha1
      3. kind: IstioOperator
      4. metadata:
      5. name: istio
      6. spec:
      7. values:
      8. global:
      9. meshID: mesh1
      10. multiCluster:
      11. clusterName: "${CLUSTER}"
      12. network: "${CLUSTER_NETWORK}"
      13. EOF
    2. 安装 Istio。

      默认 自动化 WorkloadEntry 创建

      1. $ istioctl install

      该特性正在积极研发中,目前尚处于 experimental 阶段。

      1. $ istioctl install -f vm-cluster.yaml --set values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION=true --set values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_HEALTHCHECKS=true
    3. 部署东西向网关:

      如果控制平面安装的是一个修正版本,请将参数 --revision rev 添加到 gen-eastwest-gateway.sh 命令。

      单一网络 聚合网络

      1. $ @samples/multicluster/gen-eastwest-gateway.sh@ --single-cluster | istioctl install -y -f -

      Zip

      1. $ @samples/multicluster/gen-eastwest-gateway.sh@ \
      2. --mesh mesh1 --cluster "${CLUSTER}" --network "${CLUSTER_NETWORK}" | \
      3. istioctl install -y -f -
    4. 使用东西向网关暴露集群内部服务:

      单一网络 聚合网络

      暴露控制平面:

      1. $ kubectl apply -f @samples/multicluster/expose-istiod.yaml@

      暴露控制平面:

      Zip

      1. $ kubectl apply -f @samples/multicluster/expose-istiod.yaml@

      1. 创建用于托管虚拟机的名称空间:

        1. $ kubectl create namespace "${VM_NAMESPACE}"
      2. 为虚拟机创建 ServiceAccount:

      创建要传输到虚拟机的文件

      默认 自动化 WorkloadEntry 创建

      首先,为虚拟机创建 WorkloadGroup 模板:

      1. $ cat <<EOF > workloadgroup.yaml
      2. apiVersion: networking.istio.io/v1alpha3
      3. kind: WorkloadGroup
      4. metadata:
      5. name: "${VM_APP}"
      6. namespace: "${VM_NAMESPACE}"
      7. spec:
      8. metadata:
      9. labels:
      10. app: "${VM_APP}"
      11. template:
      12. network: "${VM_NETWORK}"
      13. EOF

      首先,为虚拟机创建 WorkloadGroup 模板:

      该特性正在积极中,目前尚处于 experimental 阶段。

      1. $ cat <<EOF > workloadgroup.yaml
      2. apiVersion: networking.istio.io/v1alpha3
      3. kind: WorkloadGroup
      4. metadata:
      5. name: "${VM_APP}"
      6. namespace: "${VM_NAMESPACE}"
      7. spec:
      8. metadata:
      9. labels:
      10. app: "${VM_APP}"
      11. template:
      12. serviceAccount: "${SERVICE_ACCOUNT}"
      13. network: "${VM_NETWORK}"
      14. EOF

      然后,将 WorkLoadGroup 应用到集群中:

      1. $ kubectl --namespace "${VM_NAMESPACE}" apply -f workloadgroup.yaml

      使用自动创建 WorkloadEntry 的特性,还可以进行应用程序的健康检查。与 Kubernetes Readiness Probes 具有相同行为和 API 。

      例如,在应用程序的 /ready 端点上配置探针:

      1. $ cat <<EOF > workloadgroup.yaml
      2. apiVersion: networking.istio.io/v1alpha3
      3. kind: WorkloadGroup
      4. metadata:
      5. name: "${VM_APP}"
      6. namespace: "${VM_NAMESPACE}"
      7. spec:
      8. metadata:
      9. labels:
      10. app: "${VM_APP}"
      11. template:
      12. serviceAccount: "${SERVICE_ACCOUNT}"
      13. network: "${NETWORK}"
      14. probe:
      15. periodSeconds: 5
      16. initialDelaySeconds: 1
      17. httpGet:
      18. port: 8080
      19. path: /ready
      20. EOF

      通过这个配置,自动生成的 WorkloadEntry 在探针成功之前不会被标记为 “Ready”。

      在开始生成 istio-token 之前,作为 istioctl x workload entry 的一部分,您应该按照来验证集群中是否使用了第三方服务账号令牌。 如果没有使用第三方服务账户令牌,您应该为 Istio 安装指令添加参数 --set values.global.jwtPolicy=first-party-jwt

      接下来,使用 istioctl x workload entry 命令来生成:

      • istio-token: 用来从 CA 获取证书的 Kubernetes 令牌。
      • mesh.yaml: 提供 ProxyConfig 来配置 discoveryAddress, 健康检查, 以及一些认证操作。
      • : 用于认证的根证书。
      • hosts: /etc/hosts 的补充,代理将使用该补充从 Istiod 获取 xDS.*。

      一个复杂的选项涉及在虚拟机中配置 DNS 以引用外部 DNS 服务器。 此选项超出了本指南的范围。

      默认 自动化 WorkloadEntry 创建

      1. $ istioctl x workload entry configure -f workloadgroup.yaml -o "${WORK_DIR}" --clusterID "${CLUSTER}"

      该特性正在积极研发中,目前尚处于 experimental 阶段。

      1. $ istioctl x workload entry configure -f workloadgroup.yaml -o "${WORK_DIR}" --clusterID "${CLUSTER}" --autoregister

      配置虚拟机

      在要添加到 Istio 网格的虚拟机上,运行以下命令:

      1. 将文件从 "${WORK_DIR}" 安全上传到虚拟机。如何安全的传输这些文件,这需要考虑到您的信息安全策略。本指南为方便起见,将所有必备文件上传到虚拟机中的 "${HOME}" 目录。

      2. 将根证书安装到目录 /etc/certs:

        1. $ sudo mkdir -p /etc/certs
        2. $ sudo cp "${HOME}"/root-cert.pem /etc/certs/root-cert.pem
        1. $ sudo mkdir -p /var/run/secrets/tokens
        2. $ sudo cp "${HOME}"/istio-token /var/run/secrets/tokens/istio-token
      3. 安装包含 Istio 虚拟机集成运行时(runtime)的包:

        Debian CentOS

        1. $ curl -LO https://storage.googleapis.com/istio-release/releases/1.13.2/deb/istio-sidecar.deb
        2. $ sudo dpkg -i istio-sidecar.deb

        注意:目前仅支持 CentOS 8。

        1. $ curl -LO https://storage.googleapis.com/istio-release/releases/1.13.2/rpm/istio-sidecar.rpm
        2. $ sudo rpm -i istio-sidecar.rpm
      4. cluster.env 安装到目录 /var/lib/istio/envoy/ 中:

        1. $ sudo cp "${HOME}"/cluster.env /var/lib/istio/envoy/cluster.env
      5. 将网格配置文件 Mesh Config 安装到目录 /etc/istio/config/mesh:

      6. 将 istiod 主机添加到 /etc/hosts:

        1. $ sudo sh -c 'cat $(eval echo ~$SUDO_USER)/hosts >> /etc/hosts'
      7. 把文件 /etc/certs//var/lib/istio/envoy/ 的所有权转移给 Istio proxy:

        1. $ sudo mkdir -p /etc/istio/proxy
        2. $ sudo chown -R istio-proxy /var/lib/istio /etc/certs /etc/istio/proxy /etc/istio/config /var/run/secrets /etc/certs/root-cert.pem
      1. 启动 Istio 代理:

        1. $ sudo systemctl start istio

      验证 Istio 是否成功工作

      1. 检查 /var/log/istio/istio.log 中的日志,您应该能看到类似于以下的内容:

        1. $ 2020-08-21T01:32:17.748413Z info sds resource:default pushed key/cert pair to proxy
        2. $ 2020-08-21T01:32:20.270073Z info sds resource:ROOTCA new connection
        3. $ 2020-08-21T01:32:20.270142Z info sds Skipping waiting for gateway secret
        4. $ 2020-08-21T01:32:20.270279Z info cache adding watcher for file ./etc/certs/root-cert.pem
        5. $ 2020-08-21T01:32:20.270347Z info cache GenerateSecret from file ROOTCA
        6. $ 2020-08-21T01:32:20.270494Z info sds resource:ROOTCA pushed root cert to proxy
        7. $ 2020-08-21T01:32:20.270734Z info sds resource:default new connection
        8. $ 2020-08-21T01:32:20.270763Z info sds Skipping waiting for gateway secret
        9. $ 2020-08-21T01:32:20.695478Z info cache GenerateSecret default
        10. $ 2020-08-21T01:32:20.695595Z info sds resource:default pushed key/cert pair to proxy
      2. 创建命名空间,用以部署基于 Pod 的服务:

        1. $ kubectl create namespace sample
        2. $ kubectl label namespace sample istio-injection=enabled
      3. 部署 HelloWorld 服务:

        Zip

        1. $ kubectl apply -f @samples/helloworld/helloworld.yaml@
      4. 从虚拟机向服务发送请求:

        1. $ curl helloworld.sample.svc:5000/hello
        2. Hello version: v1, instance: helloworld-v1-578dd69f69-fxwwk

      下一步

      更多关于虚拟机的信息: * Debugging Virtual Machines to troubleshoot issues with virtual machines. * to set up an example deployment of virtual machines.

      在虚拟机中停止 Istio:

      1. $ sudo systemctl stop istio

      然后,删除 Istio-sidecar 的发行包:

      Debian CentOS

      1. $ sudo dpkg -r istio-sidecar
      2. $ dpkg -s istio-sidecar
      1. $ sudo rpm -e istio-sidecar

      要卸载 Istio,请运行以下命令:

      Zip

      1. $ kubectl delete -f @samples/multicluster/expose-istiod.yaml@