Telego 簡介與 OpenWhisk 部署實踐
概述
Telego 是一個用于便攜式 Kubernetes 部署的工具,旨在解決容器鏡像拉取中的網絡代理問題。本文檔描述了如何通過 Telego 將 Apache OpenWhisk(一個 Serverless 計算平臺)部署到 Kubernetes 集群,并通過本地鏡像倉庫規避網絡代理限制。以下內容基于提供的配置文件和實踐經驗,詳細說明部署流程、環境配置及核心配置文件。
背景與需求
Apache OpenWhisk 是一個開源的 Serverless 計算平臺,之前通過 apache/openwhisk-deploy-kube 倉庫的 Helm 部署方式進行安裝。然而,在部署過程中,經常遇到網絡代理問題,導致鏡像拉取失敗。為了解決這一問題,研發了 Telego,通過將所有所需鏡像全量拉取到本地鏡像倉庫,并結合 Telego 的便攜部署能力,徹底規避網絡代理限制。
前提環境配置
在開始部署之前,需確保以下環境配置已完成:
運維流程
- 發布到 MainNode:完成 MainNode 的安裝和更新配置。
- 必要二進制文件準備:準備并上傳必要的二進制文件。
- 部署鏡像倉庫:配置并部署本地鏡像倉庫。
- 部署鏡像上傳服務:確保鏡像上傳服務可用。
Kubernetes 可訪問性(可選)
- 操作節點已對接目標 Kubernetes 集群,或本身位于集群中。
- 配置或獲取管理員級別的
kubeconfig
文件。
核心配置文件
以下是 Telego 的核心配置文件及其詳細解釋,用于部署 OpenWhisk:
comment: openwhisk serverless 計算平臺local_values:ingress_ip: 192.168.31.162openwhisk-override-values:read_from_file: template/override-values.ymloverride-init_db:read_from_file: template/override-init_db.shoverride-runtimes:read_from_file: template/override-runtimes.jsonprepare:- filemap: content: ${openwhisk-override-values}path: teledeploy/override-values.ymlmode: 755- filemap:content: ${override-runtimes}path: openwhisk-deploy-kube/helm/openwhisk/runtimes.jsonmode: 755- filemap:content: ${override-init_db}path: openwhisk-deploy-kube/helm/openwhisk/configMapFiles/initCouchDB/initdb.shmode: 755- git: https://github.com/apache/openwhisk:ef725a653ab112391f79c274d8e3dcfb915d59a3- image: openwhisk/java8action:1.17.0- image: openwhisk/ow-utils:ef725a6- image: zookeeper:3.4- image: wurstmeister/kafka:2.12-2.3.1- image: apache/couchdb:2.3- image: nginx:1.21.1- image: openwhisk/controller:ef725a6- image: openwhisk/scheduler:ef725a6- image: bitnami/etcd:3.4.0- image: openwhisk/invoker:ef725a6- image: openwhisk/apigateway:1.0.0- image: redis:4.0- image: openwhisk/user-events:ef725a6- image: prom/prometheus:v2.14.0- image: grafana/grafana:6.3.0- image: openwhisk/alarmprovider:2.3.0- image: openwhisk/kafkaprovider:2.1.0- image: busybox:latest- image: docker.elastic.co/elasticsearch/elasticsearch:6.7.2helms:openwhisk:helm-dir: openwhisk-deploy-kube/helm/openwhiskoverwrite-config: teledeploy/override-values.ymlnamespace: openwhisk
配置項解釋
local_values
ingress_ip
:指定 OpenWhisk 的 Ingress IP 地址(例如192.168.31.162
),用于外部訪問。openwhisk-override-values
:引用template/override-values.yml
,用于覆蓋 Helm 的默認值。override-init_db
:引用template/override-init_db.sh
,用于覆蓋 CouchDB 初始化腳本。override-runtimes
:引用template/override-runtimes.json
,用于覆蓋運行時配置。
prepare
filemap
:將模板文件映射到指定路徑,并設置文件權限(mode: 755
)。例如:- 將
openwhisk-override-values
寫入teledeploy/override-values.yml
。 - 將
override-runtimes
寫入openwhisk-deploy-kube/helm/openwhisk/runtimes.json
。 - 將
override-init_db
寫入 CouchDB 初始化腳本路徑。
- 將
git
:指定 OpenWhisk 倉庫的特定提交(ef725a653ab112391f79c274d8e3dcfb915d59a3
),Telego 將其下載并準備為壓縮包(teledeploy/倉庫名.tar.gz
)。image
:列出所有所需鏡像(包括 OpenWhisk 組件及其他依賴,如 Zookeeper、Kafka 等)。Telego 在prepare
階段拉取這些鏡像(支持arm64
和amd64
架構),并在upload
階段上傳到本地鏡像倉庫。
helms
openwhisk
:helm-dir
:指定 Helm Chart 目錄(openwhisk-deploy-kube/helm/openwhisk
)。overwrite-config
:指定覆蓋值的文件(teledeploy/override-values.yml
)。namespace
:指定部署的 Kubernetes 命名空間(openwhisk
)。
準備內部鏡像
OpenWhisk 部署依賴 Helm Chart。為確保鏡像拉取無網絡問題,需執行以下步驟:
-
定位 Helm 值文件:
- 分析
openwhisk-deploy-kube/helm/openwhisk
中的values.yaml
,列出所有使用的鏡像及其標簽。 - 在
prepare
階段,將這些鏡像添加到image
列表中(見上述配置)。
- 分析
-
鏡像拉取與上傳:
- Telego 在
prepare
階段全量拉取列出的鏡像(支持arm64
和amd64
架構)。 - 在
upload
階段,鏡像被統一上傳到預配置的本地鏡像倉庫。
- Telego 在
Helm 值覆蓋配置
為確保容器從本地鏡像倉庫拉取鏡像,需通過 Helm 的值覆蓋機制調整配置:
配置示例
local_values:openwhisk-override-values:read_from_file: template/override-values.ymlprepare:- filemap: content: ${openwhisk-override-values}path: teledeploy/override-values.ymlmode: 755helms:openwhisk:helm-dir: openwhisk-deploy-kube/helm/openwhiskoverwrite-config: teledeploy/override-values.ymlnamespace: openwhisk
template/override-values.yml
內容
以下是覆蓋值的部分內容,展示了鏡像地址重定向和 Ingress 配置:
scheduler:enabled: true
metrics:prometheusEnabled: trueuserMetricsEnabled: true
invoker:containerFactory:impl: "kubernetes"
whisk:ingress:apiHostName: ${ingress_ip}apiHostProto: "http"limits:actionsInvokesPerminute: 100000actionsInvokesConcurrent: 100000utility:imageName: "${IMG_REPO}/teleinfra/ow-utils"
zookeeper:imageName: "${IMG_REPO}/teleinfra/zookeeper"
kafka:imageName: "${IMG_REPO}/teleinfra/kafka"
db:imageName: "${IMG_REPO}/teleinfra/couchdb"
nginx:imageName: "${IMG_REPO}/teleinfra/nginx"
controller:imageName: "${IMG_REPO}/teleinfra/controller"
scheduler:imageName: "${IMG_REPO}/teleinfra/scheduler"
etcd:imageName: "${IMG_REPO}/teleinfra/etcd"imageTag: "3.4.0"
invoker:imageName: "${IMG_REPO}/teleinfra/invoker"
apigw:imageName: "${IMG_REPO}/teleinfra/apigateway"
redis:imageName: "${IMG_REPO}/teleinfra/redis"
user_events:imageName: "${IMG_REPO}/teleinfra/user-events"
prometheus:imageName: "${IMG_REPO}/teleinfra/prometheus"
grafana:imageName: "${IMG_REPO}/teleinfra/grafana"
providers:alarm:imageName: "${IMG_REPO}/teleinfra/alarmprovider"kafka:imageName: "${IMG_REPO}/teleinfra/kafkaprovider"
busybox:imageName: "${IMG_REPO}/teleinfra/busybox"
elasticsearch:image: "${IMG_REPO}/teleinfra/elasticsearch"
關鍵點
- 鏡像地址重定向:所有鏡像名稱被覆蓋為
${IMG_REPO}/teleinfra/{鏡像名}
,指向本地鏡像倉庫。 - Ingress 配置:
apiHostName
使用local_values
中的ingress_ip
動態替換。 - 性能測試:通過設置較高的
actionsInvokesPerminute
和actionsInvokesConcurrent
(均為100000
)進行壓力測試。
平臺綁定的特化配置覆蓋
在部署過程中,發現 openwhisk-deploy-kube/helm/openwhisk/runtimes.json
中也包含鏡像地址,需進行覆蓋:
runtimes.json
示例
{"java": [{"kind": "java:8","default": true,"image": {"prefix": "${IMG_REPO}/teleinfra","name": "java8action","tag": "1.17.0"}}]
}
- 使用 Telego 的變量替換機制,將鏡像地址重定向到本地鏡像倉庫。
平臺綁定的特化腳本覆蓋
CouchDB 初始化腳本(init_db.sh
)中包含對 GitHub 倉庫的訪問,同樣受網絡代理限制。Telego 通過共享文件服務器解決此問題:
覆蓋邏輯
-
Git 資源準備:
- 在
prepare
階段,指定 OpenWhisk 倉庫及其提交 ID:prepare:- git: https://github.com/apache/openwhisk:ef725a653ab112391f79c274d8e3dcfb915d59a3
- Telego 將資源下載并打包為
teledeploy/openwhisk.tar.gz
。
- 在
-
腳本覆蓋:
- 使用
template/override-init_db.sh
替換默認的init_db.sh
:# 原始邏輯(注釋掉) # git clone https://github.com/apache/openwhisk /openwhisk # pushd /openwhisk # git checkout $OW_GIT_TAG_OPENWHISK # popd# 從 MainNode 下載 curl -O http://${MAIN_NODE_IP}:8003/k8s_openwhisk/openwhisk.tar.gz tar -xzf openwhisk.tar.gz
- 使用 Telego 的變量替換機制,將
MAIN_NODE_IP
動態替換為主節點的 IP 地址。
- 使用
總結
通過 Telego 的便攜部署能力,結合本地鏡像倉庫和 Helm 值覆蓋機制,成功規避了 OpenWhisk 部署中的網絡代理問題。核心步驟包括:
- 配置本地鏡像倉庫并全量拉取所需鏡像。
- 使用 Helm 值覆蓋重定向鏡像地址。
- 利用 Telego 的變量替換和共享文件服務器處理特化配置和腳本。
- 通過 Telego 的
prepare
和helms
配置實現自動化部署。
此實踐展示了 Telego 在復雜 Kubernetes 部署場景中的靈活性和可靠性,適用于需要隔離網絡環境的 Serverless 平臺部署。
備注:本文檔基于提供的配置和實踐經驗整理,旨在為類似場景提供參考。如需進一步調整或優化,可根據實際環境和需求修改配置文件。