這篇文章給大家介紹怎么使用helm-controller簡(jiǎn)化容器云平臺(tái)應(yīng)用商店的開(kāi)發(fā),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
從策劃到設(shè)計(jì)制作,每一步都追求做到細(xì)膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、國(guó)際域名空間、虛擬主機(jī)、網(wǎng)絡(luò)營(yíng)銷、VI設(shè)計(jì)、 網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進(jìn)步。
熟練的閱讀并且進(jìn)行相應(yīng)的開(kāi)發(fā),大概需要對(duì)以下知識(shí)的了解:
k8s rest api 模型需要了解。
http協(xié)議需要熟練掌握。
openapi規(guī)范了解。
linux熟練掌握。
helm的理論架構(gòu)了解。
k8s crd 的理解,controller概念掌握,rbac權(quán)限模型的理解。
helm私庫(kù)index.yaml的理解與使用。
core DNS的配置與使用。
整體結(jié)構(gòu)圖
helm是k8s的包管理器,也是k8s平臺(tái)復(fù)雜應(yīng)用部署事實(shí)上的標(biāo)準(zhǔn)。包含了應(yīng)用打包,部署,升級(jí),回滾,卸載等符合生命周期管理的功能。
helm從v2到v3的版本升級(jí),移除了重要的一個(gè)組件tiller,整體架構(gòu)更簡(jiǎn)潔。
helm至今為止,官方仍然沒(méi)有g(shù)a版的api。chart的下載,部署,升級(jí),卸載,全部依賴cli。在多集群環(huán)境下cli很難滿足平臺(tái)的業(yè)務(wù)要求。
通過(guò)查看github issue,社區(qū)大概有兩種解決思路:
封裝cli成api。這種方式仍然存在每個(gè)集群需要通過(guò)ssh或者ansible的方式部署helm二進(jìn)制文件到master節(jié)點(diǎn)上,給底層部署工作添加負(fù)擔(dān)。
CRD。將helm的核心能力打包成docker鏡像,部署到k8s集群中,以controller的方式提供能力。利用crd的方式完成release的部署,卸載,升級(jí),回滾等業(yè)務(wù)動(dòng)作。
cli方式最大的問(wèn)題就在于不符合云原生的思想,而且cli的方式和helm版本鎖定,如果要升級(jí)helm,需要重新適配解析console內(nèi)容。 crd的問(wèn)題在于,官方目前還沒(méi)有g(shù)a。但仍然期待controller的方式。
我們團(tuán)隊(duì)最初使用第一種方式進(jìn)行了嘗試,但效果不理想。恰巧當(dāng)時(shí)發(fā)現(xiàn)靈雀云開(kāi)源了helm v3 controller captain,所以基于社區(qū)captain的進(jìn)行了第二次嘗試,并最終完成了功能開(kāi)發(fā)。
當(dāng)時(shí),在github搜索helm controller
,發(fā)現(xiàn)了兩個(gè)倉(cāng)庫(kù),一個(gè)是rancher提供的controller,一個(gè)是靈雀云提供的。經(jīng)過(guò)簡(jiǎn)單的測(cè)試,captain一次性安裝并測(cè)試成功,并結(jié)合內(nèi)部的討論,最終決定基于captain進(jìn)行開(kāi)發(fā)。
github: https://github.com/alauda/captain
The Helm 3 Design Proposal exists for a while and currently it is still under heavy development. Captain comes as the first implementation of Helm v3 Controller based on the Proposal. This project is based on the core helm v3 code, acting as a library. Since it's not officially released yet (alpha stage for now), some modifications were made to help implement this controller on a fork: alauda/helm (will be deprecated once Helm's library is released).
captain是靈雀云開(kāi)源的helm v3 controller
。其內(nèi)部依賴helm library。所以核心的邏輯與helm client是一致的。等到后期helm官方正式ga后,可以遷移回官方正式版本,這對(duì)于以面向接口編程的java來(lái)說(shuō),so easy。
基于Apache 2.0協(xié)議開(kāi)源
captain內(nèi)部將helm部署成deployment。
安裝步驟:
kubectl create ns captain-system kubectl create clusterrolebinding captain --serviceaccount=captain-system:default --clusterrole=cluster-admin kubectl apply -n captain-system -f https://raw.githubusercontent.com/alauda/captain/master/artifacts/all/deploy.yaml
卸載:
kubectl delete -n captain-system -f https://raw.githubusercontent.com/alauda/captain/master/artifacts/all/deploy.yaml kubectl delete ns captain-system
安裝nginx chart
kind: HelmRequest apiVersion: app.alauda.io/v1alpha1 metadata: name: nginx-ingress spec: chart: stable/nginx-ingress
查看部署結(jié)果
root@VM-16-12-ubuntu:~/demo# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-ingress-controller-57987f445c-9rhv5 1/1 Running 0 16s nginx-ingress-default-backend-7679dbd5c9-wkkss 1/1 Running 0 16s root@VM-16-12-ubuntu:~/demo# kubectl get hr NAME CHART VERSION NAMESPACE ALLCLUSTER PHASE AGE nginx-ingress stable/nginx-ingress default Synced 23s
captain默認(rèn)自帶stable的helm官方倉(cāng)庫(kù),helm官方的倉(cāng)庫(kù)地址本身沒(méi)有問(wèn)題,但是chart鏡像中如果使用了被墻了的docker鏡像,無(wú)法下載。測(cè)試的時(shí)候是使用的aliyun提供的倉(cāng)庫(kù)地址https://developer.aliyun.com/hub/。這樣captain controller才能順利的將chart鏡像下載成功。
當(dāng)測(cè)試結(jié)束時(shí),我們需要將k8s與內(nèi)網(wǎng)的chart私庫(kù)進(jìn)行打通,需要新建一個(gè)ChartRepo的yaml文件
apiVersion: app.alauda.io/v1alpha1 kind: ChartRepo metadata: name: cloud namespace: captain-system spec: url: https://harbor.offline/chartrepo/library
然后使用kubectl create -f fileName
添加到k8s中,需要注意的是,我們使用了harbor做docker鏡像和helm鏡像的管理,因?yàn)閐ocker的問(wèn)題,我們使用了自簽的證書(shū),captain在根據(jù)地址同步的時(shí)候,會(huì)校驗(yàn)證書(shū),這個(gè)問(wèn)題我們也和官方進(jìn)行了溝通,得到了解決,目前captain已經(jīng)ga,可以直接使用,不需要擔(dān)心證書(shū)的問(wèn)題。
云平臺(tái)的管理中,我們通過(guò)servicecount進(jìn)行k8s api的使用,當(dāng)安裝了captain之后,不同于命令行使用user account,我們需要額外的一步追加權(quán)限的動(dòng)作
kubectl create clusterrolebinding default --serviceaccount=default:default --clusterrole=cluster-admin
captain 官方目前只提供了go和python的sdk,基于此,我們肯定要封裝一個(gè)captain的java sdk。
在架構(gòu)底層,我們使用k8s官方的sdk進(jìn)行開(kāi)發(fā)。
基于crd和k8s openapi的簡(jiǎn)單了解,結(jié)合官方的說(shuō)明,嘗試性的進(jìn)行了sdk生成的動(dòng)作,結(jié)果失敗了,詳細(xì)見(jiàn)issue我們也聯(lián)系了作者,得知captain并沒(méi)有基于schema做校驗(yàn),內(nèi)部使用了webhook進(jìn)行的校驗(yàn)。基于這樣的背景,直接使用openapi規(guī)范生成sdk的路不通,后面我們直接使用了kubectl -v9
的方式進(jìn)行報(bào)文的驗(yàn)證,以及代碼的開(kāi)發(fā)。
使用kubectl命令行進(jìn)行任意操作時(shí),追加-v9
參數(shù),可以獲取詳細(xì)的http報(bào)文信息
root@master:/home/kylin# kubectl get pod -v9 I0414 22:42:53.981748 16582 loader.go:359] Config loaded from file: /root/.kube/config I0414 22:42:54.042173 16582 round_trippers.go:419] curl -k -v -XGET -H "Accept: application/json;as=Table;v=v1beta1;g=meta.k8s.io, application/json" -H "User-Agent: kubectl/v1.15.5 (linux/amd64) kubernetes/20c265f" 'https://192.168.4.139:6443/api/v1/namespaces/default/pods?limit=500' I0414 22:42:54.077898 16582 round_trippers.go:438] GET https://192.168.4.139:6443/api/v1/namespaces/default/pods?limit=500 200 OK in 35 milliseconds I0414 22:42:54.077959 16582 round_trippers.go:444] Response Headers: I0414 22:42:54.078006 16582 round_trippers.go:447] Content-Type: application/json I0414 22:42:54.078054 16582 round_trippers.go:447] Date: Tue, 14 Apr 2020 14:42:54 GMT I0414 22:42:54.078394 16582 request.go:947] Response Body: {"kind":"Table","apiVersion":"meta.k8s.io/v1beta1","metadata":{"selfLink":"/api/v1/namespaces/default/pods","resourceVersion":"14332801"},"columnDefinitions":完整報(bào)文太長(zhǎng),略去!}]}}}]} I0414 22:42:54.092067 16582 get.go:564] no kind "Table" is registered for version "meta.k8s.io/v1beta1" in scheme "k8s.io/kubernetes/pkg/api/legacyscheme/scheme.go:30" NAME READY STATUS RESTARTS AGE busybox 1/1 Running 970 39d nginx-1585049022-b4f4c56c9-dvspz 1/1 Running 24 12d nginx-deployment-5bd886c88c-28d6q 0/1 Pending 0 2d1h nginx-deployment-5bd886c88c-968pd 0/1 MatchNodeSelector 0 4d3h nginx-deployment-5bd886c88c-dnh8q 0/1 MatchNodeSelector 0 4d3h nginx-deployment-5bd886c88c-pk9xz 0/1 Pending 0 2d1h
再結(jié)合k8s官方的java sdk提供的CustomObjectsApi。比較輕松的就開(kāi)發(fā)了一整套chart鏡像生命周期對(duì)應(yīng)的接口。
var customObjectsApi = new CustomObjectsApi(apiClient); var json = new JsonObjectBuilder() .set("apiVersion", "app.alauda.io/v1alpha1") .set("kind", "HelmRequest") .set("metadata", new JsonObjectBuilder().set("name", name).build()) .set("spec", new JsonObjectBuilder() .set("chart", chart) .set("namespace", namespace) .set("releaseName", name) .set("values", Map2JsonUtil.map2Json(params)) .set("version", version) ).build(); customObjectsApi.createNamespacedCustomObject("app.alauda.io","v1alpha1", "default", "helmrequests", json, null);
var customObjectsApi = new CustomObjectsApi(apiClient); customObjectsApi.deleteNamespacedCustomObject("app.alauda.io", "v1alpha1", "default","helmrequests", "test-nginx",new V1DeleteOptions().gracePeriodSeconds(0L).propagationPolicy("Foreground"),null, null, null);
這里可以選擇打patch或者直接replace,和k8s的概念是一致的。
captain并沒(méi)有像deployment原生的提供了對(duì)回滾的支持,需要自己將每次安裝或者升級(jí)的參數(shù)進(jìn)行外部保存,再重新replace指定版本的參數(shù),進(jìn)行模擬回滾。
整體上,我們使用了三周的時(shí)間完成了應(yīng)用商店第一版的開(kāi)發(fā),以及頁(yè)面接口聯(lián)調(diào)。這比使用cli方式的預(yù)期快了很多,而且我們的ansbile部署腳本上只需要再額外添加兩行安裝captain的腳本。
使用私有helm repo,默認(rèn)情況下,集群內(nèi)的coredns將非集群內(nèi)的地址轉(zhuǎn)發(fā)到本機(jī)的/etc/resolv.conf
,這個(gè)時(shí)候一定要確保k8s宿主機(jī)的/etc/resolv.conf
dns地址修改為內(nèi)網(wǎng)的dns server地址。否則captain controller找不到私有的helm repo,錯(cuò)誤是 timeout。
在開(kāi)發(fā)過(guò)程中,如果遇到問(wèn)題無(wú)法定位,可以直接查看captain-controller的log,來(lái)進(jìn)行處理。
網(wǎng)絡(luò)問(wèn)題最好部署一個(gè)busybox,內(nèi)置了nslookup,wget等工具。方便網(wǎng)絡(luò)檢測(cè)。
apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: - name: busybox image: busybox:1.28.4 command: - sleep - "3600" imagePullPolicy: IfNotPresent restartPolicy: Always
使用kubectl create -f busybox.yaml
完成busybox部署,使用kubectl exec -it busybox sh
進(jìn)入容器內(nèi)部,使用nslookup
,wget
等進(jìn)行網(wǎng)絡(luò)檢測(cè)。
關(guān)于怎么使用helm-controller簡(jiǎn)化容器云平臺(tái)應(yīng)用商店的開(kāi)發(fā)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
文章名稱:怎么使用helm-controller簡(jiǎn)化容器云平臺(tái)應(yīng)用商店的開(kāi)發(fā)
本文地址:http://bm7419.com/article46/igcghg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)、定制開(kāi)發(fā)、面包屑導(dǎo)航、網(wǎng)站建設(shè)、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)