溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Istio 服務(wù)部署

發(fā)布時間:2020-06-10 16:31:34 來源:網(wǎng)絡(luò) 閱讀:2987 作者:酥心糖 欄目:云計算

此篇博文istio相關(guān)介紹和測試用例來源于網(wǎng)絡(luò),這里結(jié)合自己配置加以整理。

istio 介紹

官方中文參考文檔

官方英文參考文檔

服務(wù)網(wǎng)格(Service Mesh)這個術(shù)語通常用于描述構(gòu)成這些應(yīng)用程序的微服務(wù)網(wǎng)絡(luò)以及應(yīng)用之間的交互。隨著規(guī)模和復(fù)雜性的增長,服務(wù)網(wǎng)格越來越難以理解和管理。它的需求包括服務(wù)發(fā)現(xiàn)、負載均衡、故障恢復(fù)、指標收集和監(jiān)控以及通常更加復(fù)雜的運維需求,例如 A/B 測試、金絲雀發(fā)布、限流、訪問控制和端到端認證等。

Istio 提供了一個完整的解決方案,通過為整個服務(wù)網(wǎng)格提供行為洞察和操作控制來滿足微服務(wù)應(yīng)用程序的多樣化需求。

使用istio的目標

Istio 提供一種簡單的方式來為已部署的服務(wù)建立網(wǎng)絡(luò),該網(wǎng)絡(luò)具有負載均衡、服務(wù)間認證、監(jiān)控等功能,只需要對服務(wù)的代碼進行一點或不需要做任何改動。想要讓服務(wù)支持 Istio,只需要在您的環(huán)境中部署一個特殊的 sidecar 代理,使用 Istio 控制平面功能配置和管理代理,攔截微服務(wù)之間的所有網(wǎng)絡(luò)通信:

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

  • 通過豐富的路由規(guī)則、重試、故障轉(zhuǎn)移和故障注入,可以對流量行為進行細粒度控制。

  • 可插入的策略層和配置 API,支持訪問控制、速率限制和配額。

  • 對出入集群入口和出口中所有流量的自動度量指標、日志記錄和跟蹤。

  • 通過強大的基于身份的驗證和授權(quán),在集群中實現(xiàn)安全的服務(wù)間通信。

Istio 旨在實現(xiàn)可擴展性,滿足各種部署需求。

istio的核心功能

流量管理: 通過簡單的規(guī)則配置和流量路由,您可以控制服務(wù)之間的流量和 API 調(diào)用。
通信安全: Istio 的安全功能使開發(fā)人員可以專注于應(yīng)用程序級別的安全性。Istio 提供底層安全通信信道,并大規(guī)模管理服務(wù)通信的認證、授權(quán)和加密。
監(jiān)控功能: 通過 Istio 的監(jiān)控功能,可以真正了解服務(wù)性能如何影響上游和下游的功能,而其自定義儀表板可以提供對所有服務(wù)性能的可視性,并讓您了解該性能如何影響您的其他進程。
跨平臺: Istio 是獨立于平臺的,旨在運行在各種環(huán)境中,包括跨云、內(nèi)部部署、Kubernetes、Mesos 等。
集成和定制: 策略執(zhí)行組件可以擴展和定制,以便與現(xiàn)有的 ACL、日志、監(jiān)控、配額、審計等方案集成。

系統(tǒng)架構(gòu)

Istio 服務(wù)網(wǎng)格邏輯上分為數(shù)據(jù)平面和控制平面。

  • 數(shù)據(jù)平面由一組以 sidecar 方式部署的智能代理(Envoy)組成。這些代理可以調(diào)節(jié)和控制微服務(wù)及 Mixer 之間所有的網(wǎng)絡(luò)通信。

  • 控制平面負責管理和配置代理來路由流量。此外控制平面配置 Mixer 以實施策略和收集遙測數(shù)據(jù)。
    Istio 服務(wù)部署
組件介紹

Istio 使用 Envoy 代理的擴展版本,Envoy 是以 C++ 開發(fā)的高性能代理,用于調(diào)解服務(wù)網(wǎng)格中所有服務(wù)的所有入站和出站流量。Envoy 的許多內(nèi)置功能被 istio 發(fā)揚光大,例如:

  • 動態(tài)服務(wù)發(fā)現(xiàn)
  • 負載均衡
  • TLS 終止
  • HTTP/2 & gRPC 代理
  • 熔斷器
  • 健康檢查、基于百分比流量拆分的灰度發(fā)布
  • 故障注入
  • 豐富的度量指標

Envoy 被部署為 sidecar,和對應(yīng)服務(wù)在同一個 Kubernetes pod 中。

Mixer 是一個獨立于平臺的組件,負責在服務(wù)網(wǎng)格上執(zhí)行訪問控制和使用策略,并從 Envoy 代理和其他服務(wù)收集遙測數(shù)據(jù)。代理提取請求級屬性,發(fā)送到 Mixer 進行評估。

Pilot 為 Envoy sidecar 提供服務(wù)發(fā)現(xiàn)功能,為智能路由(例如 A/B 測試、金絲雀部署等)和彈性(超時、重試、熔斷器等)提供流量管理功能。它將控制流量行為的高級路由規(guī)則轉(zhuǎn)換為特定于 Envoy 的配置,并在運行時將它們傳播到 sidecar。

Citadel 通過內(nèi)置身份和憑證管理可以提供強大的服務(wù)間和最終用戶身份驗證??捎糜谏壏?wù)網(wǎng)格中未加密的流量,并為運維人員提供基于服務(wù)標識而不是網(wǎng)絡(luò)控制的強制執(zhí)行策略的能力。從 0.5 版本開始,Istio 支持基于角色的訪問控制,以控制誰可以訪問您的服務(wù)。

Galley 代表其他的 Istio 控制平面組件,用來驗證用戶編寫的 Istio API 配置。隨著時間的推移,Galley 將接管 Istio 獲取配置、 處理和分配組件的頂級責任。它將負責將其他的 Istio 組件與從底層平臺(例如 Kubernetes)獲取用戶配置的細節(jié)中隔離開來。

Istio 部署

提示:在Minikube中運行需要至少8G內(nèi)存和4核CPU。

參考文檔:https://thenewstack.io/tutorial-blue-green-deployments-with-kubernetes-and-istio

0. 確認K8S環(huán)境配置

如果要成功部署istio,需要給kube-apiserver添加MutatingAdmissionWebhook,ValidatingAdmissionWebhook的參數(shù),成功運行istio的kube-apiserver配置如下:

[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
ExecStart=/opt/kubernetes/bin/kube-apiserver \
  --enable-admission-plugins=MutatingAdmissionWebhook,ValidatingAdmissionWebhook,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \
  --bind-address=192.168.20.31 \
  --insecure-bind-address=127.0.0.1 \
  --authorization-mode=Node,RBAC \
  --runtime-config=rbac.authorization.k8s.io/v1 \
  --kubelet-https=true \
  --anonymous-auth=false \
  --basic-auth-file=/opt/kubernetes/ssl/basic-auth.csv \
  --enable-bootstrap-token-auth \
  --token-auth-file=/opt/kubernetes/ssl/bootstrap-token.csv \
  --service-cluster-ip-range=10.1.0.0/16 \
  --service-node-port-range=20000-40000 \
  --tls-cert-file=/opt/kubernetes/ssl/kubernetes.pem \
  --tls-private-key-file=/opt/kubernetes/ssl/kubernetes-key.pem \
  --client-ca-file=/opt/kubernetes/ssl/ca.pem \
  --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \
  --requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \
  --requestheader-allowed-names= \
  --requestheader-extra-headers-prefix="X-Remote-Extra-" \
  --requestheader-group-headers=X-Remote-Group \
  --requestheader-username-headers=X-Remote-User \
  --proxy-client-cert-file=/opt/kubernetes/ssl/metrics-server.pem \
  --proxy-client-key-file=/opt/kubernetes/ssl/metrics-server-key.pem \
  --enable-aggregator-routing=true \
  --runtime-config=api/all=true  \
  --etcd-servers=http://192.168.20.31:2379,http://192.168.20.32:2379,http://192.168.20.33:2379 \
  --enable-swagger-ui=true \
  --allow-privileged=true \
  --audit-log-maxage=30 \
  --audit-log-maxbackup=3 \
  --audit-log-maxsize=100 \
  --audit-log-path=/opt/kubernetes/log/api-audit.log \
  --event-ttl=1h \
  --v=2 \
  --logtostderr=false \
  --log-dir=/opt/kubernetes/log
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

確認Metrics Server成功安裝,并正常運行:

# kubectl  get apiservices |grep metrics-server
v1beta1.metrics.k8s.io                  kube-system/metrics-server   True        5d

# kubectl get apiservices v1beta1.metrics.k8s.io -o yaml

apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  creationTimestamp: 2018-11-07T06:23:17Z
  name: v1beta1.metrics.k8s.io
  resourceVersion: "747856"
  selfLink: /apis/apiregistration.k8s.io/v1/apiservices/v1beta1.metrics.k8s.io
  uid: 9d638462-e255-11e8-a817-000c29550ccc
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100
status:
  conditions:
  - lastTransitionTime: 2018-11-12T09:21:46Z
    message: all checks passed
    reason: Passed
    status: "True"
    type: Available

# kubectl  top node                 # k8s 1.12版本默認會使用metrics api
NAME            CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
192.168.20.32   580m         28%    2263Mi          61%       
192.168.20.33   381m         19%    2317Mi          63% 
1.下載istio

執(zhí)行如下命令,會下載安裝包并自動解壓縮:

curl -L https://git.io/getLatestIstio | sh -

進入 Istio 包目錄。例如,假設(shè)這個包是 istio-1.1.0.0:

cd istio-1.1.0

安裝目錄中包含:

  • 在 install/ 目錄中包含了 Kubernetes 安裝所需的 .yaml 文件
  • samples/ 目錄中是示例應(yīng)用
  • istioctl 客戶端文件保存在 bin/ 目錄之中。istioctl 的功能是手工進行 Envoy Sidecar 的注入,以及對路由規(guī)則、策略的管理
  • istio.VERSION 配置文件

添加bin目錄到系統(tǒng)的環(huán)境變量,或者將bin/istioctl文件拷貝到/usr/bin ,這樣在使用istioctl命令時就更加方便了:

export PATH=$PWD/bin:$PATH
2. 安裝istio

安裝istio的自定義資源(CRD):

kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml

由于是在沒有Rancher和云供應(yīng)商的環(huán)境中安裝istio,沒有LoadBalancer的支持,所以我們需要將istio-1.0.3/install/kubernetes/istio-demo.yam 中的LoadBalancer關(guān)鍵字修改為 NodePort:

apiVersion: v1
kind: Service
metadata:
  name: istio-ingressgateway
  namespace: istio-system
  annotations:
  labels:
    chart: gateways-1.0.3
    release: istio
    heritage: Tiller
    app: istio-ingressgateway
    istio: ingressgateway
spec:
  type: LoadBalancer                # 將此處的LoadBalancer 修改為 NodePort
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
  ports:
    -
      name: http2
      nodePort: 31380
      port: 80
      targetPort: 80
    -
      name: https
      nodePort: 31390
      port: 443

用如下命令安裝不啟用 Sidecar 間雙向 TLS 認證的 Istio:

kubectl apply -f install/kubernetes/istio-demo.yaml

執(zhí)行這個文件之后,我們會發(fā)現(xiàn)已經(jīng)安裝了多個服務(wù)和pod,并且創(chuàng)建了istio-system的命名空間:

[root@k8s-node-1 ~]# kubectl  get pod -n istio-system
NAME                                     READY   STATUS      RESTARTS   AGE
grafana-546d9997bb-2z8nj                 1/1     Running     0          4h5m
istio-citadel-6955bc9cb7-b4jm4           1/1     Running     0          4h5m
istio-cleanup-secrets-9rm4c              0/1     Completed   0          4h5m
istio-egressgateway-7dc5cbbc56-gccmr     1/1     Running     0          4h5m
istio-galley-545b6b8f5b-pwckj            1/1     Running     0          3h8m
istio-grafana-post-install-stm7q         0/1     Completed   0          4h5m
istio-ingressgateway-7958d776b5-kf4xf    1/1     Running     0          4h5m
istio-pilot-567dd97ddc-mnmhg             2/2     Running     0          4h5m
istio-policy-5c689f446f-82lbn            2/2     Running     0          4h5m
istio-policy-5c689f446f-jl4lh            2/2     Running     1          102m
istio-policy-5c689f446f-s4924            2/2     Running     0          3m14s
istio-security-post-install-cgqtr        0/1     Completed   0          4h5m
istio-sidecar-injector-99b476b7b-4twb2   1/1     Running     0          4h5m
istio-telemetry-55d68b5dfb-ftlbl         2/2     Running     0          4h5m
istio-telemetry-55d68b5dfb-l8xk6         2/2     Running     0          3h7m
istio-telemetry-55d68b5dfb-t5kdz         2/2     Running     1          3h8m
istio-telemetry-55d68b5dfb-zgljm         2/2     Running     0          3h8m
istio-telemetry-55d68b5dfb-zxg7q         2/2     Running     1          3h8m
istio-tracing-6445d6dbbf-92876           1/1     Running     0          4h5m
prometheus-65d6f6b6c-bpk8q               1/1     Running     1          4h5m
servicegraph-57c8cbc56f-f92rs            1/1     Running     17         4h5m

[root@k8s-node-1 ~]# kubectl  get svc -n istio-system
NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                                                                                   AGE
grafana                  NodePort    10.1.157.231   <none>        3000:28271/TCP                                                                                                            4h7m
istio-citadel            ClusterIP   10.1.103.109   <none>        8060/TCP,9093/TCP                                                                                                         4h7m
istio-egressgateway      ClusterIP   10.1.171.122   <none>        80/TCP,443/TCP                                                                                                            4h7m
istio-galley             ClusterIP   10.1.60.32     <none>        443/TCP,9093/TCP                                                                                                          4h7m
istio-ingressgateway     NodePort    10.1.105.144   <none>        80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:39182/TCP,8060:21878/TCP,853:35905/TCP,15030:22762/TCP,15031:20989/TCP   4h7m
istio-pilot              ClusterIP   10.1.28.6      <none>        15010/TCP,15011/TCP,8080/TCP,9093/TCP                                                                                     4h7m
istio-policy             ClusterIP   10.1.208.196   <none>        9091/TCP,15004/TCP,9093/TCP                                                                                               4h7m
istio-sidecar-injector   ClusterIP   10.1.31.204    <none>        443/TCP                                                                                                                   4h7m
istio-telemetry          ClusterIP   10.1.178.158   <none>        9091/TCP,15004/TCP,9093/TCP,42422/TCP                                                                                     4h7m
jaeger-agent             ClusterIP   None           <none>        5775/UDP,6831/UDP,6832/UDP                                                                                                4h7m
jaeger-collector         ClusterIP   10.1.63.111    <none>        14267/TCP,14268/TCP                                                                                                       4h7m
jaeger-query             ClusterIP   10.1.235.64    <none>        16686/TCP                                                                                                                 4h7m
prometheus               NodePort    10.1.235.55    <none>        9090:28729/TCP                                                                                                            4h7m
servicegraph             ClusterIP   10.1.30.255    <none>        8088/TCP                                                                                                                  4h7m
tracing                  ClusterIP   10.1.114.120   <none>        80/TCP                                                                                                                    4h7m
zipkin                   ClusterIP   10.1.212.242   <none>        9411/TCP                                                                                                                  4h7m
3.標記命名空間

為了對k8s中的各個命名空間進行監(jiān)控和流量處理,需要對每個命名空間進行 Envoy 容器注入(確認Istio-sidecar-injector正常啟動):

 kubectl label namespace <namespace> istio-injection=enabled

 EG:

 kubectl label namespace default istio-injection=enabled

如果要取消標記,使用如下命令:

 kubectl label namespace default istio-injection-

理解原理:
istio提供了缺省的配置,會在帶有istio-injection=enabled標簽的命名空間中選擇pod,添加一個istio-proxy的容器,使用如下命令可以編輯目標命名空間的范圍:

kubectl edit mutatingwebhookconfiguration istio-sidecar-injector

istio-system 命名空間中的 ConfigMap istio-sidecar-injector 中包含了缺省的注入策略以及 Sidecar 的注入模板。

有兩種注入策略:
disabled: Sidecar 注入器缺省不會向 Pod 進行注入。在 Pod 模板中加入 sidecar.istio.io/inject 注解并賦值為 true 才能啟用注入。
enabled: Sidecar 注入器缺省會對 Pod 進行注入。在 Pod 模板中加入 sidecar.istio.io/inject 注解并賦值為 false 就會阻止對這一 Pod 的注入

4.查看相關(guān)服務(wù)

這里使用jsonpath工具查看istio-ingressgateway的外部服務(wù)端口:

kubectl  -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}'

查看grafana的外部映射端口,此端口上的服務(wù)展示了當前集群的監(jiān)控數(shù)據(jù):

 kubectl  -n istio-system get service grafana -o jsonpath='{.spec.ports[?(@.name=="http")].nodePort}'

查看prometheus服務(wù)的端口:

 kubectl  -n istio-system get service prometheus -o yaml|grep nodePort

所有有UI界面的外部端口都可以通過瀏覽器采用 ip:端口 的方式正常訪問。

如果在默認的grafana模板中,沒有正常的展示出數(shù)據(jù),可以查看各個節(jié)點的時鐘是否同步,通過在查看網(wǎng)頁URL的請求在prometheus執(zhí)行,看是否能得到數(shù)據(jù)。

可以按照官方提供的bookinfo示例對istio進行測試:https://istio.io/docs/examples/bookinfo/

采用分流方式部署一個應(yīng)用的兩個版本

創(chuàng)建服務(wù)應(yīng)用

這里使用一個示例文件,部署兩個不同版本的nginx服務(wù),對這兩個版本分流。創(chuàng)建myapp.yaml:

apiVersion: v1
kind: Service
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  type: ClusterIP
  ports:
  - port: 80
    name: http
  selector:
    app: myapp
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myapp-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp
        version: v1
    spec:
      containers:
      - name: myapp
        image: janakiramm/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myapp-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp
        version: v2
    spec:
      containers:
      - name: myapp
        image: janakiramm/myapp:v2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

這個文件中,構(gòu)建了簡單的基于Nginx的Docker鏡像來作為應(yīng)用案例:janakiramm/myapp:v1和janakiramm/myapp:v2。部署完成之后,這兩個版本的Nginx會分別顯示藍色或者綠色背景的靜態(tài)頁面。

執(zhí)行:

kubectl apply -f myapp.yaml

成功創(chuàng)建后,使用port-forward 命令映射出本地端口,測試是否能成功訪問:

kubectl port-forward deployment/myapp-v1  8081:80

curl 127.0.0.1:8081
創(chuàng)建網(wǎng)關(guān)

這里分別創(chuàng)建了網(wǎng)關(guān)(Gateway)、目的地規(guī)則(DestinationRule)、虛擬服務(wù)(VirtualService)到app-gateway.yaml文件中:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: app-gateway
spec:
  selector:
    istio: ingressgateway 
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: myapp
spec:
  host: myapp
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---      
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp
spec:
  hosts:
  - "*"
  gateways:
  - app-gateway
  http:
    - route:
      - destination:
          host: myapp
          subset: v1
        weight: 50
      - destination:
          host: myapp
          subset: v2
        weight: 50        
---
  • Istio網(wǎng)關(guān)描述了在網(wǎng)格邊界的負載均衡器如何處理進出的HTTP/TCP連接。著重描述了哪些端口應(yīng)該被暴露出來,有哪些協(xié)議可以用,負載均衡器的SNI配置等。這里默認指向了Ingress網(wǎng)關(guān)。
  • Istio目的地規(guī)則定義了流量被路由以后訪問服務(wù)的規(guī)則。
  • 虛擬服務(wù)定義了當主機獲得地址以后一系列流量的路由規(guī)則。每一條路由規(guī)則都定義了某個基于特定協(xié)議的流量的匹配規(guī)則。當一個流量被匹配了,基于版本,它會被發(fā)送到相關(guān)的目標服務(wù)。

執(zhí)行:

kubectl apply -f app-gateway.yaml

可以通過istio-ingressgateway的端口來查看此服務(wù):

kubectl  -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}'

通過訪問此端口可以直接訪問到應(yīng)用服務(wù),可以發(fā)現(xiàn)當我們不斷請求時,會根據(jù)之前設(shè)置的權(quán)重對v1和v2進行輪詢。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI