我在将Istio引入GKE时所做的事情

    2020年1月時点での事例のため情報が古い箇所がありますが随時更新していきます。

微服务架构是什么意思?

把应用程序分割为适当的大小,以避免像单片式架构(巨大的代码库)那样一个代码对多个环境产生影响。

优点

    • 適切なサイズのコードベースで開発できる

 

    • チームを適切なサイズに保つことができる

 

    特定のコードベースに所属しない(フレームワーク)

缺点

    パフォーマンスの低下

微服务的挑战

解决依赖关系

需要正确实施负载均衡

通讯可观测性

需要考虑一项服务中发生故障会造成多大的影响。
需要观察服务之间的通信是否正常进行,以及服务之间的通信达到了何种程度。

验证和授权

在協調多個服務的實施時,有時需要限制連接到特定服務的服務,或者限制呼叫特定API的權限。因此,每個微服務之間以及與外部服務的協作一樣,都需要正確地執行加密鍵和權限管理等措施。

障害的分隔

由于微服务之间的通信比进程之间的通信更容易失败,因此需要正确设置重试次数、超时设置和重试上限。

服务网格是什么。

为了应对微服务架构所带来的挑战,采用设计模式。
将服务代理部署为每个微服务的边车。
将服务代理部署为边车的原因是它不受开发语言的限制,且应用程序无需编写重试处理或熔断器代码,也无需负担维护成本。
所有服务之间的通信经过数据平面,即服务代理进行。

可以做的事情 zuò de

    • リトライ、 タイムアウトなどの通信の障害への対策

 

    分散トレーシングによるネットワークレベルの情報収集、サービス監視、ログ収集

做不到的事情 (Unable to do)

    • ネットワーク以外の対応

 

    サービスのロールバック

数据平面

在服务网格中,实际上执行通信控制的组件,类似于Envoy等服务代理

控制平面

用于输出和控制数据平面的组件,该组件用于输出用于数据平面的配置并控制数据平面的行为。
数据平面会定期或实时向控制平面提出查询,如果有更改,则会进行配置更改。
可以同时更新多个数据平面的配置。

Istio -> Istio 工具

服务网格的事实标准控制面板

主要功能 (zhǔ

    • ネットワークトラフィックの管理

 

    • セキュリティ

 

    • 監視とロギング

 

    OpenTracing

建筑设计

スクリーンショット 2020-01-29 11.21.07.jpg

控制平面

    • 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
スクリーンショット 2020-01-21 14.49.43.jpg

虚拟服务

重试和超时设置

服务入口

请求对于位于集群外的 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     
Destination Rule役割spec.trafficPolicy.connectionPool.tcpTCPのコネクションプールmaxConnectionsHTTP/TCPの最大コネクション数connectTimeoutTCPのタイムアウトtcpKeepaliveソケットにkeepaliveを適用するかspec.trafficPolicy.connectionPool.httpHTTPのコネクションプールhttp1MaxRequests保留するリクエスト最大数http2MaxRequestsバックエンドへの要求最大数maxRequestsPerConnectionバックエンドに対するコネクションごとのリクエストの最大数maxRetriesリトライの最大数spec.trafficPolicy.outlinerDetection異常値の閾値とその時の挙動を定義consecutiveErrors継続した障害だと判定される閾値Interval解析を行う間隔baseEjectionTimeconsecutiveErrorsの上限を越したときに、ホストが即時エラーを返す最小期間
广告
将在 10 秒后关闭
bannerAds