Kubernetes
  • 序言
  • 基礎入門
    • Kubernetes 簡介
    • Kubernetes 基本概念
    • Kubernetes 101
    • Kubernetes 201
    • Kubernetes 集群
  • 核心原理
    • 核心原理
    • 架構原理
    • 設計理念
    • 核心組件
      • etcd
      • kube-apiserver
      • kube-scheduler
      • kube-controller-manager
      • kubelet
      • kube-proxy
      • kube-dns
      • Federation
      • kubeadm
      • hyperkube
      • kubectl
    • 資源對象
      • Autoscaling
      • ConfigMap
      • CronJob
      • CustomResourceDefinition
      • DaemonSet
      • Deployment
      • Ingress
      • Job
      • LocalVolume
      • Namespace
      • NetworkPolicy
      • Node
      • PersistentVolume
      • Pod
      • PodPreset
      • ReplicaSet
      • Resource Quota
      • Secret
      • SecurityContext
      • Service
      • ServiceAccount
      • StatefulSet
      • Volume
  • 部署配置
    • 部署指南
    • kubectl 安裝
    • 單機部署
    • 特性開關
    • 最佳配置
    • 版本支持
    • 集群部署
      • kubeadm
      • kops
      • Kubespray
      • Azure
      • Windows
      • LinuxKit
      • kubeasz
    • 附加組件
      • Addon-manager
      • DNS
      • Dashboard
      • 監控
      • 日誌
      • Metrics
      • GPU
      • Cluster Autoscaler
      • ip-masq-agent
    • Kubernetes-The-Hard-Way
      • 準備部署環境
      • 安裝必要工具
      • 創建計算資源
      • 配置創建證書
      • 配置生成配置
      • 配置生成密鑰
      • 部署 Etcd 群集
      • 部署控制節點
      • 部署計算節點
      • 配置 Kubectl
      • 配置網絡路由
      • 部署 DNS 擴展
      • 煙霧測試
      • 刪除集群
  • 插件擴展
    • API 擴展
      • Aggregation
      • CustomResourceDefinition
    • 訪問控制
      • 認證
      • RBAC 授權
      • 准入控制
    • Scheduler 擴展
    • 網絡插件
      • CNI
      • Flannel
      • Calico
      • Weave
      • Cilium
      • OVN
      • Contiv
      • SR-IOV
      • Romana
      • OpenContrail
      • Kuryr
    • 運行時插件 CRI
      • CRI-tools
      • Frakti
    • 存儲插件
      • 容器存儲接口 CSI
      • FlexVolume
      • glusterfs
    • 網絡策略
    • Ingress Controller
      • Ingress + Letsencrypt
      • minikube Ingress
      • Traefik Ingress
      • Keepalived-VIP
    • Cloud Provider 擴展
    • Device 插件
  • 服務治理
    • 服務治理
      • 一般準則
      • 滾動升級
      • Helm
      • Operator
      • Service Mesh
      • Linkerd
      • Linkerd2
    • Istio
      • 安裝
      • 流量管理
      • 安全管理
      • 策略管理
      • 度量管理
      • 排錯
      • 社區
    • Devops
      • Draft
      • Jenkins X
      • Spinnaker
      • Kompose
      • Skaffold
      • Argo
      • Flux GitOps
  • 實踐案例
    • 實踐概覽
    • 資源控制
    • 集群高可用
    • 應用高可用
    • 調試
    • 端口映射
    • 端口轉發
    • 用戶管理
    • GPU
    • HugePage
    • 安全
    • 審計
    • 備份恢復
    • 證書輪換
    • 大規模集群
    • 大數據與機器學習
      • Spark
      • Tensorflow
    • Serverless
  • 排錯指南
    • 排錯概覽
    • 集群排錯
    • Pod 排錯
    • 網絡排錯
    • PV 排錯
      • AzureDisk
      • AzureFile
    • Windows 排錯
    • 雲平臺排錯
      • Azure
    • 排錯工具
  • 社區貢獻
    • 開發指南
    • 單元測試和集成測試
    • 社區貢獻
  • 附錄
    • 生態圈
    • 學習資源
    • 國內鏡像
    • 如何貢獻
    • 參考文檔
Powered by GitBook
On this page
  • Istio 原理
  • 安裝
  • 注入 Sidecar 容器前對 Pod 的要求
  • 示例應用
  • 手動注入 sidecar 容器
  • 自動注入 sidecar 容器
  • 參考文檔
  1. 服務治理

Istio

PreviousLinkerd2Next安裝

Last updated 1 year ago

Istio 是 Google、IBM 和 Lyft 聯合開源的服務網格(Service Mesh)框架,旨在解決大量微服務的發現、連接、管理、監控以及安全等問題。Istio 對應用是透明的,不需要改動任何服務代碼就可以實現透明的服務治理。

Istio 的主要特性包括:

  • HTTP、gRPC、WebSocket 和 TCP 網絡流量的自動負載均衡

  • 細粒度的網絡流量行爲控制, 包括豐富的路由規則、重試、故障轉移和故障注入等

  • 可選策略層和配置 API 支持訪問控制、速率限制以及配額管理

  • 自動度量、日誌記錄和跟蹤所有進出的流量

  • 強大的身份認證和授權機制實現服務間的安全通信

Istio 原理

Istio 從邏輯上可以分爲數據平面和控制平面:

  • 數據平面主要由一系列的智能代理(默認爲 Envoy)組成,管理微服務之間的網絡通信

  • 控制平面負責管理和配置代理來路由流量,並配置 Mixer 以進行策略部署和遙測數據收集

Istio 架構可以如下圖所示

它主要由以下組件構成

  • Mixer:負責訪問控制、執行策略並從 Envoy 代理中收集遙測數據。Mixer 支持靈活的插件模型,方便擴展(支持 GCP、AWS、Prometheus、Heapster 等多種後端)。

  • Pilot:動態管理 Envoy 實例的生命週期,提供服務發現、智能路由和彈性流量管理(如超時、重試)等功能。它將流量管理策略轉化爲 Envoy 數據平面配置,並傳播到 sidecar 中。

  • Citadel 通過內置身份和憑證管理提供服務間和最終用戶的身份認證。支持基於角色的訪問控制、基於服務標識的策略執行等。

安裝

注入 Sidecar 容器前對 Pod 的要求

爲 Pod 注入 Sidecar 容器後才能成爲服務網格的一部分。Istio 要求 Pod 必須滿足以下條件:

  • Pod 要關聯服務並且必須屬於單一的服務,不支持屬於多個服務的 Pod

  • 端口必須要命名,格式爲 <協議>[-<後綴>],其中協議包括 http、http2、grpc、mongo 以及 redis。否則會被視爲 TCP 流量

  • 推薦所有 Deployment 中增加 app 標籤,用來在分佈式跟蹤中添加上下文信息

示例應用

手動注入 sidecar 容器

在部署應用時,可以通過 istioctl kube-inject 給 Pod 手動插入 Envoy sidecar 容器,即

$  kubectl apply -f <(istioctl kube-inject --debug -f samples/bookinfo/platform/kube/bookinfo.yaml)
service "details" configured
deployment.extensions "details-v1" configured
service "ratings" configured
deployment.extensions "ratings-v1" configured
service "reviews" configured
deployment.extensions "reviews-v1" configured
deployment.extensions "reviews-v2" configured
deployment.extensions "reviews-v3" configured
service "productpage" configured
deployment.extensions "productpage-v1" configured
ingress.extensions "gateway" configured

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

原始應用如下圖所示

istioctl kube-inject 在原始應用的每個 Pod 中插入了一個 Envoy 容器

服務啓動後,可以通過 Gateway 地址 http://<gateway-address>/productpage 來訪問 BookInfo 應用:

$ kubectl get svc istio-ingressgateway -n istio-system
kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)                                                                                                     AGE
istio-ingressgateway   LoadBalancer   10.0.203.82   x.x.x.x        80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:31720/TCP,8060:31948/TCP,15030:32340/TCP,15031:31958/TCP   2h

默認情況下,三個版本的 reviews 服務以負載均衡的方式輪詢。

自動注入 sidecar 容器

首先確認 admissionregistration API 已經開啓:

$ kubectl api-versions | grep admissionregistration
admissionregistration.k8s.io/v1beta1

然後確認 istio-sidecar-injector 正常運行

# Conform istio-sidecar-injector is working
$ kubectl -n istio-system get deploy istio-sidecar-injector
NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
istio-sidecar-injector   1         1         1            1           4m

爲需要自動注入 sidecar 的 namespace 加上標籤 istio-injection=enabled:

# default namespace 沒有 istio-injection 標籤
$ kubectl get namespace -L istio-injection
NAME           STATUS        AGE       ISTIO-INJECTION
default        Active        1h
istio-system   Active        1h
kube-public    Active        1h
kube-system    Active        1h

# 打上 istio-injection=enabled 標籤
$ kubectl label namespace default istio-injection=enabled

這樣,在 default namespace 中創建 Pod 後自動添加 istio sidecar 容器。

參考文檔

:Lyft 開源的高性能代理,用於調解服務網格中所有服務的入站和出站流量。它支持動態服務發現、負載均衡、TLS 終止、HTTP/2 和 gPRC 代理、熔斷、健康檢查、故障注入和性能測量等豐富的功能。Envoy 以 sidecar 的方式部署在相關的服務的 Pod 中,從而無需重新構建或重寫代碼。

爲 Envoy sidecar 提供服務發現功能,爲智能路由(例如 A/B 測試、金絲雀部署等)和彈性(超時、重試、熔斷器等)提供流量管理功能。它將控制流量行爲的高級路由規則轉換爲特定於 Envoy 的配置,並在運行時將它們傳播到 sidecar。Pilot 將服務發現機制抽象爲符合 的標準格式,以便支持在多種環境下運行並保持流量管理的相同操作接口。

在數據平面上,除了 ,還可以選擇使用 、 等作爲網絡代理。比如,使用 nginxmesh 時,Istio 的控制平面(Pilot、Mixer、Auth)保持不變,但用 Nginx Sidecar 取代 Envoy:

Istio 的安裝部署步驟見 。

以下步驟假設命令行終端在 時下載的 istio-${ISTIO_VERSION} 目錄中。

Envoy
Pilot
Envoy 數據平面 API
Envoy
nginxmesh
linkerd
這裏
安裝部署
https://istio.io/
Istio - A modern service mesh
https://www.envoyproxy.io/
https://github.com/nginmesh/nginmesh
WHAT’S A SERVICE MESH? AND WHY DO I NEED ONE?
A SERVICE MESH FOR KUBERNETES
Service Mesh Pattern
Request Routing and Policy Management with the Istio Service Mesh