虛擬機器安裝
按照本指南部署 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}"
建立要傳輸到虛擬機器的檔案
首先,為虛擬機器建立範本 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
$ 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 Readiness Probes 共享相同的 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
的附錄,代理將使用它來連線 istiod 以取得 xDS。
$ 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
將
cluster.env
安裝在目錄/var/lib/istio/envoy/
中$ 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