如何創(chuàng)作一個(gè)自己的HelmChart-創(chuàng)新互聯(lián)

如何創(chuàng)作一個(gè)自己的Helm Chart,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

公司主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè)、做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。成都創(chuàng)新互聯(lián)推出商州免費(fèi)做網(wǎng)站回饋大家。

前言

我們平時(shí)在日常生活中會(huì)經(jīng)常在不同的平臺(tái)上與各種各樣的應(yīng)用打交道,比如從蘋(píng)果的 App Store 里下載的淘寶、高德、支付寶等應(yīng)用,或者是在 PC 端安裝的 Word、Photoshop、Steam。這些各類(lèi)平臺(tái)上的應(yīng)用程序,對(duì)用戶(hù)而言,大多只需要點(diǎn)擊安裝就可使用。

然而,在云 (Kubernetes)上,部署一個(gè)應(yīng)用往往卻不是那么簡(jiǎn)單。如果想要部署一個(gè)應(yīng)用程序到云上,首先要準(zhǔn)備好它所需要的環(huán)境,打包成 Docker 鏡像,進(jìn)而把鏡像放在部署文件 (Deployment) 中、配置服務(wù) (Service)、應(yīng)用所需的賬戶(hù) (ServiceAccount) 及權(quán)限 (Role)、命名空間 (Namespace)、密鑰信息 (Secret)、可持久化存儲(chǔ) (PersistentVolumes) 等資源。也就是編寫(xiě)一系列互相相關(guān)的 YAML 配置文件,將它們部署在 Kubernetes 集群上。

但是即便應(yīng)用的開(kāi)發(fā)者可以把這些 Docker 鏡像存放在公共倉(cāng)庫(kù)中,并且將所需的 YAML 資源文件提供給用戶(hù),用戶(hù)仍然需要自己去尋找這些資源文件,并把它們一一部署。倘若用戶(hù)希望修改開(kāi)發(fā)者提供的默認(rèn)資源,比如使用更多的副本 (Replicas) 或是修改服務(wù)端口 (Port),他還需要自己去查需要在這些資源文件的哪些地方修改,更不用提版本變更與維護(hù)會(huì)給開(kāi)發(fā)者和用戶(hù)造成多少麻煩了。

可見(jiàn)最原始的 Kubernetes 應(yīng)用形態(tài)并不便利。


Helm 與 Helm Chart

在這樣的大環(huán)境下,有一系列基于 Kubernetes 的應(yīng)用包管理工具橫空出世。而我們今天的主角 Helm,就是這其中最受歡迎的選擇之一。

開(kāi)發(fā)者按照 Helm Chart 的格式,將應(yīng)用所需的資源文件包裝起來(lái),通過(guò)模版化 (Templating) 的方式將一些可變字段(比如我們之前提到的暴露哪個(gè)端口、使用多少副本)暴露給用戶(hù),最后將封裝好的應(yīng)用包,也就是 Helm Chart,集中存放在統(tǒng)一的倉(cāng)庫(kù)中供用戶(hù)瀏覽下載。

站在用戶(hù)角度,用戶(hù)只需要一行簡(jiǎn)單的命令就可以完成應(yīng)用的安裝、卸載與升級(jí)。對(duì)于安裝之后狀態(tài),也可以通過(guò) helm list 或者是原生的 kubectl 進(jìn)行查詢(xún)。

$ helm install redis stable/redis
$ kubectl get pods
NAME                  READY       STATUS     RESTARTS           AGE
redis-master-0        1/1         Running    0                  63s
redis-slave-0-0       1/1         Running    0                  63s
redis-slave-1-0       1/1         Running    0                  13s
$ helm delete redis

創(chuàng)作 Helm Chart

那么站在開(kāi)發(fā)者的角度上,我們應(yīng)該如何去創(chuàng)作一個(gè) Helm 應(yīng)用包呢?

準(zhǔn)備工作

首先我們需要一個(gè)準(zhǔn)備部署的鏡像。這個(gè)鏡像可以是一個(gè) Java 程序、一個(gè) Python 腳本、甚至是一個(gè)空的 linux 鏡像跑幾條命令。

這里我們使用一個(gè)簡(jiǎn)單的基于 golang 的 hello world HTTP 服務(wù)。該服務(wù)通過(guò)讀取環(huán)境變量 USERNAME 獲得用戶(hù)自己定義的名稱(chēng),然后監(jiān)聽(tīng) 80 端口。對(duì)于任意 HTTP 請(qǐng)求,返回 Hello ${USERNAME}。比如如果設(shè)置 USERNAME=world(默認(rèn)場(chǎng)景),該服務(wù)會(huì)返回 Hello world

然后我們使用 Dockerfile 對(duì)鏡像進(jìn)行打包。先對(duì) Golang 代碼進(jìn)行編譯,然后將編譯后的程序放在基于 alpine 的鏡像中,以縮小鏡像體積。

在 Docker 構(gòu)建好鏡像之后,我們把鏡像上傳到倉(cāng)庫(kù)中,比如 Docker Hub 或是阿里云容器鏡像倉(cāng)庫(kù)。準(zhǔn)備工作做好之后,我們就可以開(kāi)始創(chuàng)作 Helm Chart 了。

開(kāi)始創(chuàng)作

運(yùn)行 helm create my-hello-world,會(huì)得到一個(gè) helm 自動(dòng)生成的空 chart。這個(gè) chart 里的名稱(chēng)是 my-hello-world需要注意的是,Chart 里面的 my-hello-world 名稱(chēng)需要和生成的 Chart 文件夾名稱(chēng)一致。如果修改 my-hello-world,則需要做一致的修改。 現(xiàn)在,我們看到 Chart 的文件夾目錄如下:

my-hello-world
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   └── service.yaml
└── values.yaml

在根目錄下的 Chart.yaml 文件內(nèi),聲明了當(dāng)前 Chart 的名稱(chēng)、版本等基本信息,這些信息會(huì)在該 Chart 被放入倉(cāng)庫(kù)后,供用戶(hù)瀏覽檢索。比如我們可以把 Chart 的 Description 改成 "My first hello world helm chart"。在 Chart.yaml 里有兩個(gè)跟版本相關(guān)的字段,其中 version 指明的是 Chart 的版本,也就是我們應(yīng)用包的版本;而 appVersion 指明的是內(nèi)部實(shí)際使用的應(yīng)用版本。

在 templates 文件夾內(nèi)存放了各類(lèi)應(yīng)用部署所需要使用的 YAML 文件,比如 Deployment 和 Service。在我們當(dāng)前的應(yīng)用內(nèi),我們只需要一個(gè) deployment,而有的應(yīng)用可能包含不同組件,需要多個(gè) deployments,那么我們就可以在 templates 文件夾下放置 deploymentA、deploymentB 等。同樣的,如果我們需要配置 serviceaccount, secret, volumes 等內(nèi)容,也可以在里面添加相應(yīng)的配置文件。

apiVersion: apps/v1beta2
kind: Deployment
metadata:
 name: {{ template "my-hello-world.fullname" . }}
 labels:
{{ include "my-hello-world.labels" . | indent 4 }}
spec:
 replicas: {{ .Values.replicaCount }}
 selector:
   matchLabels:
     app.kubernetes.io/name: {{ include "my-hello-world.name" . }}
     app.kubernetes.io/instance: {{ .Release.Name }}
 template:
   metadata:
     labels:
       app.kubernetes.io/name: {{ include "my-hello-world.name" . }}
       app.kubernetes.io/instance: {{ .Release.Name }}
   spec:
     containers:
       - name: {{ .Chart.Name }}
         image: "{{ .Values.image.repository }}:{{ .Chart.AppVersion }}"
         imagePullPolicy: {{ .Values.image.pullPolicy }}
         env:
           - name: USERNAME
             value: {{ .Values.Username }}
......

Helm Chart 對(duì)于應(yīng)用的打包,不僅僅是將 Deployment 和 Service 以及其它資源整合在一起。我們看到 deployment.yaml 和 service.yaml 文件被放在 templates/ 文件夾下,相較于原生的 Kubernetes 配置,多了很多渲染所用的可注入字段。比如在 deployment.yaml 的 spec.replicas 中,使用的是 .Values.replicaCount 而不是 Kubernetes 本身的靜態(tài)數(shù)值。這個(gè)用來(lái)控制應(yīng)用在 Kubernetes 上應(yīng)該有多少運(yùn)行副本的字段,在不同的應(yīng)用部署環(huán)境下可以有不同的數(shù)值,而這個(gè)數(shù)值便是由注入的 Values 提供。

replicaCount: 1
image:
 repository: somefive/hello-world
 pullPolicy: IfNotPresent
nameOverride: ""
fullnameOverride: ""
service:
 type: ClusterIP
 port: 80
......
Username: AppHub

在根目錄下我們看到有一個(gè) values.yaml 文件,這個(gè)文件提供了應(yīng)用在安裝時(shí)的默認(rèn)參數(shù)。在默認(rèn)的 Values 中,我們看到 replicaCount: 1,說(shuō)明該應(yīng)用在默認(rèn)部署的狀態(tài)下只有一個(gè)副本。

為了使用我們要部署應(yīng)用的鏡像,我們看到 deployment.yaml 中,在 spec.template.spec.containers 里, image 和 imagePullPolicy 都使用了 Values 中的值。其中 image 字段由 .Values.image.repository 和 .Chart.AppVersion 組成。

看到這里,同學(xué)們應(yīng)該就知道需要變更的字段了:一個(gè)是位于 values.yaml 內(nèi)的 image.repository,另一個(gè)是位于 Chart.yaml 里的 AppVersion。將它們與我們需要部署應(yīng)用的 docker 鏡像匹配起來(lái),這里我們把 values.yaml 里的 image.repository 設(shè)置成 somefive/hello-world,把 Chart.yaml 里的 AppVersion 設(shè)置成 1.0.0 即可。

類(lèi)似的,我們可以查看 service.yaml 內(nèi)要部署的服務(wù),其中的主要配置也在 values.yaml 中。默認(rèn)生成的服務(wù)將 80 端口暴露在 Kubernetes 集群內(nèi)部。我們暫時(shí)不需要對(duì)這一部分進(jìn)行修改。

由于部署的 hello-world 服務(wù)會(huì)從環(huán)境變量中讀取 USERNAME 環(huán)境變量,所以將這個(gè)配置加入 deployment.yaml。

- name: {{ .Chart.Name }}
  image: "{{ .Values.image.repository }}:{{ .Chart.AppVersion }}"
  imagePullPolicy: {{ .Values.image.pullPolicy }}
  env:
  - name: USERNAME
    value: {{ .Values.Username }}

現(xiàn)在我們的 deployment.yaml 模版會(huì)從 values.yaml 中加載 Username 字段,因此相應(yīng)的,我們也在 values.yaml 中添加 Username: AppHub。這樣,我們的應(yīng)用就會(huì)從 values.yaml 中讀取 Username,把它放入鏡像的環(huán)境變量中啟動(dòng)了。

校驗(yàn)打包

在準(zhǔn)備好我們的應(yīng)用后,我們可以使用 Helm lint 來(lái)粗略地檢查一下制作的 Chart 有沒(méi)有什么語(yǔ)法上的錯(cuò)誤。如果沒(méi)有問(wèn)題的話(huà),就可以使用 helm package 命令對(duì)我們的 Chart 文件夾進(jìn)行打包,打包后我們可以得到一個(gè) my-hello-world-0.1.0.tgz 的應(yīng)用包。這個(gè)便是我們完成的應(yīng)用了。

$ helm lint --strict my-hello-world
1 chart(s) linted, 0 chart(s) failed
    [INFO] Chart.yaml: icon is recommended
$ helm package my-hello-world

我們可以使用 helm install 命令嘗試安裝一下剛剛做好的應(yīng)用包,然后用 kubectl 查看一下運(yùn)行 pod 的狀態(tài)。通過(guò) port-forward 命令將該 pod 的端口映射到本地端口上,這個(gè)時(shí)候就可以通過(guò)訪(fǎng)問(wèn) localhost 來(lái)訪(fǎng)問(wèn)部署好的應(yīng)用了。

$ helm install my-hello-world-chart-test my-hello-world-0.1.0.tgz
$ kubectl get pods
NAME                                          READY    STATUS     RESTARTS    AGE
my-hello-world-chart-test-65d6c7b4b6-ptk4x-0  1/1      Running    0           4m3s
$ kubectl port-forward my-hello-world-chart-test-65d6c7b4b6-ptk4x 8080:80
$ curl localhost:8080
Hello AppHub
參數(shù)重載

有的同學(xué)可能會(huì)有疑惑,雖然我們應(yīng)用開(kāi)發(fā)者把可配置的信息暴露在 values.yaml 中,用戶(hù)使用應(yīng)用的時(shí)候想要修改該怎么辦呢?答案很簡(jiǎn)單,用戶(hù)只需要在 install 時(shí)使用 set 參數(shù),設(shè)置想要覆蓋的參數(shù)即可。

應(yīng)用開(kāi)發(fā)者在 Chart 的 values 配置中只是提供了默認(rèn)的安裝參數(shù),用戶(hù)也可以在安裝時(shí)指定自己的配置。類(lèi)似的,如果用戶(hù)可以用 upgrade 命令替代 install,實(shí)現(xiàn)在原有部署好的應(yīng)用的基礎(chǔ)上變更配置。

$ helm install my-app my-hello-world-0.1.0.tgz --set Username="Cloud Native"
$ helm install my-super-app my-hello-world-0.1.0.tgz -f my-values.yaml
$ helm upgrade my-super-app my-hello-world-0.1.0.tgz -f my-new-values.yaml
修改提示信息

我們注意到在安裝 Chart 指令運(yùn)行后,屏幕的輸出會(huì)出現(xiàn):

NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods -l "app=my-hello-world,release=my-hello-world-chart-test2" -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl port-forward $POD_NAME 8080:80

這里的注釋是由 Chart 中的 templates/NOTES.txt 提供的。

我們注意到原始的 NOTES 中,所寫(xiě)的 "app={{ template "my-hello-world.name" . }},release={{ .Release.Name }}" 和 deployment.yaml 中所寫(xiě)的配置不太一樣,可以把它改成 "app.kubernetes.io/name={{ template "my-hello-world.name" . }},app.kubernetes.io/instance={{ .Release.Name }}",將 values.yaml 中的 version 更新成 0.1.1。然后重新打包 Chart(運(yùn)行 helm package),得到新的 my-hello-world-0.1.1.tgz 之后,升級(jí)原有 Chart(運(yùn)行 helm upgrade my-hello-world-chart-test2 my-hello-world-0.1.1.tgz --set Username="New Chart"),就能看到更新過(guò)后的 NOTES 了。

NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods -l "app.kubernetes.io/name=my-hello-world,app.kubernetes.io/instance=my-hello-world-chart-test2" -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl port-forward $POD_NAME 8080:80

應(yīng)用分享

那么制作完成的應(yīng)用如何和其他人分享呢?Helm 官方推出的 ChartMuseum 提供了 Chart 倉(cāng)庫(kù)的構(gòu)建方法,使用它可以創(chuàng)建自己的 Chart 倉(cāng)庫(kù)。然而自行維護(hù)一個(gè)倉(cāng)庫(kù)本身成本不小,而且對(duì)于用戶(hù)而言如果每一個(gè)開(kāi)發(fā)者都是自己的倉(cāng)庫(kù),他就需要將所需應(yīng)用對(duì)應(yīng)的倉(cāng)庫(kù)都加入自己的檢索列表中,很不利于應(yīng)用的傳播與分享。

如何創(chuàng)作一個(gè)自己的Helm Chart

我們團(tuán)隊(duì)近期推出了開(kāi)放云原生應(yīng)用中心,Cloud Native App Hub,同步了各類(lèi)應(yīng)用,同時(shí)還提供了開(kāi)發(fā)者上傳應(yīng)用的渠道。

在我們的開(kāi)放云原生應(yīng)用中心中,應(yīng)用來(lái)自?xún)蓚€(gè)渠道:

  • 一方面,我們定期從一些國(guó)外的知名 Helm 倉(cāng)庫(kù)同步 Chart 資源,在同步的過(guò)程中,會(huì)對(duì) Chart 內(nèi)部使用的一部分 Docker 鏡像進(jìn)行同步替換(例如 gcr.io 或者 quay.io 的鏡像),方便國(guó)內(nèi)用戶(hù)訪(fǎng)問(wèn)使用;

  • 另一方面,我們和 Helm 官方庫(kù)一樣在 Github 上接受開(kāi)發(fā)者通過(guò) Pull Request 的形式提交自己的應(yīng)用。提交成功的應(yīng)用會(huì)在短期內(nèi)同步至云原生應(yīng)用中心,和其他官方應(yīng)用展示在一起供其他用戶(hù)使用。
    如何創(chuàng)作一個(gè)自己的Helm Chart

看完上述內(nèi)容,你們掌握如何創(chuàng)作一個(gè)自己的Helm Chart的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站標(biāo)題:如何創(chuàng)作一個(gè)自己的HelmChart-創(chuàng)新互聯(lián)
分享路徑:http://www.muchs.cn/article18/diejdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站策劃、品牌網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、網(wǎng)站排名、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化