玩K8S不得不會的HELM

      網友投稿 1087 2025-04-01

      一 基本概念

      helm 類似于Linux系統下的包管理器,如yum/apt等,可以方便快捷的將之前打包好的yaml文件快速部署進kubernetes內,方便管理維護。

      helm:一個命令行下客戶端工具,主要用于kubernetes應用chart的創建/打包/發布已經創建和管理和遠程Chart倉庫。

      Tiller:helm的服務端,部署于kubernetes內,Tiller接受helm的請求,并根據chart生成kubernetes部署文件(helm稱為release),然后提交給 Kubernetes 創建應用。Tiller 還提供了 Release 的升級、刪除、回滾等一系列功能。

      Chart: helm的軟件包,采用tar格式,其中包含運行一個應用所需的所有鏡像/依賴/資源定義等,還可能包含kubernetes集群中服務定義

      Release:在kubernetes中集群中運行的一個Chart實例,在同一個集群上,一個Chart可以安裝多次,每次安裝均會生成一個新的release。

      Repository:用于發布和存儲Chart的倉庫

      玩K8S不得不會的HELM

      簡單來說:

      helm的作用:像centos7中的yum命令一樣,管理軟件包,只不過helm這兒管理的是在k8s上安裝的各種容器。

      tiller的作用:像centos7的軟件倉庫一樣,簡單說類似于/etc/yum.repos.d目錄下的xxx.repo。

      二 組件架構

      三 工作原理

      3.1 Chart install

      helm從制定目錄或tar文件解析chart結構信息

      helm將制定的chart結構和value信息通過gRPC協議傳遞給tiller

      tiller根據chart和values生成一個release

      tiller通過json將release發送給kubernetes,生成release

      3.2 Chart update

      helm從制定的目錄或tar文件解析chart結構信息

      helm將制定的chart結構和value信息通過gRPC協議傳給tiller

      tiller生成release并更新制定名稱的release的history

      tiller將release信息發送給kubernetes用于更新release

      3.3 Chart Rollback

      helm將會滾的release名稱傳遞給tiller

      tiller根據release名稱查找history

      tiller從history中獲取到上一個release

      tiller將上一個release發送給kubernetes用于替換當前release

      3.4 Chart處理依賴

      Tiller 在處理 Chart 時,直接將 Chart 以及其依賴的所有 Charts 合并為一個 Release,同時傳遞給 Kubernetes。因此 Tiller 并不負責管理依賴之間的啟動順序。Chart 中的應用需要能夠自行處理依賴關系。

      四 安裝部署

      4.1 v2版本安裝

      4.1.1 安裝helm

      #?在helm客戶端主機上,一般為master主機?wget?https://get.helm.sh/helm-v2.14.2-linux-amd64.tar.gz?tar?xf?helm-v2.14.2-linux-amd64.tar.gz?mv?helm?/usr/local/bin/?helm?version?復制代碼

      4.1.2 初始化tiller

      初始化tiller會自動讀取~/.kube目錄,所以需要確保config文件存在并認證成功

      tiller配置rbac,新建rabc-config.yaml并應用

      #?在:https://github.com/helm/helm/blob/master/docs/rbac.md?可以找到rbac-config.yaml?cat?>?rbac-config.yaml?<

      制定鏡像

      docker?pull?jessestuart/tiller:v2.14.2?yum?install?socat??#?yum?install?socat?docker?tag?jessestuart/tiller:v2.14.2?gcr.io/kubernetes-helm/tiller:v2.14.2?helm?init?-i?gcr.io/kubernetes-helm/tiller:v2.9.0??#?需要注意點參數?–client-only:也就是不安裝服務端應用,這在?CI&CD?中可能需要,因為通常你已經在?k8s?集群中安裝好應用了,這時只需初始化?helm?客戶端即可;?–history-max:最大歷史,當你用?helm?安裝應用的時候,helm?會在所在的?namespace?中創建一份安裝記錄,隨著更新次數增加,這份記錄會越來越多;?–tiller-namespace:默認是?kube-system,你也可以設置為其它?namespace;?復制代碼

      修改鏡像

      #?由于gfw原因,可以利用此鏡像https://hub.docker.com/r/jessestuart/tiller/tags?kubectl?edit?deployment?-n?kube-system?tiller-deploy?image:?jessestuart/tiller:v2.14.0?復制代碼

      異常處理

      Error:?Looks?like?"https://kubernetes-charts.storage.googleapis.com"?is?not?a?valid?chart?repository?or?cannot?be?reached:?Get?https://kubernetes-charts.storage.googleapis.com/index.yaml:?read?tcp?10.2.8.44:49020->216.58.220.208:443:?read:?connection?reset?by?peer?解決方案:更換源:helm?repo?add?stable?https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts?然后在helm?init?注意:tiller可能運行在node節點,將tiller鏡像下載到node節點并修改tag?復制代碼

      查看版本

      [root@master?~]#?helm?version?Client:?&version.Version{SemVer:"v2.14.2",?GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7",?GitTreeState:"clean"}?Server:?&version.Version{SemVer:"v2.14.2+unreleased",?GitCommit:"d953c6875cfd4b351a1e8205081ea8aabad7e7d4",?GitTreeState:"dirty"}?復制代碼

      4.2 helm3 安裝部署

      由于國外很多鏡像網站國內無法訪問,例如gcr.io ,建議使用阿里源,developer.aliyun.com/hub。

      AppHub 是一個托管在國內公有云上、全公益性的 Helm Hub “中國站”,它的后端由阿里云容器平臺團隊的三位工程師利用 20% 時間開發完成。

      而這個站點的一個重要職責,就是把所有 Helm 官方 Hub 托管的應用自動同步到國內;同時,自動將 Charts 文件中的 gcr.io 等所有有網絡訪問問題的 URL 替換成為穩定的國內鏡像 URL。

      目前helm3已經不依賴于tiller,Release 名稱可在不同 ns 間重用。

      4.2.1 安裝helm

      Helm3 不需要安裝tiller,下載到 Helm 二進制文件直接解壓到 $PATH 下就可以使用了。

      cd?/opt?&&?wget?https://cloudnativeapphub.oss-cn-hangzhou.aliyuncs.com/helm-v3.0.0-alpha.1-linux-amd64.tar.gz?tar?-xvf?helm-v3.0.0-alpha.1-linux-amd64.tar.gz?mv?linux-amd64?helm3?mv?helm3/helm?helm3/helm3?chown?root.root?helm3?-R?cat?>?/etc/profile.d/helm3.sh?<

      4.2.2 使用helm3安裝應用

      helm?repo?add?apphub?https://apphub.aliyuncs.com?helm?search?guestbook?helm?install?guestbook?apphub/guestbook?復制代碼

      五 使用

      5.1 基礎命令

      http://hub.kubeapps.com/?completion??#?為指定的shell生成自動完成腳本(bash或zsh)?create??????#?創建一個具有給定名稱的新?chart?delete??????#?從?Kubernetes?刪除指定名稱的?release?dependency??#?管理?chart?的依賴關系?fetch???????#?從存儲庫下載?chart?并(可選)將其解壓縮到本地目錄中?get?????????#?下載一個命名?release?help????????#?列出所有幫助信息?history?????#?獲取?release?歷史?home????????#?顯示?HELM_HOME?的位置?init????????#?在客戶端和服務器上初始化Helm?inspect?????#?檢查?chart?詳細信息?install?????#?安裝?chart?存檔?lint????????#?對?chart?進行語法檢查?list????????#?releases?列表?package?????#?將?chart?目錄打包成?chart?檔案?plugin??????#?添加列表或刪除?helm?插件?repo????????#?添加列表刪除更新和索引?chart?存儲庫?reset???????#?從集群中卸載?Tiller?rollback????#?將版本回滾到以前的版本?search??????#?在?chart?存儲庫中搜索關鍵字?serve???????#?啟動本地http網絡服務器?status??????#?顯示指定?release?的狀態?template????#?本地渲染模板?test????????#?測試一個?release?upgrade?????#?升級一個?release?verify??????#?驗證給定路徑上的?chart?是否已簽名且有效?version?????#?打印客戶端/服務器版本信息?dep?????????#?分析?Chart?并下載依賴?復制代碼

      指定value.yaml部署一個chart

      helm?install?--name?els1?-f?values.yaml?stable/elasticsearch?復制代碼

      升級一個chart

      helm?upgrade?--set?mysqlRootPassword=passwd?db-mysql?stable/mysql?helm?upgrade?go2cloud-api-doc?go2cloud-api-doc/??復制代碼

      回滾一個 chart

      helm?rollback?db-mysql?1?復制代碼

      刪除一個 release

      helm?delete?--purge?db-mysql?復制代碼

      只對模板進行渲染然后輸出,不進行安裝

      helm?install/upgrade?xxx?--dry-run?--debug?復制代碼

      5.2 Chart文件組織

      myapp/???????????????????????????????#?Chart?目錄?├──?charts???????????????????????????#?這個?charts?依賴的其他?charts,始終被安裝?├──?Chart.yaml???????????????????????#?描述這個?Chart?的相關信息、包括名字、描述信息、版本等?├──?templates????????????????????????#?模板目錄?│???├──?deployment.yaml??????????????#?deployment?控制器的?Go?模板文件?│???├──?_helpers.tpl?????????????????#?以?_?開頭的文件不會部署到?k8s?上,可用于定制通用信息?│???├──?ingress.yaml?????????????????#?ingress?的模板文件?│???├──?NOTES.txt????????????????????#?Chart?部署到集群后的一些信息,例如:如何使用、列出缺省值?│???├──?service.yaml?????????????????#?service?的?Go?模板文件?│???└──?tests?│???????└──?test-connection.yaml?└──?values.yaml??????????????????????#?模板的值文件,這些值會在安裝時應用到?GO?模板生成部署文件?復制代碼

      5.3 新建自己的Chart

      創建自己的mychart

      [root@master?mychart]#?helm?create?mychart?Creating?mychart?[root@master?mychart]#?ls?mychart?[root@master?mychart]#?tree?mychart/?mychart/?├──?charts?├──?Chart.yaml?├──?templates?│???├──?deployment.yaml?#?部署相關資源?│???├──?_helpers.tpl?#?模版助手?│???├──?ingress.yaml?#?ingress資源?│???├──?NOTES.txt?#?chart的幫助文本,運行helm?install展示給用戶?│???├──?service.yaml?#?service端點?│???└──?tests?│???????└──?test-connection.yaml?└──?values.yaml?3?directories,?8?files?復制代碼

      刪除template下的所有文件,并創建configmap

      rm?-rf?mychart/templates/*?#?我們首先創建一個名為?mychart/templates/configmap.yaml:?apiVersion:?v1?kind:?ConfigMap?metadata:???name:?mychart-configmap?data:???myvalue:?"Hello?World"?復制代碼

      安裝測試

      由于創建的yaml文件在template下,tiller讀取此文件,會將其發送給kubernetes。

      [root@master?mychart]#?helm?install?./mychart/?NAME:???enervated-dolphin?LAST?DEPLOYED:?Sun?Jul?21?09:29:13?2019?NAMESPACE:?default?STATUS:?DEPLOYED?RESOURCES:?==>?v1/ConfigMap?NAME???????????????DATA??AGE?mychart-configmap??1?????0s?[root@master?mychart]#?kubectl?get?cm?mychart-configmap?NAME????????????????DATA???AGE?mychart-configmap???1??????2m6s?[root@master?mychart]#?kubectl?describe?cm?mychart-configmap?Name:?????????mychart-configmap?Namespace:????default?Labels:????????Annotations:???Data?====?myvalue:?----?this?is?my?chart?configmap?Events:???[root@master?mychart]#?helm?get?manifest?enervated-dolphin?---?#?Source:?mychart/templates/configmap.yaml?apiVersion:?v1?kind:?ConfigMap?metadata:???name:?mychart-configmap?data:???myvalue:?"this?is?my?chart?configmap"?復制代碼

      該 helm get manifest 命令獲取 release 名稱(enervated-dolphin)并打印出上傳到服務器的所有 Kubernetes 資源。每個文件都以 --- 開始作為 YAML 文檔的開始,然后是一個自動生成的注釋行,告訴我們該模板文件生成的這個 YAML 文檔。

      從那里開始,我們可以看到 YAML 數據正是我們在我們的 configmap.yaml 文件中所設計的 。

      現在我們可以刪除我們的 release:helm delete enervated-dolphin。

      [root@master?mychart]#?helm?delete?enervated-dolphin?release?"enervated-dolphin"?deleted?復制代碼

      5.4 添加模版調用

      硬編碼 name: 成資源通常被認為是不好的做法。名稱應該是唯一的一個版本。所以我們可能希望通過插入 release 名稱來生成一個名稱字段。

      提示: name: 由于 DNS 系統的限制,該字段限制為 63 個字符。因此,release 名稱限制為 53 個字符。Kubernetes 1.3 及更早版本僅限于 24 個字符(即 14 個字符名稱)。

      修改下之前的configmap為如下內容

      apiVersion:?v1?kind:?ConfigMap?metadata:???name:?{{.Release.Name}}-configmap?data:???myvalue:?"Hello?World"?復制代碼

      name: 現在這個值發生了變化成了 {{.Release.Name}}-configmap。

      模板指令包含在 {{ 和 }} 塊中。

      模板指令 {{.Release.Name}} 將 release 名稱注入模板。傳遞給模板的值可以認為是 namespace 對象,其中 dot(.)分隔每個 namespace 元素。

      Release 前面的前一個小圓點表示我們從這個范圍的最上面的 namespace 開始(我們將稍微談一下 scope)。所以我們可以這樣理解 .Release.Name:"從頂層命名空間開始,找到 Release 對象,然后在里面查找名為 Name 的對象"。

      該 Release 對象是 Helm 的內置對象之一,稍后我們將更深入地介紹它。但就目前而言,這足以說明這會顯示 Tiller 分配給我們發布的 release 名稱。

      現在,當我們安裝我們的資源時,我們會立即看到使用這個模板指令的結果:

      [root@master?mychart]#?helm?install?./mychart/?NAME:???famous-peahen?LAST?DEPLOYED:?Sun?Jul?21?09:42:05?2019?NAMESPACE:?default?STATUS:?DEPLOYED?RESOURCES:?==>?v1/ConfigMap?NAME????????????????????DATA??AGE?famous-peahen-confgmap??1?????0s?[root@master?mychart]#?helm?get?manifest?famous-peahen?---?#?Source:?mychart/templates/configmap.yaml?apiVersion:?v1?kind:?ConfigMap?metadata:???name:?famous-peahen-confgmap?data:???myvalue:?"this?is?my?chart?configmap"?復制代碼

      我們看過了基礎的模板:YAML 文件嵌入了模板指令,通過 。在下一部分中,我們將深入研究模板。但在繼續之前,有一個快速技巧可以使構建模板更快:當您想測試模板渲染,但實際上沒有安裝任何東西時,可以使用 helm install --debug --dry-run ./mychart。這會將 chart 發送到 Tiller 服務器,它將渲染模板。但不是安裝 chart,它會將渲染模板返回,以便可以看到輸出:

      六 實戰

      6.1 制作charts

      將用slate做好的go2cloud-api-doc 利用helm做成charts,方便后續部署

      helm?create?go2cloud-api-doc?[root@master?go2cloud-api-doc]#?tree??.?├──?charts?├──?Chart.yaml?├──?templates?│???├──?deployment.yaml?│???├──?_helpers.tpl?│???├──?NOTES.txt?│???├──?service.yaml?│???└──?tests?│???????└──?test-connection.yaml?└──?values.yaml?3?directories,?8?files??#?配置?deployment?[root@master?go2cloud_api_doc_charts]#?egrep?"^$|^#"?-v?go2cloud-api-doc/templates/deployment.yaml???apiVersion:?apps/v1?kind:?Deployment?metadata:???name:?{{?include?"go2cloud-api-doc.fullname"?.?}}???labels:?{{?include?"go2cloud-api-doc.labels"?.?|?indent?4?}}?spec:???replicas:?{{?.Values.replicaCount?}}???selector:?????matchLabels:???????app.kubernetes.io/name:?{{?include?"go2cloud-api-doc.name"?.?}}???????app.kubernetes.io/instance:?{{?.Release.Name?}}???template:?????metadata:???????labels:?????????app.kubernetes.io/name:?{{?include?"go2cloud-api-doc.name"?.?}}?????????app.kubernetes.io/instance:?{{?.Release.Name?}}?????spec:???????imagePullSecrets:??????????-?name:?{{?.Values.imagePullSecrets?}}???????containers:?????????-?name:?{{?.Chart.Name?}}???????????image:?"{{?.Values.image.repository?}}:{{?.Values.image.tag?}}"???????????imagePullPolicy:?{{?.Values.image.pullPolicy?}}???????????ports:?????????????-?name:?http???????????????containerPort:?{{?.Values.service.port?}}???????????????protocol:?TCP???????????livenessProbe:?????????????{{-?toYaml?.Values.livenessProbe?|?nindent?12??}}???????????readinessProbe:?????????????{{-?toYaml?.Values.readinessProbe?|?nindent?12??}}???????????resources:?????????????{{-?toYaml?.Values.resources?|?nindent?12?}}???????{{-?with?.Values.nodeSelector?}}???????nodeSelector:?????????{{-?toYaml?.?|?nindent?8?}}???????{{-?end?}}?????{{-?with?.Values.affinity?}}???????affinity:?????????{{-?toYaml?.?|?nindent?8?}}?????{{-?end?}}?????{{-?with?.Values.tolerations?}}???????tolerations:?????????{{-?toYaml?.?|?nindent?8?}}?????{{-?end?}}??#?配置service?[root@master?go2cloud_api_doc_charts]#?egrep?"^$|^#"?-v?go2cloud-api-doc/templates/service.yaml??apiVersion:?v1?kind:?Service?metadata:???name:?{{?include?"go2cloud-api-doc.fullname"?.?}}???labels:?{{?include?"go2cloud-api-doc.labels"?.?|?indent?4?}}?spec:???type:?{{?.Values.service.type?}}???ports:?????-?port:?{{?.Values.service.port?}}???????targetPort:?{{?.Values.service.port?}}???????protocol:?TCP???????name:?http???????nodePort:?{{?.Values.service.nodePort?}}?????????selector:?????app.kubernetes.io/name:?{{?include?"go2cloud-api-doc.name"?.?}}?????app.kubernetes.io/instance:?{{?.Release.Name?}}??#?配置values?[root@master?go2cloud_api_doc_charts]#?egrep?"^$|^#|^[[:space:]]+#"?-v?go2cloud-api-doc/values.yaml?replicaCount:?1?image:???repository:?10.234.2.218/go2cloud/go2cloud-api-doc???tag:?latest???pullPolicy:?Always?imagePullSecrets:?registry-secret?nameOverride:?""?fullnameOverride:?""?service:???type:?NodePort???port:?4567???nodePort:?30567?ingress:???enabled:?false???annotations:?{}???hosts:?????-?host:?chart-example.local???????paths:?[]???tls:?[]?resources:????requests:?????cpu:?1000m?????memory:?1280Mi???limits:?????cpu:?1000m?????memory:?1280Mi?livenessProbe:???tcpSocket:?????port:?4567???initialDelaySeconds:?10???failureThreshold:?2????timeoutSeconds:?10?readinessProbe:???httpGet:?????path:?/#introduction?????port:?http???initialDelaySeconds:?5???failureThreshold:?2????timeoutSeconds:?30?nodeSelector:?{}?tolerations:?[]?affinity:?{}?[root@master?go2cloud_api_doc_charts]#?egrep?"^$|^#|^[[:space:]]+#"?-v?go2cloud-api-doc/Chart.yaml??apiVersion:?v1?appVersion:?"1.0"?description:?A?Helm?chart?for?Kubernetes?name:?go2cloud-api-doc?version:?0.1.0??#?部署?[root@master?go2cloud_api_doc_charts]#?helm?install?-n?go2cloud-api-doc?-f?go2cloud-api-doc/values.yaml?go2cloud-api-doc/???????????????????NAME:???go2cloud-api-doc?LAST?DEPLOYED:?Wed?Jul?31?14:34:21?2019?NAMESPACE:?default?STATUS:?DEPLOYED?RESOURCES:?==>?v1/Deployment?NAME??????????????READY??UP-TO-DATE??AVAILABLE??AGE?go2cloud-api-doc??0/1????1???????????0??????????0s?==>?v1/Pod(related)?NAME???????????????????????????????READY??STATUS?????????????RESTARTS??AGE?go2cloud-api-doc-7cfb7bb795-clrz8??0/1????ContainerCreating??0?????????0s?==>?v1/Service?NAME??????????????TYPE??????CLUSTER-IP?????EXTERNAL-IP??PORT(S)?????????AGE?go2cloud-api-doc??NodePort??10.96.228.251?????????4567:30567/TCP??0s?NOTES:?1.?Get?the?application?URL?by?running?these?commands:???export?NODE_PORT=$(kubectl?get?--namespace?default?-o?jsonpath="{.spec.ports[0].nodePort}"?services?go2cloud-api-doc)???export?NODE_IP=$(kubectl?get?nodes?--namespace?default?-o?jsonpath="{.items[0].status.addresses[0].address}")???echo?http://$NODE_IP:$NODE_PORT?[root@master?go2cloud_api_doc_charts]#?helm?ls?go2cloud-api-doc?NAME????????????????????REVISION????????UPDATED?????????????????????????STATUS??????????CHART???????????????????APP?VERSION?????NAMESPACE?go2cloud-api-doc????????1???????????????Wed?Jul?31?14:34:21?2019????????DEPLOYED????????go2cloud-api-doc-0.1.0??1.0?????????????default???[root@master?go2cloud_api_doc_charts]#?kubectl?get?deployment?go2cloud-api-doc?NAME???????????????READY???UP-TO-DATE???AVAILABLE???AGE?go2cloud-api-doc???0/1?????1????????????0???????????10m?[root@master?go2cloud_api_doc_charts]#?kubectl?get?pods?|grep?go2cloud-api-doc?go2cloud-api-doc-7cfb7bb795-clrz8?????????????????????????0/1?????CrashLoopBackOff???7??????????10m?[root@master?go2cloud_api_doc_charts]#?kubectl?get?svc?go2cloud-api-doc?NAME???????????????TYPE???????CLUSTER-IP??????EXTERNAL-IP???PORT(S)??????????AGE?go2cloud-api-doc???NodePort???10.96.228.251???????????4567:30567/TCP???10m??#?打包?[root@master?go2cloud_api_doc_charts]#?helm?package?./go2cloud-api-doc/?Successfully?packaged?chart?and?saved?it?to:?/data/go2cloud_api_doc_charts/go2cloud-api-doc-0.1.0.tgz?[root@master?go2cloud_api_doc_charts]#?tree??.?├──?go2cloud-api-doc?│???├──?charts?│???├──?Chart.yaml?│???├──?templates?│???│???├──?deployment.yaml?│???│???├──?_helpers.tpl?│???│???├──?NOTES.txt?│???│???├──?service.yaml?│???│???└──?tests?│???│???????└──?test-connection.yaml?│???└──?values.yaml?└──?go2cloud-api-doc-0.1.0.tgz?4?directories,?8?files??#?升級副本數量?helm?upgrade?go2cloud-api-doc?--set?replicaCount=2?go2cloud-api-doc/?復制代碼

      6.2 配置minior

      將制作好的charts存放到minio上,在k8s內部署minior

      創建本地chart目錄

      mkdir?minio-chart?復制代碼

      將修改好的chart文件打包

      helm?package?redis?復制代碼

      將包拷貝至創建的本地chart目錄中

      cp?redis-8.0.5.tgz?/root/minio-chart/?復制代碼

      更新/root/minio-chart/目錄下的index索引

      helm?repo?index?minio-chart/?--url?http://10.234.2.204:31311/minio/common-helm-repo/?復制代碼

      將index.yaml 和chart包上傳至minio

      mc?cp?index.yaml?minio/common-helm-repo/?mc?cp?redis-8.0.5.tgz?minio/common-helm-repo/?復制代碼

      將制作好的charts上傳至minio

      helm?repo?add?monocular?https://helm.github.io/monocular?helm?install?-n?monocular?monocular/monocular?mc?cp?go2cloud-api-doc-0.1.0.tgz?minio/common-helm-repo?復制代碼

      可以在${HOME}/.mc/config.json中查看ak密鑰信息。

      驗證

      6.3 上傳至公共的helm倉庫

      將制作好的charts包可以上傳至helm倉庫,可以放在自己的自建私有倉庫,流入:kubeapps/Monocular/minior等,可以利用helm命令一鍵安裝。

      上傳至公有云公共倉庫,例如國內的阿里目前創建的Apphub等,在現今的云原生生態當中,已經有很多成熟的開源軟件被制作成了 Helm Charts,使得用戶可以非常方便地下載和使用,比如 Nginx,Apache、Elasticsearch、Redis 等等。不過,在開放云原生應用中心 App hub(Helm Charts 中國站) 發布之前,國內用戶一直都很難直接下載使用這些 Charts。而現在,AppHub 不僅為國內用戶實時同步了官方 Helm Hub 里的所有應用,還自動替換了這些 Charts 里所有不可訪問的鏡像 URL(比如 gcr.io, quay.io 等),終于使得國內開發者通過 helm install “一鍵安裝”應用成為了可能。

      具體提交自己的charts可以參考:github.com/cloudnative…

      此為我上傳的slate chart,Slate helps you create beautiful, intelligent, responsive API documentation.

      developer.aliyun.com/hub/detail?…

      歡迎。

      七 相關鏈接

      helm githab地址

      helm 手冊

      whmzsu.github.io/helm-doc-zh…

      github.com/helm/monocu…

      Helm3

      GitHub Kubernetes

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:如何在Excel中生成隨機正負數?
      下一篇:excel2007最大的列數是多少(excel2007最多有多少行和列)
      相關文章
      亚洲精品人成在线观看| 国产亚洲AV无码AV男人的天堂 | 国产亚洲一区二区三区在线| 亚洲a∨无码精品色午夜| 亚洲欧美日韩一区二区三区| 亚洲日本一线产区和二线| 亚洲欧美aⅴ在线资源| 亚洲熟女www一区二区三区| 亚洲精品无码av片| www亚洲精品久久久乳| 国产午夜亚洲精品不卡免下载| 老司机亚洲精品影院在线观看| 豆国产96在线|亚洲| 亚洲成人影院在线观看| 亚洲精品色婷婷在线影院| 久久99亚洲综合精品首页 | 亚洲大尺码专区影院| 亚洲第一页在线播放| 亚洲国产成人精品无码一区二区 | JLZZJLZZ亚洲乱熟无码| 国产亚洲精久久久久久无码AV| 亚洲午夜福利717| 亚洲国产精彩中文乱码AV| 亚洲人成网www| 亚洲国产精品成人综合久久久 | 亚洲高清在线观看| 中文字幕亚洲精品资源网| 亚洲毛片免费观看| 国产精品亚洲综合五月天| 亚洲大码熟女在线观看| 国产亚洲成在线播放va| 精品亚洲一区二区三区在线观看| 日韩亚洲人成在线综合日本| 久久亚洲国产精品五月天| 亚洲综合激情六月婷婷在线观看| 亚洲av永久综合在线观看尤物| 亚洲熟妇AV日韩熟妇在线| 亚洲Av无码国产情品久久| 亚洲精品字幕在线观看| 日韩亚洲Av人人夜夜澡人人爽| 亚洲国产夜色在线观看|