Kubernetes之helm部署使用(轉)


轉自騰訊雲:https://cloud.tencent.com/developer/article/1696689

1. Helm的介紹

Helm就相當於kubernetes環境下的yum包管理工具。

1.1 用途

做為 Kubernetes 的一個包管理工具,Helm具有如下功能:

  • 創建新的 chart
  • chart 打包成 tgz 格式
  • 上傳 chart 到 chart 倉庫或從倉庫中下載 chart
  • 在Kubernetes集群中安裝或卸載 chart
  • 管理用Helm安裝的 chart 的發布周期

1.2 重要概念

Helm 有三個重要概念:

  • chart:包含了創建Kubernetes的一個應用實例的必要信息
  • config:包含了應用發布配置信息
  • release:是一個 chart 及其配置的一個運行實例

1.3 Helm組件

Helm 有以下兩個組成部分:

1.3.1 Helm Client 是用戶命令行工具,其主要負責如下:

  • 本地 chart 開發
  • 倉庫管理
  • 與 Tiller sever 交互
  • 發送預安裝的 chart
  • 查詢 release 信息
  • 要求升級或卸載已存在的 release

1.3.2 Tiller Server主要負責如

是一個部署在Kubernetes集群內部的 server,其與 Helm client、Kubernetes API server 進行交互

  • 監聽來自 Helm client 的請求
  • 通過 chart 及其配置構建一次發布
  • 安裝 chart 到Kubernetes集群,並跟蹤隨后的發布
  • 通過與Kubernetes交互升級或卸載 chart
  • 簡單的說,client 管理 charts,而 server 管理發布 release

2. Helm的安裝部署

下載客戶端安裝包安裝

wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz
tar -xf helm-v2.14.3-linux-amd64.tar.gz
cd helm-v2.14.3-linux-amd64/
cp helm /usr/local/bin/

通過腳本下載安裝

$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
$ chmod 700 get_helm.sh
$ ./get_helm.sh

helm 服務端安裝Tiller。默認會部署swift和tiller這2個pod在kube-system命名空間下

[root@VM-6-17-centos helm-data]# helm init
[root@VM-6-17-centos helm-data]# kubectl get pod -n kube-system 
NAME                                    READY   STATUS    RESTARTS   AGE
swift-566d576-jtv9q                     2/2     Running   0          22h
tiller-deploy-698956c985-brzps          1/1     Running   1          33h

安裝正常后可以通過查看helm版本來檢查客戶端和服務端是否安裝正常

[root@VM-6-17-centos helm-data]# helm version
Client: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}

另外一個值得注意的問題是RBAC,我們的 kubernetes 集群是1.8.x版本的,默認開啟了RBAC訪問控制,所以我們需要為Tiller創建一個ServiceAccount,讓他擁有執行的權限,詳細內容可以查看 Helm 文檔中的Role-based Access Control創建rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
 name: tiller
 namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: tiller
  namespace: kube-system

然后使用kubectl創建:

$ kubectl create -f rbac-config.yaml
serviceaccount "tiller" created
clusterrolebinding "tiller" created

創建了tiller的 ServceAccount 后還沒完,因為我們的 Tiller 之前已經就部署成功了,而且是沒有指定 ServiceAccount 的,所以我們需要給 Tiller 打上一個 ServiceAccount 的補丁:

$ kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

至此, Helm客戶端和服務端都配置完成了,接下來我們看看如何使用吧。

安裝遇到的問題

1. 由於 Helm 默認會去gcr.io拉取鏡像,所以如果你當前執行的機器沒有配置科學network的話可以實現下面的命令代替:

helm init -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --stable-repo-url http://mirror.azure.cn/kubernetes/charts/ --service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed 's@apiVersion: extensions/v1beta1@apiVersion: apps/v1@' | kubectl apply -f -

2. 我在安裝過程中遇到了一些其他問題,比如初始化的時候出現了如下錯誤:

E0125 14:03:19.093131   56246 portforward.go:331] an error occurred forwarding 55943 -> 44134: error forwarding port 44134 to pod d01941068c9dfea1c9e46127578994d1cf8bc34c971ff109dc6faa4c05043a6e, uid : unable to do port forwarding: socat not found.
2018/01/25 14:03:19 (0xc420476210) (0xc4203ae1e0) Stream removed, broadcasting: 3
2018/01/25 14:03:19 (0xc4203ae1e0) (3) Writing data frame
2018/01/25 14:03:19 (0xc420476210) (0xc4200c3900) Create stream
2018/01/25 14:03:19 (0xc420476210) (0xc4200c3900) Stream added, broadcasting: 5
Error: cannot connect to Tiller

解決方案:在節點上安裝socat可以解決

$ sudo yum install -y socat

3. helm的使用

3.1 倉庫

[root@master hello-helm]# helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879/charts

替換 repo 為阿里鏡像

root@rancherk8sm1:~# helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879/charts

root@rancherk8sm1:~# helm repo remove stable
"stable" has been removed from your repositories

root@rancherk8sm1:~# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"stable" has been added to your repositories

root@rancherk8sm1:~# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈

root@rancherk8sm1:~# helm repo list
NAME URL
local http://127.0.0.1:8879/charts
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

我們可以在本地啟動一個 Repository Server,並將其加入到 Helm Repo 列表中。Helm Repository 必須以 Web 服務的方式提供,這里我們就使用 helm serve 命令啟動一個 Repository Server,該 Server 缺省使用 $HOME/.helm/repository/local 目錄作為 Chart 存儲,並在 8879 端口上提供服務。

$ helm serve &
Now serving you on 127.0.0.1:8879

默認情況下該服務只監聽 127.0.0.1,如果你要綁定到其它網絡接口,可使用以下命令:

$ helm serve --address 192.168.100.211:8879 &

如果你想使用指定目錄來做為 Helm Repository 的存儲目錄,可以加上 --repo-path 參數:

$ helm serve --address 192.168.100.211:8879 --repo-path /data/helm/repository/ --url http://192.168.100.211:8879/charts/

通過 helm repo index 命令將 Chart 的 Metadata 記錄更新在 index.yaml 文件中:

# 更新 Helm Repository 的索引文件
$ cd /home/k8s/.helm/repository/local
$ helm repo index --url=http://192.168.100.211:8879 .

完成啟動本地 Helm Repository Server 后,就可以將本地 Repository 加入 Helm 的 Repo 列表。

$ helm repo add local http://127.0.0.1:8879
"local" has been added to your repositories

3.2 查找chart

helm search 

如果沒有使用過濾條件,helm search 顯示所有可用的 charts

helm search mysql
helm inspect stable/mysql

使用 inspect 命令可以查看到該 chart 里面所有描述信息,包括運行方式、配置信息等等。

3.3 安裝chart

helm install stable/mysql

安裝 chart 會創建一個新 release 對象。上面的 release 被命名為 torrid-gnat

helm install stable/mysql --name mydb

如果你想使用你自己的 release 名稱,只需使用--name參數指定即可

helm status mydb

要跟蹤 release 狀態或重新讀取配置信息,可以使用 helm status 查看

3.4 自定義chart

helm inspect values stable/mysql

要查看 chart 上可配置的選項,使用helm inspect values命令即可,比如我們這里查看上面的 mysql 的配置選項:

然后,我們可以直接在 YAML 格式的文件中來覆蓋上面的任何配置,在安裝的時候直接使用該配置文件即可:(config.yaml)

mysqlUser: haimaxyUser
mysqlDatabase: haimaxyDB
service:
 type: NodePort

我們這里通過 config.yaml 文件定義了 mysqlUser 和 mysqlDatabase,並且把 service 的類型更改為了 NodePort,然后現在我們來安裝的時候直接指定該 yaml 文件:

$ helm install -f config.yaml stable/mysql --name mydb

可以看到當前 release 的名字已經變成 mydb 了。然后可以查看下 mydb 關聯的 Service 是否變成 NodePort 類型的了:

$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1  <none> 443/TCP 110d
mewing-squid-mysql ClusterIP 10.108.197.48 <none> 3306/TCP 46m
mydb-mysql NodePort 10.96.150.198 <none> 3306:32604/TCP 8m

看到服務 mydb-mysql 變成了 NodePort 類型的,二之前默認創建的 mewing-squid-mysql 是 ClusterIP 類型的,證明上面我們通過 YAML 文件來覆蓋 values 是成功的。

接下來我們查看下 Pod 的狀況:

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mewing-squid-mysql-69f587bdf9-z7glv 0/1 Pending 0 49m
mydb-mysql-dfc999888-hbw5d 0/1 Pending 0 11m

比較奇怪的是之前默認創建的和現在的 mydb 的 release 創建的 Pod 都是 Pending 狀態,直接使用 describe 命令查看下:

$ kubectl describe pod mydb-mysql-dfc999888-hbw5d
Name: mydb-mysql-dfc999888-hbw5d
Namespace:  default
Node: <none>
Labels: app=mydb-mysql
 pod-template-hash=897555444
...
Events:
 Type Reason Age From Message
 ---- ------ ---- ---- -------
 Warning FailedScheduling 2m (x37 over 12m) default-scheduler pod has unbound PersistentVolumeClaims (repeated 2 times)

我們可以發現兩個 Pod 處於 Pending 狀態的原因都是 PVC 沒有被綁定上,所以這里我們可以通過 storageclass 或者手動創建一個合適的 PV 對象來解決這個問題。

另外為了說明 helm 更新的用法,我們這里來直接禁用掉數據持久化,可以在上面的config.yaml 文件中設置:

persistence:
 enabled: false

另外一種方法就是在安裝過程中使用--set來覆蓋對應的 value 值,比如禁用數據持久化,我們這里可以這樣來覆蓋:

$ helm install stable/mysql --set persistence.enabled=false --name mydb

3.5 升級chart

我們這里將數據持久化禁用掉來對上面的 mydb 進行升級:

$ echo config.yaml
mysqlUser: haimaxyUser
mysqlDatabase: haimaxyDB
service:
 type: NodePort
persistence:
 enabled: false
$ helm upgrade -f config.yaml mydb stable/mysql
helm upgrade -f config.yaml mydb stable/mysql
Release "mydb" has been upgraded. Happy Helming!
LAST DEPLOYED: Wed Sep 5 00:38:33 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
...

可以看到已經變成 DEPLOYED 狀態了,現在我們再去看看 Pod 的狀態呢:

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mewing-squid-mysql-69f587bdf9-z7glv 0/1 Pending 0 1h
mydb-mysql-6ffc84bbf6-lcn4d 0/1 PodInitializing 0 49s

我們可以看到現在沒有任何關於 PVC 的錯誤信息了,這是因為我們剛剛更新的版本中就是禁用掉了的數據持久化的,證明 helm upgrade 和 –values 是生效了的。現在我們使用 helm ls 命令查看先當前的 release:

$ helm ls
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
mewing-squid 1 Tue Sep 4 23:31:23 2018 DEPLOYED mysql-0.10.1 5.7.14 default
mydb 2 Wed Sep 5 00:38:33 2018 DEPLOYED mysql-0.10.1 5.7.14 default

可以看到 mydb 這個 release 的REVISION已經變成2了,這是因為 release 的版本是遞增的,每次安裝、升級或者回滾,版本號都會加1,第一個版本號始終為1,同樣我們可以使用 helm history 命令查看 release 的歷史版本:

$ helm history mydb
REVISION UPDATED STATUS CHART DESCRIPTION
1 Wed Sep 5 00:09:44 2018 SUPERSEDED mysql-0.10.1 Install complete
2 Wed Sep 5 00:38:33 2018 DEPLOYED mysql-0.10.1 Upgrade complete

當然如果我們要回滾到某一個版本的話,使用 helm rollback 命令即可,比如我們將 mydb 回滾到上一個版本:

$ helm rollback mydb 1

3.6 刪除chart

我們就學習了要刪除一個 release 直接使用 helm delete 命令就 OK:

$ helm delete mewing-squid
release "mewing-squid" deleted

這將從集群中刪除該 release,但是這並不代表就完全刪除了,我們還可以通過--deleted參數來顯示被刪除掉 release:

$ helm list --deleted
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
mewing-squid 1 Tue Sep 4 23:31:23 2018 DELETED mysql-0.10.1 5.7.14 default
$ helm list --all
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
mewing-squid 1 Tue Sep 4 23:31:23 2018 DELETED mysql-0.10.1 5.7.14 default
mydb 2 Wed Sep 5 00:38:33 2018 DEPLOYED mysql-0.10.1 5.7.14 default

helm list --all則會顯示所有的 release,包括已經被刪除的

由於 Helm 保留已刪除 release 的記錄,因此不能重新使用 release 名稱。(如果 確實 需要重新使用此 release 名稱,則可以使用此 –replace 參數,但它只會重用現有 release 並替換其資源。)這點是不是和 docker container 的管理比較類似

請注意,因為 release 以這種方式保存,所以可以回滾已刪除的資源並重新激活它。

如果要徹底刪除 release,則需要加上--purge參數:

$ helm delete mewing-squid --purge
release "mewing-squid" deleted

3.7 helm的打包和上傳下載

打包發布到本地repo

[root@VM-6-17-centos ~]# helm package jenkins --debug
Successfully packaged chart and saved it to: /root/jenkins-0.13.5.tgz
[debug] Successfully saved /root/jenkins-0.13.5.tgz to /root/.helm/repository/local

打包發布到遠程repo

[root@VM-6-17-centos ~]# helm plugin install https://github.com/chartmuseum/helm-push
[root@VM-6-17-centos ~]# helm push ./jenkins nwx-tcr-nwx-ns
Pushing jenkins-0.13.5.tgz to nwx-tcr-nwx-ns...
Done.
[root@VM-6-17-centos ~]# cd /root/.helm/repository/local
[root@VM-6-17-centos local]# ll
total 24
-rw-r--r-- 1 root root  1241 Sep 11 20:28 index.yaml
-rw-r--r-- 1 root root 12866 Sep 11 20:28 jenkins-0.13.5.tgz
-rw-r--r-- 1 root root  2595 Jun  5 10:05 mongodb-0.1.0.tgz
[root@VM-6-17-centos local]# helm push jenkins-0.13.5.tgz nwx-tcr-nwx-ns
Pushing jenkins-0.13.5.tgz to nwx-tcr-nwx-ns...
Done.

下載chart包

helm fetch nwx-tcr-nwx-ns/jenkins --version 0.13.5

3.8 helm包托管到到騰訊雲的TCR上

首先在TCR上開通實例,並將實例開通外網訪問,配置helm客戶端所在機器的ip到外網訪問白名單

可以手動將chart包上傳到倉庫上

這邊也可以用命令將包上傳

# helm repo add nwx-tcr-nwx-ns https://nwx-tcr.tencentcloudcr.com/chartrepo/nwx-ns --username XXXXXXX --password eyJhbGciOiJSUzI1NiIsImtpZCI6Ikg0SjM6WFJQVjo0QkRDOkNDWUI6SUJVUzpUNjdUOkxXSlc6WUNMRjo2WkNCOkNDVFY6UlE3RzpJT1pBIn0.eyJvd25lclVpbiI6IjIxNTk5NzM0MTciLCJvcGVyYXRvclVpbiI6IjEwMDAxMTAwNzQ5MSIsImV4cCI6MTU5OTgzMjMzNCwibmJmIjoxNTk5ODI4NzM0LCJpYXQiOjE1OTk4Mjg3MzR9.SYaux93fNpZMjltRbITA-AZr3b7RVEfZdK3cQ89qJByZvc733EBUoonSNGPmlU0YhgjVOJrrBcSoZGG12euQjT62FaWNbN_QhEOUEWZ84BekKHIYKXRFP9B78epXmzpJKrU-uoD4GLxduBMkmnK1S1kbRgoYdS3uRSqrGdO9rblk6Zut_s96TyibBicExheJOXfigjLThjkhnA4wR6TxY48qzpjNp12xnA394R7VTQQFCsV4X3En5aaeOZgjcjLB8-LmJr0qtenAkc_cqplMYncnbXhN8owAhFjYuYBF-
# helm plugin install https://github.com/chartmuseum/helm-push
# helm push ./jenkins nwx-tcr-nwx-ns
# helm push jenkins-0.13.5.tgz nwx-tcr-nwx-ns

從TCR上下載helm包,直接瀏覽器下載到本地

用命令下載到liunx機器上

helm fetch nwx-tcr-nwx-ns/jenkins --version 0.13.5

查看chart包的yaml文件信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM