国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Kubernetes運(yùn)維篇】ingress-nginx實(shí)現(xiàn)業(yè)務(wù)灰度發(fā)布詳解

這篇具有很好參考價(jià)值的文章主要介紹了【Kubernetes運(yùn)維篇】ingress-nginx實(shí)現(xiàn)業(yè)務(wù)灰度發(fā)布詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、理論:實(shí)現(xiàn)灰度發(fā)布的幾種場(chǎng)景

1、場(chǎng)景一:將新版本灰度給部分用戶

假設(shè)線上運(yùn)行了一套對(duì)外提供 7 層服務(wù)的 Service A 服務(wù),后來(lái)開(kāi)發(fā)了個(gè)新版本 Service AA需要上線,但不想直接替換掉原來(lái)的 Service A,希望先灰度一小部分用戶,等運(yùn)行一段時(shí)間足夠穩(wěn)定了再逐漸全量上線新版本,最后平滑下線舊版本。

這個(gè)時(shí)候就可以利用 Nginx Ingress 基于 Header 或 Cookie 進(jìn)行流量切分的策略來(lái)發(fā)布,業(yè)務(wù)使用 Header 或 Cookie 來(lái)標(biāo)識(shí)不同類型的用戶,我們通過(guò)配置 Ingress 來(lái)實(shí)現(xiàn)讓帶有指定 Header 或 Cookie 的請(qǐng)求被轉(zhuǎn)發(fā)到新版本,其它的仍然轉(zhuǎn)發(fā)到舊版本,從而實(shí)現(xiàn)將新版本灰度給部分用戶。

【Kubernetes運(yùn)維篇】ingress-nginx實(shí)現(xiàn)業(yè)務(wù)灰度發(fā)布詳解,# 3-Kubernetes容器編排,運(yùn)維,kubernetes,nginx,ingress,ingress灰度發(fā)布,ingress-nginx

2、場(chǎng)景二:按照比例流程給新版本

假設(shè)線上運(yùn)行了一套對(duì)外提供 7 層服務(wù)的 Service B 服務(wù),后來(lái)修復(fù)了一些問(wèn)題,需要灰度上線一個(gè)新版本 Service BB,但又不想直接替換掉原來(lái)的 Service B而是讓先切 10% 的流量到新版本。

等觀察一段時(shí)間穩(wěn)定后再逐漸加大新版本的流量比例直至完全替換舊版本,最后再滑下線舊版本,從而實(shí)現(xiàn)切一定比例的流量給新版本。

【Kubernetes運(yùn)維篇】ingress-nginx實(shí)現(xiàn)業(yè)務(wù)灰度發(fā)布詳解,# 3-Kubernetes容器編排,運(yùn)維,kubernetes,nginx,ingress,ingress灰度發(fā)布,ingress-nginx

3、實(shí)現(xiàn)灰度發(fā)布字段解釋

Ingress-Nginx是一個(gè)K8S ingress工具,支持配置Ingress Annotations來(lái)實(shí)現(xiàn)不同場(chǎng)景下的灰度發(fā)布和測(cè)試。 Nginx Annotations 支持以下幾種Canary規(guī)則:

假設(shè)我們現(xiàn)在部署了兩個(gè)版本的服務(wù),老版本和canary版本

  • nginx.ingress.kubernetes.io/canary-by-header:基于Request Header的流量切分,適用于灰度發(fā)布以及 A/B 測(cè)試。當(dāng)Request Header 設(shè)置為 always時(shí),請(qǐng)求將會(huì)被一直發(fā)送到 Canary 版本;當(dāng) Request Header 設(shè)置為 never時(shí),請(qǐng)求不會(huì)被發(fā)送到 Canary 入口。

  • nginx.ingress.kubernetes.io/canary-by-header-value:要匹配的 Request Header 的值,用于通知 Ingress 將請(qǐng)求路由到 Canary Ingress 中指定的服務(wù)。當(dāng) Request Header 設(shè)置為此值時(shí),它將被路由到 Canary 入口。

  • nginx.ingress.kubernetes.io/canary-weight:基于服務(wù)權(quán)重的流量切分,適用于藍(lán)綠部署,權(quán)重范圍 0 - 100 按百分比將請(qǐng)求路由到 Canary Ingress 中指定的服務(wù)。權(quán)重為 0 意味著該金絲雀規(guī)則不會(huì)向 Canary 入口的服務(wù)發(fā)送任何請(qǐng)求。權(quán)重為60意味著60%流量轉(zhuǎn)到canary。權(quán)重為 100 意味著所有請(qǐng)求都將被發(fā)送到 Canary 入口。

  • nginx.ingress.kubernetes.io/canary-by-cookie:基于 Cookie 的流量切分,適用于灰度發(fā)布與 A/B 測(cè)試。用于通知 Ingress 將請(qǐng)求路由到 Canary Ingress 中指定的服務(wù)的cookie。當(dāng) cookie 值設(shè)置為 always時(shí),它將被路由到 Canary 入口;當(dāng) cookie 值設(shè)置為 never時(shí),請(qǐng)求不會(huì)被發(fā)送到 Canary 入口。

二、實(shí)踐:

1、實(shí)驗(yàn)前提環(huán)境

1、增加V1環(huán)境:

cat v1.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
      version: v1
  template:
    metadata:
      labels:
        app: nginx
        version: v1
    spec:
      containers:
      - name: nginx
        image: "openresty/openresty:centos"
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          protocol: TCP
          containerPort: 80
        volumeMounts:    # 掛載卷
        - mountPath: /usr/local/openresty/nginx/conf/nginx.conf
          name: config
          subPath: nginx.conf
      volumes:          # 定義卷,引用configMap
      - name: config
        configMap:
          name: nginx-v1
---
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app: nginx
    version: v1
  name: nginx-v1
data:
  nginx.conf: |-
    worker_processes  1;
    events {
        accept_mutex on;
        multi_accept on;
        use epoll;
        worker_connections  1024;
    }
    http {
        ignore_invalid_headers off;
        server {
            listen 80;
            location / {
                access_by_lua '
                    local header_str = ngx.say("nginx-v1")
                ';
            }
        }
    }
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-v1
spec:
  type: ClusterIP
  ports:
  - port: 80
    protocol: TCP
    name: http
  selector:
    app: nginx
    version: v1

2、增加V2環(huán)境:

cat v2.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
      version: v2
  template:
    metadata:
      labels:
        app: nginx
        version: v2
    spec:
      containers:
      - name: nginx
        image: "openresty/openresty:centos"
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          protocol: TCP
          containerPort: 80
        volumeMounts:
        - mountPath: /usr/local/openresty/nginx/conf/nginx.conf
          name: config
          subPath: nginx.conf
      volumes:
      - name: config
        configMap:
          name: nginx-v2
---
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app: nginx
    version: v2
  name: nginx-v2
data:
  nginx.conf: |-
    worker_processes  1;
    events {
        accept_mutex on;
        multi_accept on;
        use epoll;
        worker_connections  1024;
    }
    http {
        ignore_invalid_headers off;
        server {
            listen 80;
            location / {
                access_by_lua '
                    local header_str = ngx.say("nginx-v2")
                ';
            }
        }
    }
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-v2
spec:
  type: ClusterIP
  ports:
  - port: 80
    protocol: TCP
    name: http
  selector:
    app: nginx
    version: v2

3、執(zhí)行YAML文件

kubectl apply -f v1.yaml 
kubectl apply -f v2.yaml 

4、驗(yàn)證Pod是啟動(dòng)

kubectl get pods -o wide

【Kubernetes運(yùn)維篇】ingress-nginx實(shí)現(xiàn)業(yè)務(wù)灰度發(fā)布詳解,# 3-Kubernetes容器編排,運(yùn)維,kubernetes,nginx,ingress,ingress灰度發(fā)布,ingress-nginx

5、驗(yàn)證,請(qǐng)求Pod內(nèi)容

curl http://10.244.247.2
curl http://10.244.84.134

【Kubernetes運(yùn)維篇】ingress-nginx實(shí)現(xiàn)業(yè)務(wù)灰度發(fā)布詳解,# 3-Kubernetes容器編排,運(yùn)維,kubernetes,nginx,ingress,ingress灰度發(fā)布,ingress-nginx

如上圖,請(qǐng)求不同版本的環(huán)境,返回不同版本號(hào),表示無(wú)誤。

2、基于Request Header(請(qǐng)求頭)進(jìn)行流量分割

1、創(chuàng)建v1版本的ingress規(guī)則

cat v1-ingress.yaml 
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-v1
spec:
  ingressClassName: nginx
  rules:
  - host: qinzt.ingress.com
    http:
      paths:
      - path: /  #配置訪問(wèn)路徑,如果通過(guò)url進(jìn)行轉(zhuǎn)發(fā),需要修改;空默認(rèn)為訪問(wèn)的路徑為"/"
        pathType:  Prefix
        backend:  #配置后端服務(wù)
         service:
           name: nginx-v1
           port:
            number: 80

執(zhí)行YAML文件:

kubectl apply -f v1-ingress.yaml

訪問(wèn)驗(yàn)證一下:16.32.15.201:30080是我ingress-nginx訪問(wèn)地址

curl -H "Host: qinzt.ingress.com" http://16.32.15.201:30080
nginx-v1

2、創(chuàng)建ingress規(guī)則,基于Request Header進(jìn)行流量分割

cat v2-request.yaml 
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "Region" #基于Request Header的流量切分
    nginx.ingress.kubernetes.io/canary-by-header-pattern: "cd|sz" #Header信息中帶有 Region=cd,Region=sz的轉(zhuǎn)發(fā)到此ingress
  name: nginx-request-v2
spec:
  ingressClassName: nginx
  rules:
  - host: qinzt.ingress.com
    http:
      paths:
      - path: /  #配置訪問(wèn)路徑,如果通過(guò)url進(jìn)行轉(zhuǎn)發(fā),需要修改;空默認(rèn)為訪問(wèn)的路徑為"/"
        pathType:  Prefix
        backend:  #配置后端服務(wù)
         service:
           name: nginx-v2
           port:
            number: 80

執(zhí)行YAML文件:

kubectl apply -f v2-request.yaml

訪問(wèn)驗(yàn)證一下:16.32.15.201:30080是我ingress-nginx訪問(wèn)地址

curl -H "Host: qinzt.ingress.com" -H "Region: cd" http://16.32.15.201:30080
curl -H "Host: qinzt.ingress.com" -H "Region: sz" http://16.32.15.201:30080

【Kubernetes運(yùn)維篇】ingress-nginx實(shí)現(xiàn)業(yè)務(wù)灰度發(fā)布詳解,# 3-Kubernetes容器編排,運(yùn)維,kubernetes,nginx,ingress,ingress灰度發(fā)布,ingress-nginx

OK,可以看到上圖,攜帶Region: cd、Region: sz請(qǐng)求頭消息,會(huì)轉(zhuǎn)發(fā)到V2環(huán)境。

3、基于Cookie進(jìn)行流量切分

與前面 Header 類似,不過(guò)使用 Cookie 就無(wú)法自定義 value 了,這里以模擬灰度成都地域用戶為例,僅將帶有名為 user_from_cd 的 cookie 的請(qǐng)求轉(zhuǎn)發(fā)給當(dāng)前V2環(huán)境 。

1、先刪除前面基于 Header 的流量切分的 Ingress

kubectl delete -f v2-request.yaml

2、創(chuàng)建基于cookie 轉(zhuǎn)發(fā)的ingress規(guī)則

cat v2-cookie.yaml 
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-cookie: "user_from_cd" # 匹配cookie攜帶user_from_cd,使用此ingress規(guī)則
  name: nginx-cookie-v2
spec:
  ingressClassName: nginx
  rules:
  - host: qinzt.ingress.com
    http:
      paths:
      - path: /  #配置訪問(wèn)路徑,如果通過(guò)url進(jìn)行轉(zhuǎn)發(fā),需要修改;空默認(rèn)為訪問(wèn)的路徑為"/"
        pathType:  Prefix
        backend:  #配置后端服務(wù)
         service:
           name: nginx-v2
           port:
            number: 80

執(zhí)行YAML文件

kubectl apply -f v2-cookie.yaml 

3、測(cè)試驗(yàn)證,http://16.32.15.201:30080是我ingress nginx地址

curl -s -H "Host: qinzt.ingress.com" --cookie "user_from_cd=always" http://16.32.15.201:30080
nginx-v2

curl -s -H "Host: qinzt.ingress.com" --cookie "user_from_bj=always" http://16.32.15.201:30080
nginx-v1

可以看到只有cookie=user_from_cd的才會(huì)轉(zhuǎn)發(fā)到V2的ingress

4、基于服務(wù)權(quán)重進(jìn)行流量切分

基于服務(wù)權(quán)重的直接定義需要導(dǎo)入的流量比例,這里以導(dǎo)入 10% 流量到 v2 環(huán)境版本為。

1、刪除上面基于cookie的ingress規(guī)則

kubectl delete -f v2-cookie.yaml

2、創(chuàng)建基于權(quán)重流量分配的ingress規(guī)則

cat v2-weight.yaml 
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10"
  name: nginx-weight-v2
spec:
  ingressClassName: nginx
  rules:
  - host: qinzt.ingress.com
    http:
      paths:
      - path: /  #配置訪問(wèn)路徑,如果通過(guò)url進(jìn)行轉(zhuǎn)發(fā),需要修改;空默認(rèn)為訪問(wèn)的路徑為"/"
        pathType:  Prefix
        backend:  #配置后端服務(wù)
         service:
           name: nginx-v2
           port:
            number: 80

執(zhí)行YAML文件:

kubectl apply -f v2-weight.yaml

3、測(cè)試驗(yàn)證

for i in {1..10}; do curl -H "Host: qinzt.ingress.com" http://16.32.15.201:30080; done;

【Kubernetes運(yùn)維篇】ingress-nginx實(shí)現(xiàn)業(yè)務(wù)灰度發(fā)布詳解,# 3-Kubernetes容器編排,運(yùn)維,kubernetes,nginx,ingress,ingress灰度發(fā)布,ingress-nginx

OK,如上圖大約10%的記錄會(huì)請(qǐng)求到V2環(huán)境上面文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-605998.html

到了這里,關(guān)于【Kubernetes運(yùn)維篇】ingress-nginx實(shí)現(xiàn)業(yè)務(wù)灰度發(fā)布詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • k8s部署ingress-nginx

    k8s部署ingress-nginx

    k8s服務(wù)對(duì)外暴露有三種方式 NodePort,LoadBalancer,Ingress Nodeport : 服務(wù)暴露需要在集群每個(gè)節(jié)點(diǎn)都開(kāi)放一個(gè)同樣的端口,通過(guò) nodtIp:nodePort 來(lái)訪問(wèn),如果服務(wù)數(shù)量多了,開(kāi)放的端口就難以管理 LoadBalancer : 大部分情況下只適用于支持外部負(fù)載均衡器的云提供商(AWS,阿里云,華為云等)

    2024年02月04日
    瀏覽(22)
  • k8s helm ingress-nginx Error: template: ingress-nginx/templates/controller-role “update-status“

    k8s helm ingress-nginx Error: template: ingress-nginx/templates/controller-role “update-status“

    k8s,使用helm包管理器安裝ingress-nginx時(shí),安裝文件出錯(cuò) helm 版本:Version:“v3.2.3” k8s 版本:Kubernetes v1.23.6 ingress-nginx chart version:4.9.0 app version:1.9.5 前面都按網(wǎng)上的教程做,沒(méi)有什么大問(wèn)題 最后一步執(zhí)行安裝命令 命令執(zhí)行失敗,報(bào)錯(cuò) 問(wèn)題可能出現(xiàn)在對(duì).Values.controller.extraArg

    2024年03月20日
    瀏覽(28)
  • K8s的ingress-nginx配置https

    K8s的ingress-nginx配置https

    在另一臺(tái)機(jī)器上配置hosts解析www.yaoyao.com,然后訪問(wèn) curl --cacert tls.crt https://www.yaoyao.com:10443 這里的10443端口是ingress-nginx-controller服務(wù)暴露的nodeport端口

    2024年02月07日
    瀏覽(56)
  • K8S(1.28)--部署ingress-nginx(1.9.1)

    K8S(1.28)--部署ingress-nginx(1.9.1)

    原文網(wǎng)址:K8S(1.28)--部署ingress-nginx(1.9.1)-CSDN博客 本文介紹K8S部署ingress-nginx的方法。 本文使用的K8S和ingress-nginx都是最新的版本。 官網(wǎng)地址 https://kubernetes.github.io/ingress-nginx/deploy/ Ingress里Nginx的代理流程: 1.確定版本 首先確定版本:https://github.com/kubernetes/ingress-nginx 我K8S是1.2

    2024年02月20日
    瀏覽(28)
  • 【Kubernetes運(yùn)維篇】RBAC認(rèn)證授權(quán)詳解(一)

    【Kubernetes運(yùn)維篇】RBAC認(rèn)證授權(quán)詳解(一)

    1、什么是RBAC授權(quán)? RBAC是一種 基于角色訪問(wèn)控制方式 ,它將權(quán)限和角色相關(guān)聯(lián),用戶加入到角色中,就會(huì)擁有角色中的權(quán)限,RBAC的核心思想是,將權(quán)限賦予給角色,角色中加入多個(gè)用戶,加入進(jìn)來(lái)的用戶會(huì)具有角色的權(quán)限,如果修改權(quán)限也是針對(duì)角色進(jìn)行操作,而不是針對(duì)

    2024年02月16日
    瀏覽(51)
  • 【Kubernetes運(yùn)維篇】RBAC認(rèn)證授權(quán)詳解(二)

    【Kubernetes運(yùn)維篇】RBAC認(rèn)證授權(quán)詳解(二)

    官方中文參考連接: 在K8S中,所有資源對(duì)象都是通過(guò)API進(jìn)行操作,他們保存在ETCD里面,而對(duì)ETCD的操作,我們需要通過(guò)訪問(wèn)kube-apiserver來(lái)實(shí)現(xiàn), ServiceAccount其實(shí)就是apiserver的認(rèn)證過(guò)程,而授權(quán)的機(jī)制是通過(guò)RBAC,基于角色的訪問(wèn)控制實(shí)現(xiàn)。 RBAC中有四個(gè)資源對(duì)象,分別是Role、

    2024年02月16日
    瀏覽(26)
  • 【Kubernetes運(yùn)維篇】RBAC之準(zhǔn)入控制器詳解

    【Kubernetes運(yùn)維篇】RBAC之準(zhǔn)入控制器詳解

    中文官方參考文檔: 1、ResourceQuota是什么? ResourceQuota準(zhǔn)入控制器是K8S中內(nèi)置的準(zhǔn)入控制器,默認(rèn)該控制器是啟用狀態(tài), 主要功能是限制名稱空間下的資源使用 ,防止在一個(gè)名稱空間下的Pod占用過(guò)多的資源, 簡(jiǎn)單理解就是針對(duì)名稱空間限制用戶資源的使用。 2、限制CPU、內(nèi)存

    2024年02月16日
    瀏覽(21)
  • 【Kubernetes運(yùn)維篇】零故障升級(jí)Pod健康探測(cè)詳解

    【Kubernetes運(yùn)維篇】零故障升級(jí)Pod健康探測(cè)詳解

    中文官方參考文檔: Pod探測(cè)是Kubernetes中的一種機(jī)制, 用于檢測(cè)Pod的狀態(tài)和健康狀況。當(dāng)探測(cè)到Pod狀態(tài)不正常時(shí),根據(jù)重啟策略進(jìn)行相應(yīng)的Pod操作 ,探測(cè)可以幫助Kubernetes集群自動(dòng)化地管理容器的健康狀態(tài),提高應(yīng)用程序的可靠性和可用性。 探測(cè)針對(duì)Pod中容器進(jìn)行操作,所以探

    2024年02月08日
    瀏覽(25)
  • 第12關(guān) 精通K8s下的Ingress-Nginx控制器:生產(chǎn)環(huán)境實(shí)戰(zhàn)配置指南

    第12關(guān) 精通K8s下的Ingress-Nginx控制器:生產(chǎn)環(huán)境實(shí)戰(zhàn)配置指南

    ------ 課程視頻同步分享在今日頭條和B站 大家好,我是博哥愛(ài)運(yùn)維,這節(jié)課帶來(lái)k8s的流量入口ingress,作為業(yè)務(wù)對(duì)外服務(wù)的公網(wǎng)入口,它的重要性不言而喻,大家一定要仔細(xì)閱讀,跟著博哥的教程一步步實(shí)操去理解。 Ingress基本概念 在Kubernetes集群中,Ingress作為集群內(nèi)服務(wù)對(duì)外

    2024年02月03日
    瀏覽(23)
  • K8s實(shí)戰(zhàn)4-使用Helm在Azure上部署Ingress-Nginx和Tokengateway

    K8s實(shí)戰(zhàn)4-使用Helm在Azure上部署Ingress-Nginx和Tokengateway

    az login az account set --subscription ${sub ID} az aks get-credentials --resource-group ${groupname} --name ${aks name} curl -LO https://github.com/kubernetes/ingress-nginx/releases/download/helm-chart-4.7.1/ingress-nginx-4.7.1.tgz sudo tar -xvf ingress-nginx-4.2.5.tgz sudo cd ingress-nginx #創(chuàng)建命名空間 kubectl create ns ingress-nginx-public # 使用

    2024年02月12日
    瀏覽(62)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包