1. 引言
服务网格接入虚机是为了让传统应用在不改造架构的前提下,也能获得服务网格的治理能力,例如统一的服务发现、流量控制、故障治理与安全通信,从而支撑平滑上云和系统演进。
2. 架构
3. 准备工作
3.1 创建网格实例
确保在控制面中已创建好可用的 服务网格实例,并确认网格状态为 Running。 后续步骤中的虚拟机将加入此网格实例以实现统一流量管理与安全控制。
注意
确保目标虚拟机和网格实例之间网络互通。
3.2. 创建接入网格的虚拟机
准备一台或多台计划纳入网格的虚拟机;
说明
权限要求:具备 root 或具有 sudo 权限的用户;
网络要求:可以访问到 容器集群 API Server 的地址;
3.3 上传 istioctl 与 kubectl 工具
下载并将以下二进制文件上传至虚拟机(例如存放于 /usr/local/bin):
istioctl
kubectl
执行以下命令添加到系统环境变量:
export PATH=$PATH:/usr/local/bin验证:
kubectl version --client
istioctl version
3.4 配置 kubeconfig 文件
将容器集群的 kubeconfig 文件拷贝至虚拟机,使 kubectl 可正常访问主集群。
文件路径:~/.kube/config
验证连接是否成功 kubectl get ns
若能列出命名空间列表,说明连接正常。
3.5 创建istio-proxy用户
在虚拟机中创建 istio-proxy 用户及用户组,用于运行 Sidecar 代理进程。sudo useradd -r -M -s /sbin/nologin istio-proxy
-r 表示创建系统用户;
-M 不创建 home 目录;
-s /sbin/nologin 表示该用户不可直接登录;
Sidecar 启动将以该用户身份运行。
3.6 准备 istio ConfigMap
在虚拟机加入网格过程中,istio ConfigMap 是必需的资源。
它包含虚拟机与控制平面通信所需的基础配置。
在部分安装环境中,默认生成的 ConfigMap 名称包含版本号,例如:istio-1-19-0
此时集群中并不存在名为 istio 的 ConfigMap,
但虚拟机接入流程(如 istioctl x workload-entry configure )会依赖该名称。
因此,需要复制一份带版本号的 ConfigMap 并命名为 istio。
执行以下命令,将已有的 istio-<version> ConfigMap 复制为 istio:
kubectl -n istio-system get configmap istio-<version> -o yaml \
| sed 's/name: istio-<version>/name: istio/' \
| kubectl apply -f -<version>:请替换为当前安装的 Istio 实际版本号,例如 1-19-0。
确认 ConfigMap 是否成功创建:kubectl -n istio-system get configmap | grep istio
示例输出:
istio 1 2m
istio-1-19-0 1 3d
4. 设置环境变量
在集群的计算机上设置环境变量 VM_APP、WORK_DIR、VM_NAMESPACE 和 SERVICE_ACCOUNT (例如:WORK_DIR="${HOME}/work_dir"):
VM_APP="myhertz" # <将在这台虚机上运行的应用名>
VM_NAMESPACE="prod" # <您的服务所在的命名空间>
WORK_DIR="/root/work_dir/" # <证书工作目录>
SERVICE_ACCOUNT="prodsa" # <为这台虚机提供的 Kubernetes 服务账号名称>
CLUSTER_NETWORK="network1984088494607171585" # 集群网络
VM_NETWORK="network1984088494607171585" # VM 所在网络
CLUSTER="cce-5f7hp4" # 集群名称或类型CLUSTER_NETWORK/CLUSTER可以从iop类型资源 istiocontrolplane<VERSION> 中获取,VM_NETWORK保持与CLUSTER_NETWORK相同;
创建工作目录:mkdir -p "${WORK_DIR}"
5. 配置虚拟机的命名空间
创建用于托管虚拟机的命名空间:kubectl create namespace "${VM_NAMESPACE}"
为虚拟机创建ServiceAccount:kubectl create serviceaccount "${SERVICE_ACCOUNT}" -n "${VM_NAMESPACE}"
6. 创建虚拟机配置文件
首先,为虚拟机创建 WorkloadGroup 模板:
cat <<EOF > workloadgroup.yaml
apiVersion: networking.istio.io/v1
kind: WorkloadGroup
metadata:
name: "${VM_APP}"
namespace: "${VM_NAMESPACE}"
spec:
metadata:
labels:
app: "${VM_APP}"
template:
serviceAccount: "${SERVICE_ACCOUNT}"
network: "${VM_NETWORK}"
EOF可以将文件workloadgroup.yaml放置于/root目录下
执行命令生成文件:istioctl x workload entry configure -f workloadgroup.yaml -o "${WORK_DIR}" --clusterID "${CLUSTER}"
在${WORK_DIR}目录下生成以下文件:
cluster.env:包含用来识别命名空间、服务帐户、网络 CIDR、和入站端口(可选)的元数据。
istio-token:用来从 CA 获取证书的 Kubernetes 令牌。
mesh.yaml:提供 ProxyConfig 来配置 discoveryAddress、健康检查以及一些认证操作。
root-cert.pem:用于认证的根证书。
hosts:/etc/hosts 的补充,代理将使用该补充从 Istiod 获取 xDS.*。
7. 修改虚拟机配置文件
在生成的工作目录 ${WORK_DIR} 中,会包含虚拟机接入网格所需的全部文件。
但要确保虚拟机能够正确与 Istio 控制平面通信,还需要进行以下两个额外修改。
7.1 增加 CA_ADDR 环境变量
在 ${WORK_DIR}/cluster.env 文件中追加以下环境变量:CA_ADDR=istiod-<version>.istio-system.svc:15012
示例:CA_ADDR=istiod-1-19-0.istio-system.svc:15012
说明
在默认配置中,虚拟机端的 istio-agent 会尝试自动解析 CA 地址(istiod 服务)。
但在部分环境中,Istio 的服务命名规则中包含版本号(如 istiod-1-19-0),
这会导致虚拟机无法通过默认的服务名 istiod.istio-system.svc 成功解析到控制面地址。
因此,需要显式设置 CA_ADDR 变量,指定正确的控制面服务地址和端口。
7.2 更新 hosts 文件
${WORK_DIR}/hosts 中默认的域名解析只有 192.168.2.122 istiod.istio-system.svc,需要添加带版本好的域名记录,例如:192.168.2.122 istiod-1-19-0.istio-system.svc
备注:IP 地址保持和 istiod.istio-system.svc 相同。
8. 配置虚拟机
在要添加到 Istio 网格的虚拟机上,运行以下命令:
1. 将根证书安装到目录 /etc/certs:$ sudo mkdir -p /etc/certs$ sudo cp "${WORK_DIR}"/root-cert.pem /etc/certs/root-cert.pem
2. 将令牌安装到目录 /var/run/secrets/tokens:$ sudo mkdir -p /var/run/secrets/tokens$ sudo cp "${WORK_DIR}"/istio-token /var/run/secrets/tokens/istio-token
3. 下载并安装含 Istio 虚拟机集成运行时(runtime)的包:$ sudo rpm -i istio-sidecar.rpm
4. 将 cluster.env 安装到目录 /var/lib/istio/envoy/ 中:$ sudo cp "${WORK_DIR}"/cluster.env /var/lib/istio/envoy/cluster.env
5. 将网格配置文件 Mesh Config 安装到目录 /etc/istio/config/mesh:$ sudo cp "${WORK_DIR}"/mesh.yaml /etc/istio/config/mesh
6. 将 istiod 主机添加到 /etc/hosts:$ sudo cat "${WORK_DIR}"/hosts >> /etc/hosts
7. 把文件 /etc/certs/ 和 /var/lib/istio/envoy/ 的所有权转移给 Istio 代理:$ sudo mkdir -p /etc/istio/proxy$ sudo chown -R istio-proxy /var/lib/istio /etc/certs /etc/istio/proxy /etc/istio/config /var/run/secrets /etc/certs/root-cert.pem
9. 在虚拟机上启动Istio
使用 istio-proxy 用户启动 istio 代理sudo -u istio-proxy systemctl start istio
10. 验证虚拟机上 Istio 是否启动成功
1. 检查 /var/log/istio/istio.log 中的日志,应该能看到类似如下内容:
2. 创建命名空间,部署基于Pod的服务kubectl create namespace samplekubectl label namespace sample istio-injection=enabled
3. 创建Helloworld服务kubectl apply -f samples/helloworld/helloworld.yaml
4. 从虚拟机像服务发送请求:
[root@msegw-vmcaf1otdh tantao]# curl helloworld.sample.svc:5000/hello
Hello version: v2, instance: helloworld-v2-5df48bd4dc-nclfx
[root@msegw-vmcaf1otdh tantao]# curl helloworld.sample.svc:5000/hello
Hello version: v2, instance: helloworld-v2-5df48bd4dc-nclfx
[root@msegw-vmcaf1otdh tantao]# curl helloworld.sample.svc:5000/hello
Hello version: v1, instance: helloworld-v1-bcd77f79-xcs5n