共計 5443 個字符,預計需要花費 14 分鐘才能閱讀完成。
這期內容當中丸趣 TV 小編將會給大家帶來有關 F5 與 Openshift 集成怎么實現灰度發布,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一、為什么要使用灰度發布
什么是灰度發布
灰度發布是指在黑與白之間,能夠平滑過渡的一種發布方式。ABtest 就是一種灰度發布方式,讓一部分用戶繼續用 A,一部分用戶開始用 B,如果用戶對 B 沒有什么反對意見,那么逐步擴大范圍,把所有用戶都遷移到 B 上面來。灰度發布可以保證整體系統的穩定,在初始灰度的時候就可以發現、調整問題,以保證其影響度。
灰度發布的價值
使用灰度發布可以在產品正式上線前針對特定一些目標用戶進行開放,獲得這些目標用戶的反饋,及早發現問題,修復問題,完善產品的不足。如果發現新的版本價值不大,能夠及早更換思路,避免產品直接上線后產生不好的影響。
Openshift Route 自帶的灰度發布功能
Openshift Route 自帶的灰度發布,是通過 Route 下“掛載”兩個或兩個以上 Service,并調整各個 Service 的權值進行控制流量的分布。
例如應用有兩個服務,分別為 service-v1 和 service-v2,其中 service-v2 為新版本。通過不斷放大 service-v2 的權值,觀察用戶的反饋,及時發現 service-v2 中的問題,并完善修復,最終 service-v2 承載所有 service-v1 的流量,實現服務的升級。通過這種方式,可以大大地降低 service-v2 中的問題對客戶產生的影響。
Openshift Route 對 Service 分流使用非常方便,一些普通的業務完全可以使用這個特性達到測試的目的。但是它的簡單也帶來了一些不足,就是它只能對請求進行概率地劃分流量,并不能定向到用戶。
例如,以下需求 Openshift Route 目前還無法實現。產品新版本正式發布前,我們希望對產品進行一些測試,只允許指定的一批用戶或者一些網段的 ip 下的用戶才能訪問新版本。
二、F5 與 Openshift 集成實現灰度發布
流量到達 F5 時,F5 會優先對請求進行 iRule 下的匹配檢查,定向到對應的 Pool
如果 iRule 下未匹配,則會控制 vs 下綁定的 Polices 規則進行匹配
在上篇中,我們知道 Openshift 上的 F5 控制器會自動在 F5 上生成 Polices 規則,來滿足 Openshift Route 的功能。那么只需要將它與自定義的 iRule 結合就能夠實現既滿足服務的分流,又能控制用戶對服務的定向訪問。
F5 與 Openshift 集成配置與部署(實現灰度發布)
準備工作(詳細見上篇:Openshift-F5 集成(南北流量走 F5))
創建新的 HostSub
Local Traffic – Virtual Servers
Name:VS 名字
Destination Address/Mask:VS 的 IP 地址
Service Port:HTTP
HTTP Profile:http
Source Address Translation:Auto Map
HTTPS
Name:VS 名字
Destination Address/Mask:VS 的 IP 地址
Service Port:HTTPS
HTTP Profile:http
SSL Profile (Client):/Common/clientssl
Source Address Translation:Auto Map
設置 VS 中的 cccl-whitelist 為 1
對應每臺 F5 設備創建一個 Deployment
Deployment 中的 –bigip-url 為設備的 IP
Deployment 中的 –bigip-partition 為之前 F5 下創建的 Partition,Openshift
Deployment 中的 –route-http-vserver 為手動創建的 HTTP VS
Deployment 中的 –route-https-vserver 為手動創建的 HTTPS VS
Deployment 中的 –route-label 為給 Controller 打的標簽(對于一組 F5 不需要配置,多組 F5 通過它打 Label,并在 Route 中設置 label f5type:label 來指定使用的 F5)
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: f5-bigip-ctlr-01
spec:
replicas: 1
template:
metadata:
name: k8s-bigip-ctlr
labels:
app: k8s-bigip-ctlr
spec: # Name of the Service Account bound to a Cluster Role with the required
# permissions
serviceAccountName: bigip-ctlr
containers:
- name: k8s-bigip-ctlr # replace the version as needed
image: f5networks/k8s-bigip-ctlr:1.5.1
env:
- name: BIGIP_USERNAME
valueFrom:
secretKeyRef: # Replace with the name of the Secret containing your login
# credentials
name: bigip-login
key: username
- name: BIGIP_PASSWORD
valueFrom:
secretKeyRef: # Replace with the name of the Secret containing your login
# credentials
name: bigip-login
key: password command: [/app/bin/k8s-bigip-ctlr]
args: [ # See the k8s-bigip-ctlr documentation for information about
# all config options
# http://clouddocs.f5.com/products/connectors/k8s-bigip-ctlr/latest
--bigip-username=$(BIGIP_USERNAME) , --bigip-password=$(BIGIP_PASSWORD) , --bigip-url=192.168.200.82 , --bigip-partition=OpenShift , --pool-member-type=cluster , --openshift-sdn-name=/Common/openshift_vxlan , --manage-routes=true
--route-http-vserver=testroute
--route-https-vserver=testroute_https
]
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: f5-bigip-ctlr-02
spec:
replicas: 1
template:
metadata:
name: k8s-bigip-ctlr
labels:
app: k8s-bigip-ctlr
spec: # Name of the Service Account bound to a Cluster Role with the required
# permissions
serviceAccountName: bigip-ctlr
containers:
- name: k8s-bigip-ctlr # replace the version as needed
image: f5networks/k8s-bigip-ctlr:1.5.1
env:
- name: BIGIP_USERNAME
valueFrom:
secretKeyRef: # Replace with the name of the Secret containing your login
# credentials
name: bigip-login
key: username
- name: BIGIP_PASSWORD
valueFrom:
secretKeyRef: # Replace with the name of the Secret containing your login
# credentials
name: bigip-login
key: password command: [/app/bin/k8s-bigip-ctlr]
args: [ # See the k8s-bigip-ctlr documentation for information about
# all config options
# http://clouddocs.f5.com/products/connectors/k8s-bigip-ctlr/latest
--bigip-username=$(BIGIP_USERNAME) , --bigip-password=$(BIGIP_PASSWORD) , --bigip-url=192.168.200.83 , --bigip-partition=OpenShift , --pool-member-type=cluster , --openshift-sdn-name=/Common/openshift_vxlan , --manage-routes=true
--route-http-vserver=testroute
--route-https-vserver=testroute_https
]
給 vs 手動綁定 Policies
Openshift F5 控制器創建好后,在 F5 上會自動創建兩條 Policies, 分別為:openshift_insecure_routes、openshift_secure_routes。
openshift_insecure_routes 為 HTTP 應用服務
openshift_secure_routes 為 HTTPS 應用服務。
綁定 Policies 與 iRule
創建應用(Project 名為 testapp,Service 名為 f5-nginx-v1 與 f5-nginx-v2)
oc new-project testapp
oc new-app harbor.example.com/public/nginx:1.14 --name=f5-nginx-v1 --allow-missing-images
oc expose dc/f5-test-v1 --port=8080oc expose svc/f5-test-v1 test1.apps.openshift.com
oc new-app harbor.example.com/public/nginx:1.14 --name=f5-nginx-v2 --allow-missing-images
oc expose dc/f5-test-v2 --port=8080
創建 iRule, 并綁定到 VS F5
說明:請求域名 test1.apps.openshift.com 時,如果客戶端 IP 為 192.168.100.23,則訪問 testapp 項目下的 f5-nginx-v2 服務,否則訪問 testapp 項目下的 f5-nginx-v1 服務
注意:iRule 規則需要在 Common 的 Partition 下創建
when HTTP_REQUEST { if { [HTTP::host] equals test1.apps.openshift.com }{ log local0.info [HTTP::host] if {[IP::addr [IP::client_addr] equals 192.168.100.23/32 ]} { log local0.info enter 2 pool before
log local0.info [HTTP::host]
pool /f5-openShift/openshift_testapp_f5-nginx-v2 log local0.info enter 2 pool later
} else { log local0.info enter 3
pool /f5-openShift/openshift_testapp_f5-nginx-v1
}
}
}
測試訪問服務
本地 (192.168.100.23) 與另一臺非 192.168.100.23 的機器上綁定 hosts
VS 的 IP 地址 test1.apps.openshift.com
再訪問 test1.apps.openshift.com,查看頁面顯示,訪問不同的 Service。
上述就是丸趣 TV 小編為大家分享的 F5 與 Openshift 集成怎么實現灰度發布了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注丸趣 TV 行業資訊頻道。