怎么使用helm-controller簡(jiǎn)化容器云平臺(tái)應(yīng)用商店的開(kāi)發(fā)

這篇文章給大家介紹怎么使用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-controller簡(jiǎn)化容器云平臺(tái)應(yīng)用商店的開(kāi)發(fā)

helm是啥

helm是k8s的包管理器,也是k8s平臺(tái)復(fù)雜應(yīng)用部署事實(shí)上的標(biāo)準(zhǔn)。包含了應(yīng)用打包,部署,升級(jí),回滾,卸載等符合生命周期管理的功能。

架構(gòu)變動(dòng)

helm從v2到v3的版本升級(jí),移除了重要的一個(gè)組件tiller,整體架構(gòu)更簡(jiǎn)潔。

helm架構(gòu)在云管理平臺(tái)開(kāi)發(fā)中的不足

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ā)。

captain

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。

快速安裝測(cè)試

安裝步驟:

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

chart repo問(wèn)題

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)題。

RBAC權(quán)限問(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 sdk問(wèn)題

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);
升級(jí)

這里可以選擇打patch或者直接replace,和k8s的概念是一致的。

回滾

captain并沒(méi)有像deployment原生的提供了對(duì)回滾的支持,需要自己將每次安裝或者升級(jí)的參數(shù)進(jìn)行外部保存,再重新replace指定版本的參數(shù),進(jìn)行模擬回滾。

其他說(shuō)明

  • 整體上,我們使用了三周的時(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.confdns地址修改為內(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)部,使用nslookupwget等進(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)

成都做網(wǎng)站