控制中心做了進一步的細分,分成了 Pilot、Mixer 和 Citadel,它們的各自功能如下:
- Pilot:為 Envoy 提供了服務發現,流量管理和智能路由(AB 測試、金絲雀發布等),以及錯誤處理(超時、重試、熔斷)功能。 用戶通過 Pilot 的 API 管理網絡相關的資源對象,Pilot 會根據用戶的配置和服務的信息把網絡流量管理變成 Envoy 能識別的格式分發到各個 Sidecar 代理中。
- Mixer:為整個集群執行訪問控制(哪些用戶可以訪問哪些服務)和 Policy 管理(Rate Limit,Quota 等),並且收集代理觀察到的服務之間的流量統計數據。
- Citadel:為服務之間提供認證和證書管理,可以讓服務自動升級成 TLS 協議。
下載 Istio
下載內容將包含:安裝文件、示例和 istioctl 命令行工具。
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.12 TARGET_ARCH=x86_64 sh -
cd istio-1.6.12/
# 將 istioctl 客戶端路徑增加到 path 環境變量中
export PATH=$PWD/bin:$PATH
# 安裝 demo 配置
istioctl install --set profile=demo
# 設置啟用自動注入 istio sidecar 的命名空間,當使用 kubectl apply 來部署應用時,如果 pod 啟動在標有 istio-injection=enabled 的命名空間中,那么,Istio sidecar 注入器將自動注入 Envoy 容器到應用的 pod 中:
kubectl label namespace default istio-injection=enabled
創建一個例子應用
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
# 確認應用已經正確啟動
kubectl get svc
kubectl get pod
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"
# 創建一個 Istio Ingress Gateway 接入外部流量
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
# 檢查
istioctl analyze
# 確定 ingress 的IP和端口,下面有兩種情況
# 情況一:EXTERNAL-IP 存在
kubectl get svc istio-ingressgateway -n istio-system
# 情況二:EXTERNAL-IP 不存在,使用 nodePort
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
echo "$GATEWAY_URL"
echo "http://$GATEWAY_URL/productpage"
# 使用瀏覽器訪問上面的IP,確定可以正常訪問
創建 dashboard
kubectl apply -f samples/addons
while ! kubectl wait --for=condition=available --timeout=600s deployment/kiali -n istio-system; do sleep 1; done
kubectl get deployment --all-namespaces
# 啟動 web UI
istioctl dashboard kiali --address=0.0.0.0