我在将Istio引入GKE时所做的事情
- 2020年1月時点での事例のため情報が古い箇所がありますが随時更新していきます。
微服务架构是什么意思?
把应用程序分割为适当的大小,以避免像单片式架构(巨大的代码库)那样一个代码对多个环境产生影响。
优点
-
- 適切なサイズのコードベースで開発できる
-
- チームを適切なサイズに保つことができる
- 特定のコードベースに所属しない(フレームワーク)
缺点
- パフォーマンスの低下
微服务的挑战
解决依赖关系
需要正确实施负载均衡
通讯可观测性
需要考虑一项服务中发生故障会造成多大的影响。
需要观察服务之间的通信是否正常进行,以及服务之间的通信达到了何种程度。
验证和授权
在協調多個服務的實施時,有時需要限制連接到特定服務的服務,或者限制呼叫特定API的權限。因此,每個微服務之間以及與外部服務的協作一樣,都需要正確地執行加密鍵和權限管理等措施。
障害的分隔
由于微服务之间的通信比进程之间的通信更容易失败,因此需要正确设置重试次数、超时设置和重试上限。
服务网格是什么。
为了应对微服务架构所带来的挑战,采用设计模式。
将服务代理部署为每个微服务的边车。
将服务代理部署为边车的原因是它不受开发语言的限制,且应用程序无需编写重试处理或熔断器代码,也无需负担维护成本。
所有服务之间的通信经过数据平面,即服务代理进行。
可以做的事情 zuò de
-
- リトライ、 タイムアウトなどの通信の障害への対策
- 分散トレーシングによるネットワークレベルの情報収集、サービス監視、ログ収集
做不到的事情 (Unable to do)
-
- ネットワーク以外の対応
- サービスのロールバック
数据平面
在服务网格中,实际上执行通信控制的组件,类似于Envoy等服务代理
控制平面
用于输出和控制数据平面的组件,该组件用于输出用于数据平面的配置并控制数据平面的行为。
数据平面会定期或实时向控制平面提出查询,如果有更改,则会进行配置更改。
可以同时更新多个数据平面的配置。
Istio -> Istio 工具
服务网格的事实标准控制面板
主要功能 (zhǔ
-
- ネットワークトラフィックの管理
-
- セキュリティ
-
- 監視とロギング
- OpenTracing
建筑设计
控制平面
-
- Pilot
-
- Mixer
-
- Galley
- Citadel
飞行员
-
- トラフィックの送信先のサービスディスカバリ
-
- トラフィックに関する機能
-
- Blue/Green, Canary
-
- タイムアウト、リトライの制御
- istio-proxy に設定情報を提供
搅拌机
-
- データプレーンにあるメトリクスやログを収集し Stackdriver, Prometheus に送信
-
- サービスが別のサービスに対して通信する際のアクセスコントロール(認証、認可、レート制限)
- トラフィック後に Envoy から送られてきたテレメトリを受信
堡垒
-
- 認証局
-
- セキュリティ
-
- rbac 設定
- kubernetes のアクセス制御と連携
餐厅
- istio に対する管理操作を受け付けを行いバリデーション
政策
侧车注入器
- Deployment に istio-proxy を追加
数据平面
扩展了Envoy代理的服务代理istio-proxy来管理流量。
GKE 上与 istio 相关的工作负载
$ kubectl get deploy -n istio-system
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE
grafana 1 1 1 1
istio-citadel 1 1 1 1
istio-galley 1 1 1 1
istio-pilot 1 1 1 1
istio-policy 1 1 1 1
istio-sidecar-injector 1 1 1 1
istio-telemetry 1 1 1 1
kiali 1 1 1 1
prometheus 1 1 1 1
使者
常用于服务代理、Istio等的典型数据平面是通过数据平面API从控制平面加载配置信息,并使用gRPC与xds API进行交互。
-
- 様々なプロトコルのサポート
http/2
gRPC
高度なロードバランシング
パッシブヘルスチェック
リクエストのリトライ、タイムアウト、レートリミット
サーキットブレーカー
可観測性
リクエストの流量や回数
タイムアウトやリトライ、サーキットブレーカが発動した回数
動的な設定の変更
オンラインで設定の更新
Envoy的配置是靜態的。
static_resources:
listeners:
- name: listener_0
address:
socket_address:
- address: 0.0.0.0
- port_value: 80
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
route_config:
name: route
virtual_hosts:
- name: backend
domains:
- "*"
routes:
- match:
prefix: "/"
route:
cluster: service1
clusters:
- name: service1
load_assignment:
cluster_name: service1
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
- address: sevice1.example.com
- port_value: 80
使用Envoy的控制平面设置
EDS可以用中文翻译为“企业数据管理系统”。
clusters:
- name: service1
type: EDS
eds_cluster_config:
eds_config:
api_config_source:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: xds_cluster
- name: xds_cluster
cluster_name: xds_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
- address: 127.0.0.1
- port_value: 20000
xDS应用程序接口
使者从控制平面获取配置的API
在API模式中使用Protobuf,在端点上使用gRPC(双向流)或REST。
提供了动态获取 envoy 配置的服务。
-
- Endpoint Discovery Service (EDS)
-
- Cluster Discovery Service (CDS)
-
- Route Discovery Service (RDS)
-
- Listener Discovery Service (LDS)
-
- Health Discovery Service (HDS)
-
- Aggregated Discovery Service (ADS)
- Secret Discovery Service (SDS)
通过命令行界面将GKE引入
构成的例子
# Gateways Configuration, refer to the charts/gateways/values.yaml
# for detailed configuration
#
gateways:
enabled: false
# sidecar-injector webhook configuration, refer to the
# charts/sidecarInjectorWebhook/values.yaml for detailed configuration
#
sidecarInjectorWebhook:
enabled: true
# galley configuration, refer to charts/galley/values.yaml
# for detailed configuration
#
galley:
enabled: true
# mixer configuration
#
# @see charts/mixer/values.yaml for all values
mixer:
policy:
# if policy is enabled the global.disablePolicyChecks has affect.
enabled: true
telemetry:
enabled: true
#
# pilot configuration
#
# @see charts/pilot/values.yaml
pilot:
enabled: true
# security configuration
#
security:
enabled: true
# nodeagent configuration
#
nodeagent:
enabled: false
# addon grafana configuration
#
grafana:
enabled: true
security:
enabled: true
# addon prometheus configuration
#
prometheus:
enabled: true
# addon jaeger tracing configuration
#
tracing:
enabled: false
# addon kiali tracing configuration
#
kiali:
enabled: true
# addon certmanager configuration
#
certmanager:
enabled: false
进行步骤
$ curl -L https://git.io/getLatestIstio | sh -
$ cd istio-LATEST-VERSION
$ kubectl create namespace istio-system
$ helm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system | kubectl apply -f -
$ PASSWORD=$(head -c 12 /dev/urandom | shasum| cut -d' ' -f1)
$ kubectl -n istio-system create secret generic grafana --from-literal=username=admin --from-literal=passphrase="$PASSWORD"
パスワードの確認
$ kubectl get secret -n istio-system grafana -o jsonpath="{.data.passphrase}" | base64 --decode ; echo
$ helm template --namespace istio-system install/kubernetes/helm/istio > istio.yaml
$ KIALI_USERNAME=$(read '?Kiali Username: ' uval && echo -n $uval | base64)
$ KIALI_PASSPHRASE=$(read -s "?Kiali Passphrase: " pval && echo -n $pval | base64)
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: kiali
namespace: $NAMESPACE
labels:
app: kiali
type: Opaque
data:
username: $KIALI_USERNAME
passphrase: $KIALI_PASSPHRASE
EOF
$ kubectl patch svc kiali -n istio-system -p '{"spec": {"type": "LoadBalancer"}}'
$ kubectl patch svc grafana -n istio-system -p '{"spec": {"type": "LoadBalancer"}}'
Istio通过流量控制。
-
- VirtualService
-
- ServiceEntry
-
- DestinationRule
- Sidecar
虚拟服务
重试和超时设置
服务入口
请求对于位于集群外的 API 进行设置的配置信息。
目的地规则
设置流量到达Pod之前的行为
断路器、负载均衡、连接池
摩托侧车
特定的 Envoy 的配置
启用Sidecar注入
当Pod启动时,自动注入Sidecar。
有効化
$ kubectl label namespace {YOUR_NAMESPACE} istio-injection=enabled
無効化
$ kubectl label namespace {YOUR_NAMESPACE} istio-injection-
設定の確認
$ kubectl get namespaces -L istio-injection
以下是一个例子的宣言。
重新尝试,超时
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: virtual-svc
spec:
hosts:
- service-a
http:
- route:
- destination:
host: service-a
retries:
attempts: 5
perTryTimeout: 2s
retryOn: 5xx
timeout: 120s
故障注入 .
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: virtual-svc
spec:
hosts:
- service-a
http:
- route:
- destination:
host: service-a
fault:
delay:
percent: 50
fixedDelay: 5s
熔断器
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: circuit-breaker
spec:
host: service-c
subsets:
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http2MaxRequests: 1024
maxRequestsPerConnection: 10
outlierDetection:
consecutiveErrors: 7
interval: 5m
baseEjectionTime: 3m
maxEjectionPercent: 100