虚拟机安装
按照本指南部署 Istio 并将虚拟机连接到它。
先决条件
- 下载 Istio 版本
- 执行任何必要的平台特定设置
- 检查Pod 和服务的要求
- 虚拟机必须与连接网格中的入口网关具有 IP 连接,并且如果需要增强性能,则可以选择通过 L3 网络与网格中的每个 Pod 建立连接。
- 了解虚拟机架构,以了解 Istio 虚拟机集成的顶级架构。
准备指南环境
创建虚拟机
在您用于设置集群的机器上设置环境变量
VM_APP
、WORK_DIR
、VM_NAMESPACE
和SERVICE_ACCOUNT
。(例如:WORK_DIR="${HOME}/vmintegration"
)$ VM_APP="<the name of the application this VM will run>" $ VM_NAMESPACE="<the name of your service namespace>" $ WORK_DIR="<a certificate working directory>" $ SERVICE_ACCOUNT="<name of the Kubernetes service account you want to use for your VM>" $ CLUSTER_NETWORK="" $ VM_NETWORK="" $ CLUSTER="Kubernetes"
$ VM_APP="<the name of the application this VM will run>" $ VM_NAMESPACE="<the name of your service namespace>" $ WORK_DIR="<a certificate working directory>" $ SERVICE_ACCOUNT="<name of the Kubernetes service account you want to use for your VM>" $ # Customize values for multi-cluster/multi-network as needed $ CLUSTER_NETWORK="kube-network" $ VM_NETWORK="vm-network" $ CLUSTER="cluster1"
在您用于设置集群的机器上创建工作目录
$ mkdir -p "${WORK_DIR}"
安装 Istio 控制平面
如果您的集群已经拥有 Istio 控制平面,您可以跳过安装步骤,但仍需要公开控制平面以供虚拟机访问。
安装 Istio 并公开集群上的控制平面,以便您的虚拟机可以访问它。
创建用于安装的
IstioOperator
规范。$ cat <<EOF > ./vm-cluster.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: name: istio spec: values: global: meshID: mesh1 multiCluster: clusterName: "${CLUSTER}" network: "${CLUSTER_NETWORK}" EOF
安装 Istio。
$ istioctl install -f vm-cluster.yaml
$ 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
部署东西向网关
$ @samples/multicluster/gen-eastwest-gateway.sh@ --single-cluster | istioctl install -y -f -
$ @samples/multicluster/gen-eastwest-gateway.sh@ \ --network "${CLUSTER_NETWORK}" | \ istioctl install -y -f -
通过东西向网关公开集群内的服务
公开控制平面
$ kubectl apply -n istio-system -f @samples/multicluster/expose-istiod.yaml@
公开控制平面
$ kubectl apply -n istio-system -f @samples/multicluster/expose-istiod.yaml@
公开集群服务
$ kubectl apply -n istio-system -f @samples/multicluster/expose-services.yaml@
确保使用定义的集群网络为 istio-system 命名空间添加标签
$ kubectl label namespace istio-system topology.istio.io/network="${CLUSTER_NETWORK}"
配置 VM 命名空间
创建将承载虚拟机的命名空间
$ kubectl create namespace "${VM_NAMESPACE}"
为虚拟机创建服务帐户
$ kubectl create serviceaccount "${SERVICE_ACCOUNT}" -n "${VM_NAMESPACE}"
创建要传输到虚拟机的文件
首先,为 VM(s) 创建一个模板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
首先,为 VM(s) 创建一个模板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
然后,要允许自动创建WorkloadEntry
,请将WorkloadGroup
推送到集群
$ kubectl --namespace "${VM_NAMESPACE}" apply -f workloadgroup.yaml
使用自动WorkloadEntry
创建功能,应用程序运行状况检查也可用。这些共享与Kubernetes 就绪探针相同的 API 和行为。
例如,要配置应用程序/ready
端点的探针
$ 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: "${NETWORK}"
probe:
periodSeconds: 5
initialDelaySeconds: 1
httpGet:
port: 8080
path: /ready
EOF
通过此配置,在探针成功之前,自动生成的WorkloadEntry
不会被标记为“就绪”。
接下来,使用istioctl x workload entry
命令生成
cluster.env
:包含识别命名空间、服务帐户、网络 CIDR 和(可选)要捕获的入站端口的元数据。istio-token
:用于从 CA 获取证书的 Kubernetes 令牌。mesh.yaml
:提供ProxyConfig
以配置discoveryAddress
、运行状况检查探针和一些身份验证选项。root-cert.pem
:用于身份验证的根证书。hosts
:/etc/hosts
的补充,代理将使用它来访问用于 xDS 的 istiod。*
$ istioctl x workload entry configure -f workloadgroup.yaml -o "${WORK_DIR}" --clusterID "${CLUSTER}"
$ istioctl x workload entry configure -f workloadgroup.yaml -o "${WORK_DIR}" --clusterID "${CLUSTER}" --autoregister
配置虚拟机
在您要添加到 Istio 网格的虚拟机上运行以下命令
安全地将文件从
"${WORK_DIR}"
传输到虚拟机。您选择安全传输这些文件的方式应考虑到您的信息安全策略。为了本指南的方便,将所有必需的文件传输到虚拟机中的"${HOME}"
。在
/etc/certs
处安装根证书$ sudo mkdir -p /etc/certs $ sudo cp "${HOME}"/root-cert.pem /etc/certs/root-cert.pem
在
/var/run/secrets/tokens
处安装令牌$ sudo mkdir -p /var/run/secrets/tokens $ sudo cp "${HOME}"/istio-token /var/run/secrets/tokens/istio-token
安装包含 Istio 虚拟机集成运行时的软件包
$ curl -LO https://storage.googleapis.com/istio-release/releases/1.24.0/deb/istio-sidecar.deb $ sudo dpkg -i istio-sidecar.deb
注意:目前仅支持 CentOS 8。
$ curl -LO https://storage.googleapis.com/istio-release/releases/1.24.0/rpm/istio-sidecar.rpm $ sudo rpm -i istio-sidecar.rpm
在
/var/lib/istio/envoy/
目录中安装cluster.env
$ sudo cp "${HOME}"/cluster.env /var/lib/istio/envoy/cluster.env
将网格配置安装到
/etc/istio/config/mesh
$ sudo cp "${HOME}"/mesh.yaml /etc/istio/config/mesh
将 istiod 主机添加到
/etc/hosts
$ sudo sh -c 'cat $(eval echo ~$SUDO_USER)/hosts >> /etc/hosts'
将
/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
在虚拟机中启动 Istio
启动 Istio 代理
$ sudo systemctl start istio
验证 Istio 是否成功运行
检查
/var/log/istio/istio.log
中的日志。您应该看到类似于以下内容的条目$ 2020-08-21T01:32:17.748413Z info sds resource:default pushed key/cert pair to proxy $ 2020-08-21T01:32:20.270073Z info sds resource:ROOTCA new connection $ 2020-08-21T01:32:20.270142Z info sds Skipping waiting for gateway secret $ 2020-08-21T01:32:20.270279Z info cache adding watcher for file ./etc/certs/root-cert.pem $ 2020-08-21T01:32:20.270347Z info cache GenerateSecret from file ROOTCA $ 2020-08-21T01:32:20.270494Z info sds resource:ROOTCA pushed root cert to proxy $ 2020-08-21T01:32:20.270734Z info sds resource:default new connection $ 2020-08-21T01:32:20.270763Z info sds Skipping waiting for gateway secret $ 2020-08-21T01:32:20.695478Z info cache GenerateSecret default $ 2020-08-21T01:32:20.695595Z info sds resource:default pushed key/cert pair to proxy
创建命名空间以部署基于 Pod 的服务
$ kubectl create namespace sample $ kubectl label namespace sample istio-injection=enabled
部署
HelloWorld
服务$ kubectl apply -n sample -f @samples/helloworld/helloworld.yaml@
从您的虚拟机向服务发送请求
$ curl helloworld.sample.svc:5000/hello Hello version: v1, instance: helloworld-v1-578dd69f69-fxwwk
后续步骤
有关虚拟机的更多信息
- 调试虚拟机以解决虚拟机问题。
- 带有虚拟机的 Bookinfo以设置虚拟机的示例部署。
卸载
停止虚拟机上的 Istio
$ sudo systemctl stop istio
然后,删除 Istio 边车软件包
$ sudo dpkg -r istio-sidecar
$ dpkg -s istio-sidecar
$ sudo rpm -e istio-sidecar
要卸载 Istio,请运行以下命令
$ kubectl delete -n istio-system -f @samples/multicluster/expose-istiod.yaml@
$ istioctl uninstall -y --purge
默认情况下不会删除控制平面命名空间(例如,istio-system
)。如果不再需要,请使用以下命令将其删除
$ kubectl delete namespace istio-system