第十一章 Helm-kubernetes的包管理器(上)
Helm - K8s的包管理器
11.1 Why Helm
K8s能夠很好的組織和編排容器,但它缺少一個更高層次的應用打包工具,Helm就是干這個的。
比如對于一個MySQL服務,K8s需要部署如下對象:
(1)Service,讓外界能訪問MySQL
(2)Secret,定義MySQL的密碼
(3)PersisentVolumeClaim,為MySQL申請持久化存儲空間。
(4)Deployment,部署MySQL Pod,并使用上面的這些支持對象。
可以將上面這些配置保存到文件中,或幾種寫進一個文件,然后通過kubectl apply -f 部署。
如果服務少,這樣問題也不大,但是如果是微服務架構,服務多達數十個甚至上百個,這種組織和管理應用的方式就不好使了:
(1)很難管理、編輯和維護如此多的服務。每個服務有若干個配置,缺乏更高層次的工具將這些配置組織起來。
(2)不容易將這些服務作為一個整體統一發布。部署人員需要首先理解應用都包含哪些服務,然后按照邏輯順序依次執行kubectl apply, 缺少一種工具定義應用與服務,已經服務之間的依賴。
(3)不能高效的共享和重用服務。比如兩個應用都用到MySQL服務,但是配置參數不一樣,這兩個應用只能分別復制一套標準MySQL配置文件,修改后通過kubectl apply部署。也就是不支持參數化配置和多環境部署。
(4)不支持應用級別的版本管理。雖然可以通過kubectl rollout undo進行回滾,但這只針對單個deployment,不支持整個應用的的回滾。
(5)不支持對部署的應用狀態進行驗證。比如是否能通過預定義賬號訪問MySQL。雖然K8s有健康檢查,但那時針對單個容器,我們需要應用(服務)級別的健康檢查。
Helm能夠解決上面這些問題。
11.2 Helm架構
Helm有兩個重要概念:chart和release
- chart: 是創建一個應用的信息集合,包括各種k8s對象的配置模板、參數定義、依賴關系、文檔說明等。chart是應用部署的自包含邏輯單元。可以將char想象成apt、yum中的軟件安裝包。
- release: 是chart的運行實例,代表了一個正在運行的應用。當chart被安裝到k8s集群,就生成一個release。chart能夠多次安裝到同一個集群,每次安裝都是一個release。
? Helm是包管理工具,這里的包就是指char。 Helm能夠:
- 從零創建新chart。
- 與存儲chart的倉庫交互。拉取、保存、和更新chart
- 在k8s集群中安裝和卸載release.
- 更新、回滾和測試release。
Helm包含兩個組件:Helm客戶端和Tiller服務器,
Helm客戶端,用戶可以:
- 在本地開發chart
- 管理chart倉庫
- 與Tiller服務器交互
- 在遠程K8s集群上安裝chart
- 查看release信息。
- 升級或卸載已有的release
Tiller服務器運行在K8s集群中,它會處理Helm客戶端的請求,與k8s的 API Server交互。Tiller服務器負責:
- 監聽來自Helm客戶端的請求
- 通過chart創建release
- 在k8s中安裝chart,并跟蹤release狀態
- 通過API server升級或卸載已有的release
簡單說: Helm客戶端負責管理chart,Tiller服務器負責管理release。
11.3 安裝Helm?
11.3.1 Helm客戶端
因為我的環境已經安裝過了,就沒寫,以后補充
kubeusr@GalaxyKubernetesMaster:~$ helm version Client: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}11.3.2 Tiller服務器
運行helm init就可以
如下查看Tiller的Service、deployment和Pod
?
kubeusr@GalaxyKubernetesMaster:~$ kubectl get -n kube-system svc tiller-deploy NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tiller-deploy ClusterIP 10.111.0.95 <none> 44134/TCP 131dkubeusr@GalaxyKubernetesMaster:~$ kubectl get -n kube-system deployment tiller-deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE tiller-deploy 1 1 1 1 131dkubeusr@GalaxyKubernetesMaster:~$ kubectl get -n kube-system pod tiller-deploy-895d57dd9-bjlwf NAME READY STATUS RESTARTS AGE tiller-deploy-895d57dd9-bjlwf 1/1 Running 0 40d?11.4 使用Helm
helm search? ? ? ? ? ? ? ? ?# 查看當前可以安裝的chart?
kubeusr@GalaxyKubernetesMaster:~$ helm repo list # 查看倉庫 NAME URL stable https://kubernetes-charts.storage.googleapis.com # stable是官方倉庫 local http://127.0.0.1:8879/charts # local是用戶存放自己開發的chart的本地倉庫可以通過helm repo add 添加更多個倉庫。
支持關鍵字搜索:
kubeusr@GalaxyKubernetesMaster:~$ helm search mysql NAME CHART VERSION APP VERSION DESCRIPTION stable/mysql 0.10.1 5.7.14 Fast, reliable, scalable, and easy to use open-source rel... stable/mysqldump 1.0.0 5.7.21 A Helm chart to help backup MySQL databases using mysqldump stable/prometheus-mysql-exporter 0.1.0 v0.10.0 A Helm chart for prometheus mysql exporter with cloudsqlp... stable/percona 0.3.2 5.7.17 free, fully compatible, enhanced, open source drop-in rep... stable/percona-xtradb-cluster 0.2.0 5.7.19 free, fully compatible, enhanced, open source drop-in rep... stable/phpmyadmin 1.1.2 4.8.2 phpMyAdmin is an mysql administration frontend stable/gcloud-sqlproxy 0.5.0 1.11 Google Cloud SQL Proxy stable/mariadb 5.0.9 10.1.36 Fast, reliable, scalable, and easy to use open-source rel...?
安裝chart也很簡單,執行如下命令就可以安裝MySQL:
kubeusr@GalaxyKubernetesMaster:~$ helm install stable/mysql # 安裝MySQL NAME: invisible-stingray # release的名字, 如果不用-n指定名字,這里就隨機生成。 LAST DEPLOYED: Wed Jan 2 03:19:02 2019 NAMESPACE: default # 命名空間,可以通過--namespace指定 STATUS: DEPLOYED # 狀態是DEPLOYED, 表示已經將chart部署到集群RESOURCES: # 當前release包含的資源,POD, secret,configmap, persistentVolumeClaim ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE invisible-stingray-mysql-8787ff6c8-dh8bh 0/1 Pending 0 0s==> v1/Secret NAME TYPE DATA AGE invisible-stingray-mysql Opaque 2 0s==> v1/ConfigMap NAME DATA AGE invisible-stingray-mysql-test 1 0s==> v1/PersistentVolumeClaim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE invisible-stingray-mysql Pending 0s==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE invisible-stingray-mysql ClusterIP 10.107.208.222 <none> 3306/TCP 0s==> v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE invisible-stingray-mysql 1 1 1 0 0sNOTES: # 顯示的是release的使用方法 MySQL can be accessed via port 3306 on the following DNS name from within your cluster: invisible-stingray-mysql.default.svc.cluster.localTo get your root password run:MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default invisible-stingray-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)To connect to your database:1. Run an Ubuntu pod that you can use as a client:kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il2. Install the mysql client:$ apt-get update && apt-get install mysql-client -y3. Connect using the mysql cli, then provide your password:$ mysql -h invisible-stingray-mysql -pTo connect to your database directly from outside the K8s cluster:MYSQL_HOST=127.0.0.1MYSQL_PORT=3306# Execute the following command to route the connection:kubectl port-forward svc/invisible-stingray-mysql 3306mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}?helm list顯示已經部署的release,helm delete可以刪除release
kubeusr@GalaxyKubernetesMaster:~$ helm list --namespace default NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE invisible-stingray 1 Wed Jan 2 03:19:02 2019 DEPLOYED mysql-0.10.1 5.7.14 default vehement-lambkin 1 Wed Jan 2 03:18:15 2019 DEPLOYED mysql-0.10.1 5.7.14 default kubeusr@GalaxyKubernetesMaster:~$ helm delete invisible-stingray?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/liufei1983/p/10208846.html
總結
以上是生活随笔為你收集整理的第十一章 Helm-kubernetes的包管理器(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scrapy突破反爬虫的限制
- 下一篇: python中前后端通信方法Ajax和O