虚拟机安装

请跟随本指南部署 Istio,并接入虚拟机。

本指南已通过测试和验证,但请注意,VM 支持目前仍然是一个 alpha 特性,不建议用于生产。

先决条件

  1. 下载 Istio 发行版
  2. 执行必要的平台安装
  3. 检查 Pod 和服务的需求
  4. 虚拟机必须 IP 连通到目标网格的入口网关,如果有更高的性能需求,也可通过三层网络连通网格中的每个 Pod。

准备指导环境

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

    1. $ VM_APP="<the name of the application this VM will run>"
    2. $ VM_NAMESPACE="<the name of your service namespace>"
    3. $ WORK_DIR="<a certificate working directory>"
    4. $ SERVICE_ACCOUNT="<name of the Kubernetes service account you want to use for your VM>"
  3. 创建工作目录:

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

安装 Istio 控制平面

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

  1. 安装 Istio。

    1. $ istioctl install

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

    1. $ istioctl install --set values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION=true
  2. 部署东西向网关:

    Zip

    1. $ @samples/multicluster/gen-eastwest-gateway.sh@ --single-cluster | istioctl install -y -f -
  3. 使用示例配置,打开控制平面的对外访问:

    Zip

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

配置虚拟机的命名空间

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

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

    1. $ kubectl create serviceaccount "${SERVICE_ACCOUNT}" -n "${VM_NAMESPACE}"

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

  1. 为虚拟机创建 WorkloadGroup 模板

    1. $ istioctl x workload group create --name "${VM_APP}" --namespace "${VM_NAMESPACE}" --labels app="${VM_APP}" --serviceAccount "${SERVICE_ACCOUNT}" > workloadgroup.yaml

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

    1. 生成 WorkloadGroup:

      1. $ istioctl x workload group create --name "${VM_APP}" --namespace "${VM_NAMESPACE}" --labels app="${VM_APP}" --serviceAccount "${SERVICE_ACCOUNT}" > workloadgroup.yaml
    2. WorkloadGroup 应用到集群中:

      1. $ kubectl --namespace ${VM_NAMESPACE} apply -f workloadgroup.yaml
  2. 使用 istioctl x workload entry 命令生成:

    • cluster.env: 包含用来识别名称空间、服务帐户、网络 CIDR、和入站端口(可选)的元数据。
    • istio-token: 用来从 CA 获取证书的 Kubernetes 令牌。
    • mesh.yaml: 提供网络名称、信任域、和一些其他值的附加 Istio 元数据。
    • root-cert.pem: 用于认证的根证书。
    • hosts: /etc/hosts 的补充,代理将使用该补充从 Istiod 获取 xDS.*。

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

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

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

    1. $ istioctl x workload entry configure -f workloadgroup.yaml -o "${WORK_DIR}" --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
  3. 将令牌安装到目录 /var/run/secrets/tokens:

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

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

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

    1. $ sudo cp "${HOME}"/mesh.yaml /etc/istio/config/mesh
  7. 将 istiod 主机添加到 /etc/hosts:

    1. $ sudo sh -c 'cat $(eval echo ~$SUDO_USER)/hosts >> /etc/hosts'
  8. 把文件 /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

在虚拟机中启动 Istio

  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

卸载

在虚拟机中停止 Istio:

  1. $ sudo systemctl stop istio

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

  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@
  2. $ istioctl manifest generate | kubectl delete -f -

默认情况下,控制平面的命名空间(比如:istio-system)并不会被删除。 如果确认不再使用,使用下面命令删除:

  1. $ kubectl delete namespace istio-system

相关内容

多网络网格中的虚拟机

学习怎样添加运行在虚拟机上的服务到您的多网络 Istio 网格中。

单个网络网格中的虚拟机

学习如何新增一个服务,使其运行在单网络 Istio 网格的虚拟机上。

在虚拟机上部署 Bookinfo 应用程序

使用在网格内的虚拟机上运行的 MySQL 服务运行 Bookinfo 应用程序。

DNS 证书管理

在 Istio 中配置和管理 DNS 证书。

安全管理 Webhook

一种更安全管理 Istio webhook 的方法。

揭开 Istio Sidecar 注入模型的神秘面纱

揭秘 Istio 是如何将其数据平面组件添加到现有 deployment。