【 Kubernetes 風云錄 】- Istio 應用多版本流量控制

目的: 根據不同的引擎版本,可以把請求發送到指定的引擎上。可以實現版本降級。

原理

Istio通過VirtualService和DestinationRule兩個資源對象來實現流量管理,其中VirtualService用于定義流量路由規則,而DestinationRule用于定義服務的負載均衡策略和TLS設置

  • VirtualService: 實現服務請求路由規則的動能
  • DestinationRule: 實現?標服務的負載均衡、服務發現、故障處理和故障注?的功能
  • Gateway: 讓服務?格內的服務,可以被全世界看到
  • ServiceEntry: 讓服務?格內的服務,可以看到外?的世界

實現

Deployment

{{- $revisionHistoryLimit := .Values.revisionHistoryLimit -}}
{{- $replicaCount := .Values.replicaCount -}}
{{- $autoscaling := .Values.autoscaling.enabled -}}
{{- $podAnnotations := .Values.podAnnotations -}}
{{- $imagePullSecrets := .Values.imagePullSecrets -}}
{{- $podSecurityContext := .Values.podSecurityContext -}}
{{- $securityContext := .Values.securityContext -}}
{{- $pullPolicy := .Values.pullPolicy -}}
{{- $port := .Values.service.port -}}
{{- $resources := .Values.resources -}}
{{- $nodeSelector := .Values.nodeSelector -}}
{{- $repository := .Values.image.repository -}}
{{- $affinity := .Values.affinity -}}
{{- $tolerations := .Values.tolerations -}}
{{- range $num,$tag := .Values.image.tag -}}
{{- $version := add $num 1 -}}
apiVersion: apps/v1
kind: Deployment
metadata:name: {{ include "grpc-manifest.fullname" $  }}-v{{ $version }}labels:{{- include "grpc-manifest.labels" $ | nindent 4 }}app.kubernetes.io/tag: v{{ $version }}app.kubernetes.io/type: grpc
spec:revisionHistoryLimit: {{ $revisionHistoryLimit | default 5 }}{{- if not $autoscaling }}replicas: {{ $replicaCount }}{{- end }}selector:matchLabels:{{- include "grpc-manifest.selectorLabels" $ | nindent 6 }}app.kubernetes.io/tag: v{{ $version }}app.kubernetes.io/type: grpc...{{end }}

作用:可以根據版本生成對應的服務

VirtualService

{{- define "grpc-manifest.gateway" -}}
{{- $port := .Values.services.port }}
{{- range $num,$image := .Values.image.tag }}
{{- $version := add $num 1 }}- match:- headers:grpcsvc:exact: v{{ $version }}route:- destination:host: {{ include "grpc-manifest.fullname" $ }}port:number: {{ $port }}subset: v{{ $version }}
{{- end }}
{{- end }}

例子中,虛擬服務將流量分發服務的兩個子集:v$version。也可設置權重默認是 100,表示 攜帶 header為grpcsvc: v$version 的流量將全量被路由到 v$version

DestinationRule

目標規則定義了如何將請求路由到實際的服務實例。每個目標規則關聯到一個虛擬服務的子集

{{- define "grpc-manifest.route" -}}
{{- range $num,$image := .Values.image.tag }}
{{- $version := add $num 1 }}- name: v{{ $version }}labels:app.kubernetes.io/instance:  {{ include "grpc-manifest.fullname" $ }}app.kubernetes.io/tag: v{{ $version }}
{{- end }}
{{- end }}

例子中,目標規則將子集 v$version 分別映射到具有相應標簽的實際服務實例。

需要多個版本同時部署時,會根據鏡像自動更新資源配置

[root@ycloud grpc-manifest]# cat env/devel/image_tag.yaml 
image:tag:- v1.0.1- v1.0.2- v1.0.3- v1.0.4

約束

根據定義好的行為實現

訪問通過添加metadata的方式來選擇指定的版本,并且如果訪問中 metadata 指定有誤要做降級策略,給默認且可正常運行的版本

eg: (案例僅限測試,生產根據實際需求更新)

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:name:  {{ include "grpc-manifest.fullname" . }}
spec:workloadSelector:labels:app: istio-ingressgatewayconfigPatches:- applyTo: HTTP_FILTERmatch:context: GATEWAYlistener:filterChain:filter:name: "envoy.filters.network.http_connection_manager"subFilter:name: "envoy.filters.http.router"patch:operation: INSERT_BEFOREvalue:name: envoy.filters.http.luatyped_config:"@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"inlineCode: |function envoy_on_request(request_handle)local contentType = request_handle:headers():get("content-type")if contentType and string.find(contentType, "grpc") thenlocal grpcSvcHeader = request_handle:headers():get("grpcsvc")local allowedVersions = {"v1", "v2", "v3", "v4"}local isInAllowedVersions = falsefor _, allowedVersion in ipairs(allowedVersions) doif grpcSvcHeader == allowedVersion thenisInAllowedVersions = truebreakendendif not isInAllowedVersions thenrequest_handle:headers():replace("grpcsvc", "v1")endendend

部署

待實現 自動部署和之前服務有出入,需要針對這個服務做調整,主要判斷,通過版本引擎來自動更新舊版本

具體 Helm 案例屆時會更新到 GitHub

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167948.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167948.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167948.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode Hot100 98.驗證二叉搜索樹

題目: 給你一個二叉樹的根節點 root ,判斷其是否是一個有效的二叉搜索樹。 有效 二叉搜索樹定義如下: 節點的左子樹只包含 小于 當前節點的數。節點的右子樹只包含 大于 當前節點的數。所有左子樹和右子樹自身必須也是二叉搜索樹。 方法一…

electron windows robotjs 安裝教程

Robotjs 安裝 前言第一步 : 安裝python第二步 : 安裝Visual Studio 2022第三步 : 安裝robotjs 前言 robotjs可以控制鼠標鍵盤,獲取屏幕內容,配合electron可做很多自動化操作。windows下配置環境有很多坑,很多文章都太舊了。試了很多次發現了…

ky10 server x86 auditd安裝(日志審計系統)

概述 Auditd工具可以幫助運維人員審計Linux,分析發生在系統中的發生的事情。Linux 內核有用日志記錄事件的能力,包括記錄系統調用和文件訪問。管理員可以檢查這些日志,確定是否存在安全漏洞(如多次失敗的登錄嘗試,或者…

golang學習筆記——接口和繼承比較2

接口和繼承 現在有一個需要要求大學生和足球運動員掌握英語技能,請問怎么實現? 給運動員和學生結構體添加studyEnglish方法顯示是可以的,但是籃球動員和中學生也學習了英語,顯示不行。這時,我們可以直接給足球運動員和大學生添加…

跳轉應用市場詳情頁market

關于作者:CSDN內容合伙人、技術專家, 從零開始做日活千萬級APP。 專注于分享各領域原創系列文章 ,擅長java后端、移動開發、商業變現、人工智能等,希望大家多多支持。 未經允許不得轉載 目錄 一、導讀二、概覽三、跳轉到各大廠商應…

播放器開發(四):多線程解復用與解碼模塊實現

學習課題:逐步構建開發播放器【QT5 FFmpeg6 SDL2】 前言 根據第一章內容,我們首先可以先把解復用和解碼模塊完成,其中需要使用到多線程以及隊列,還需要使用FFmpeg進行解復用和解碼動作的實現。 創建BaseQueue基類 BaseQueue.h…

亞馬遜兩步驗證有哪些驗證方法?

亞馬遜通常提供多種兩步驗證的方式,包括短信(通過手機接收驗證碼)和認證器應用程序(如Google Authenticator、Authy等)。選擇你偏好的方式。 短信驗證: 如果選擇短信驗證,需要將你的手機號碼關聯…

YOLOv8改進 | 2023 | LSKAttention大核注意力機制助力極限漲點

論文地址:官方論文地址 代碼地址:官方代碼地址 一、本文介紹 在這篇文章中,我們將講解如何將LSKAttention大核注意力機制應用于YOLOv8,以實現顯著的性能提升。首先,我們介紹LSKAttention機制的基本原理,…

loginctl - 控制 systemd 登錄管理器

loginctl loginctl用途loginctl安裝開啟loginctl服務session操作user操作管理用戶服務 loginctl - Control the systemd login manager Redhat/centos平臺使用loginctl管理登錄用戶與session loginctl用途 控制 systemd 登錄管理器管理當前登錄的用戶和session loginctl安裝…

Peter算法小課堂—高精度加法

指針與數組 看看以下代碼&#xff0c;請預測答案 #include <bits/stdc.h> using namespace std; int x[10]{0,1,2,3,4,5,6,7,8,9}; int main(){cout<<x<<endl;cout<<x3<<endl;cout<<*x<<endl;cout<<*(x7)<<endl;cout&…

定制手機套餐---python序列

if __name__ __main__:print("定制手機套餐")print("")#定義電話時長&#xff1a;字典callTimeOptions{1:0分鐘,2:50分鐘,3:100分鐘,4:300分鐘,5:不限量}keyinput("請輸入電話時長的選擇編號&#xff1a;")valuecallTimeOptions.get(key)if val…

代碼隨想錄算法訓練營第五十四天|392.判斷子序列 115.不同的子序列

文檔講解&#xff1a;代碼隨想錄 視頻講解&#xff1a;代碼隨想錄B站賬號 狀態&#xff1a;看了視頻題解和文章解析后做出來了 392.判斷子序列 class Solution:def isSubsequence(self, s: str, t: str) -> bool:dp [[0] * (len(t)1) for _ in range(len(s)1)]for i in ra…

Java 關于批量插入遇到的問題 -sqlserver

序言&#xff1a; 我們在做項目的時候&#xff0c;經常會遇到&#xff0c;對數據的新增動作&#xff0c;如果數據量很少的情況下&#xff0c;單個新增對性能還好&#xff0c;但是一旦涉及到 大數據量&#xff0c;如十萬&#xff0c;百萬&#xff0c;千萬&#xff0c;這個時候如…

RabbitMq使用與整合

MQ基本概念 MQ概述 MQ全稱 Message Queue&#xff08;[kju?]&#xff09;&#xff08;消息隊列&#xff09;&#xff0c;是在消息的傳輸過程中保存消息的容器。多用于分布式系統之間進行通信。 &#xff08;隊列是一種容器&#xff0c;用于存放數據的都是容器&#xff0c;存…

優秀的時間追蹤軟件Timemator for Mac輕松管理時間!

在現代社會&#xff0c;時間管理成為了我們工作和生活中的一大挑戰。如果你經常感到時間不夠用&#xff0c;無法高效地完成任務&#xff0c;那么Timemator for Mac將成為你的得力助手。 Timemator for Mac是一款出色的時間追蹤軟件&#xff0c;它可以幫助你精確記錄和管理你的…

Linux的基本指令 ( 一 )

目錄 前言 Linux基本指令 快速認識五個指令 ls指令 補充內容 pwd指令 補充內容 cd指令 補充內容 重新認識指令 指令的本質 which指令 alias指令 最后 一個文件的三種時間 tree指令及安裝 tree指令 前言 關于Linux操作系統的桌面&#xff0c;在學校教學中我們…

實用高效 無人機光伏巡檢系統助力電站可持續發展

近年來&#xff0c;我國光伏發電行業規模日益壯大&#xff0c;全球領先地位愈發鞏固。為解決光伏電站運維中的難題&#xff0c;浙江某光伏電站與復亞智能達成戰略合作&#xff0c;共同推出全自動無人機光伏巡檢系統&#xff0c;旨在提高發電效率、降低運維成本&#xff0c;最大…

Spark---SparkCore(一)

一、術語與寬窄依賴 1、術語解釋 1、Master(standalone):資源管理的主節點&#xff08;進程&#xff09; 2、Cluster Manager:在集群上獲取資源的外部服務(例如&#xff1a;standalone,Mesos,Yarn) 3、Worker Node(standalone):資源管理的從節點(進程)或者說管理本機資源的…

用Python寫一個瀏覽器集群框架

更多Python學習內容&#xff1a;ipengtao.com 在分布式爬蟲和大規模數據采集的場景中&#xff0c;使用瀏覽器集群是一種有效的方式&#xff0c;可以提高數據采集的速度和效率。本文將介紹如何用Python編寫一個簡單但強大的瀏覽器集群框架&#xff0c;以應對需要使用多個瀏覽器實…

WebGL/threeJS面試題掃描與總結

什么是 WebGL&#xff1f;什么是 Three.js&#xff1f;請解釋three.js中的WebGL和Canvas的區別&#xff1f; WebGL(全寫Web Graphics Library)是一種3D繪圖協議&#xff0c;這種繪圖技術標準允許把JavaScript和OpenGL ES 2.0結合在一起&#xff0c;通過增加OpenGL ES 2.0的一個…