在kubernetes環境下安裝helm

helm簡介

Helm 能夠理解爲 Kubernetes 的包管理工具,能夠方便地發現、共享和使用爲Kubernetes構建的應用。linux

Helm 採用客戶端/服務器架構,有以下組件組成:git

Helm CLI 是 Helm 客戶端,能夠在本地執行 
Tiller 是服務器端組件,在 Kubernetes 羣集上運行,並管理 Kubernetes 應用程序的生命週期 
Repository 是 Chart 倉庫,Helm客戶端經過HTTP協議來訪問倉庫中Chart的索引文件和壓縮包。 github

1.Helm的三個基本概念

Chart:Helm應用(package),包括該應用的全部Kubernetes manifest模版,相似於YUM RPM或Apt dpkg文件 
Repository:Helm package存儲倉庫 
Release:chart的部署實例,每一個chart能夠部署一個或多個releaseapi

2.Helm工做原理 

Helm把Kubernetes資源(好比deployments、services或 ingress等) 打包到一個chart中,而chart被保存到chart倉庫。經過chart倉庫可用來存儲和分享chart。Helm使發佈可配置,支持發佈應用配置的版本管理,簡化了Kubernetes部署應用的版本控制、打包、發佈、刪除、更新等操做。服務器

Helm包括兩個部分,helm客戶端和tiller服務端。網絡

3.helm客戶端

helm客戶端是一個命令行工具,負責管理charts、reprepository和release。它經過gPRC API(使用kubectl port-forward將tiller的端口映射到本地,而後再經過映射後的端口跟tiller通訊)向tiller發送請求,並由tiller來管理對應的Kubernetes資源。架構

4.tiller服務端

tiller接收來自helm客戶端的請求,並把相關資源的操做發送到Kubernetes,負責管理(安裝、查詢、升級或刪除等)和跟蹤Kubernetes資源。爲了方便管理,tiller把release的相關信息保存在kubernetes的ConfigMap中。 
tiller對外暴露gRPC API,供helm客戶端調用。app

安裝

咱們須要安裝 Helm 客戶端到本地,同時安裝服務端 Tiller 到 Kubernetes 中ide

一、客戶端安裝:

下載相應的版本:https://github.com/kubernetes/helm/releases 
這裏我下載的是helm-v2.9.1-linux-amd64.tar.gz 
解壓 (tar -zxvf helm-v2.9.1-linux-amd64.tar.gz) 
把helm執行文件放置在: (mv linux-amd64/helm /usr/local/bin/helm)工具

二、服務器端安裝:

初始化並驗證 Helm,這樣就會自動安裝服務器端Tiller。 
注意:因爲國內網絡的問題,在安裝 Tiller 的時候,須要下載鏡像 gcr.io/kubernetes-helm/tiller:v2.9.1,頗有可能會安裝失敗。因此咱們這裏使用阿里鏡像來安裝Tiller。

$ helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

Creating /home/luanpeng/.helm 
Creating /home/luanpeng/.helm/repository 
Creating /home/luanpeng/.helm/repository/cache 
Creating /home/luanpeng/.helm/repository/local 
Creating /home/luanpeng/.helm/plugins 
Creating /home/luanpeng/.helm/starters 
Creating /home/luanpeng/.helm/cache/archive 
Creating /home/luanpeng/.helm/repository/repositories.yaml 
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com 
Adding local repo with URL: http://127.0.0.1:8879/charts 
$HELM_HOME has been configured at /home/luanpeng/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!

稍等一會,你就會發現服務端 Tiller 已經安裝到咱們的kubernetes 集羣中了,而且做爲Kubernetes Pod 服務運行在 kube-system 的 namespace 中

$ helm version
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}



$ kubectl get pods --all-namespaces
...
kube-system   tiller-deploy-f9b8476d-q89lh            0/1       ImagePullBackOff   0          4m

 

若是 Tiller 安裝失敗,經過 helm version 命令會提示鏈接不到 Tiller。 

安裝問題:

1. 缺乏socat

[root@master ~]# helm version
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"} E0814 15:50:10.763548 20622 portforward.go:331] an error occurred forwarding 41171 -> 44134: error forwarding port 44134 to pod 9c801acc204cc81fa350b172a9575c0932fea99ce8229a7bacefc75707cd60f6, uid : unable to do port forwarding: socat not found. Error: cannot connect to Tiller

解決方法:
在kubernetes集羣的節點上安裝socat

[root@master ~]# yum install socat
[root@master ~]# helm version
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}

 

2. helm 跟kubectl 同樣,從.kube/config 讀取配置證書跟k8s通信,先確保kubectl可以可用,不然出現如下錯誤:

[root@master ~]# helm version
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Error: cannot connect to Tiller

3.RBAC權限問題,若是集羣啓用RBAC,會出現下面的問題:

[root@master helm]# helm list
Error: configmaps is forbidden: User "system:serviceaccount:kube-system:default" cannot list configmaps in the namespace "kube-system"

解決方法:
給tiller增長rbac權限:

a. 編輯控制rbac權限的manifest文件

首先建立sa,而後給sa綁定cluster-admin規則

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

b.經過kubectl建立tiller的rbac權限

[root@master helm]# kubectl create -f helm-rbac.yaml 
serviceaccount "tiller" created
clusterrolebinding.rbac.authorization.k8s.io "tiller-cluster-rule" created

 

c.編輯 Tiller Deployment ,添加serviceAccount。Tiller Deployment名稱爲: tiller-deploy.

[root@master helm]# kubectl edit deploy --namespace kube-system tiller-deploy

 

插入一行 (serviceAccount: tiller) in the spec: template: spec section of the file:(以下標紅字體)
...
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: helm
      name: tiller
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: helm
        name: tiller
    spec:
      serviceAccount: tiller
      containers:
      - env:
        - name: TILLER_NAMESPACE
          value: kube-system
        - name: TILLER_HISTORY_MAX
...
相關文章
相關標籤/搜索