Helm容器应用包管理工具安装记录
- 本文在Docker on Mac 18.02上试验通过,Ubuntu16.04+K8S1.10.2上验证可用。
Docker(https://www.docker.com)已经被大量使用,可以从dockerhub(https://www.dockerhub.com)或者私有的Harbor/Registry(https://my.oschina.net/u/2306127/blog/659097)来拉取镜像,快速创建一个虚拟的系统。但对于很多服务来说,往往需要多个docker来共同完成,这可以通过docker compose文件,一次性启动多个docker container,可以运行于swarm模式或者Kubernetes模式,从而提供伸缩能力。
Helm(https://docs.helm.sh/)是基于Kubernetes面向容器的包管理工具,包括客户端、服务端两个主要部分。Helm的包类似于docker compose文件(与Rancher的应用文件也基本类似)。Helm的包以一个目录方式存储,可以放在github.com的代码仓库中进行共享(如:https://github.com/openthings/zhelm-charts),也可以从已有的仓库服务中直接安装,https://kubernetes-charts.storage.googleapis.com/ 是Google维护的chart库,访问该地址可以看到所有的chart列表(需要科学访问),由于这个是Helm的默认主库,因此安装Helm也是要求能够访问这个地址的,否则helm init执行后运行时会异常。也可以搭建自己的Helm服务,而本地一般会在主目录下维护一个.helm的本地仓库。
- 注意:helm只记录docker的运行描述参数,并不代替Docker images的存储服务。
- Monocular-GUI for Helm,https://github.com/kubernetes-helm/monocular 。
- 引用:https://my.oschina.net/u/2306127/blog/1619818 。
- 源码:https://github.com/kubernetes/helm,可下载Release版本。
1、安装Helm
- 安装脚本文件,参见:
- Helm Chart库,参见:
下载安装:
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
或者直接下载,拷贝到/usr/local/bin目录中(或其它目录)运行:
wget -c https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux-amd64.tar.gz
tar -vxf helm-v2.9.1-linux-amd64.tar.gz
sudo cp linux-amd64/helm /usr/local/bin
查看版本信息:
helm version
查看状态:
kubectl cluster-info
kubectl config current-context
对于2.9.0/1版本,需要打上补丁,操作如下:
kubectl -n kube-system patch deployment tiller-deploy -p '{"spec": {"template": {"spec": {"automountServiceAccountToken": true}}}}
创建权限设置文件:
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
将上面内容保存为helm-rbac-config.yaml,然后运行创建服务账号和kubernetes的访问授权:
kubectl create -f helm-rbac-config.yaml
helm初始化:
helm init --service-account tiller
检查安装是否成功:
kubectl -n kube-system get pods | grep tiller
或者:
kubectl get pods --namespace=kube-system
更新仓库:
helm repo update
- 注意,如果出现异常,一般是网络问题。下载镜像需要等待和科学上网。
权限问题
helm init
运行起来了,但是helm list
运行出错,如下。
helm list
Error: configmaps is forbidden: User "system:serviceaccount:kube-system:default" cannot list configmaps in the namespace "kube-system"
这是RABC权限设置问题,参照如下解决(更好的方式时使用前面的rbac-config.yaml配置文件):
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
helm init --service-account tiller --upgrade
Kubernetes升级后问题解决:
Kubernetes升级到1.11.2后,helm list出现下面错误:
Error: configmaps is forbidden: User "system:serviceaccount:kube-system:default"
重新运行权限设置和初始化后,运行正常:
# 在kube-system命名空间中创建tiller账户
kubectl create serviceaccount --namespace kube-system tiller
# 创建角色并授予cluster-admin权限
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
# 指定账户进行初始化,别忘了还要指定tiller镜像哦
helm init --service-account tiller --upgrade # --tiller-image
在控制台输入helm,显示helm的主要命令,如下:
Available Commands:
completion Generate autocompletions script for the specified shell (bash or zsh)
create create a new chart with the given name
delete given a release name, delete the release from Kubernetes
dependency manage a chart's dependencies
fetch download a chart from a repository and (optionally) unpack it in local directory
get download a named release
history fetch release history
home displays the location of HELM_HOME
init initialize Helm on both client and server
inspect inspect a chart
install install a chart archive
lint examines a chart for possible issues
list list releases
package package a chart directory into a chart archive
plugin add, list, or remove Helm plugins
repo add, list, remove, update, and index chart repositories
reset uninstalls Tiller from a cluster
rollback roll back a release to a previous revision
search search for a keyword in charts
serve start a local http web server
status displays the status of the named release
template locally render templates
test test a release
upgrade upgrade a release
verify verify that a chart at the given path has been signed and is valid
version print the client/server version information
Flags:
--debug enable verbose output
-h, --help help for helm
--home string location of your Helm config. Overrides $HELM_HOME (default "/Users/wangerqi/.helm")
--host string address of Tiller. Overrides $HELM_HOST
--kube-context string name of the kubeconfig context to use
--kubeconfig string path to kubeconfig file. Overrides $KUBECONFIG
--tiller-namespace string namespace of Tiller (default "kube
2、使用Helm
Helm已经有不少内置的应用服务(地址为 https://kubernetes-charts.storage.googleapis.com/), 源文件在 https://github.com/kubernetes/charts ,建议自己Fork下来,修改后就可以直接使用,我自己做了个镜像( https://github.com/openthings/zhelm-charts ),有一些小的改进。
下面以安装MySQL为例说明Helm的使用:
安装MySQL
可以通过docker run或docker compose文件来启动 MySQL容器。这里,我们使用helm来安装。运行:
helm install stable/mysql
然后,检查容器是否运行:
kubectl get pod
获取MySQL的登录密码:
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default knotted-pronghorn-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
echo $MYSQL_ROOT_PASSWORD
记录下来,后面登录使用。
创建MySQL客户端,基于Ubuntu:
kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
然后,进入了Ubuntu的控制台,安装mysql的客户端软件:
apt-get update && apt-get install mysql-client -y
登录进mysql:
mysql -h knotted-pronghorn-mysql -p
3、创建自己的Chart
helm里面的包描述文件叫chart,既可以使用kubernetes内置的,也可以创建自己的chart,然后加到仓库里面、安装使用。
- 建议将自己的chart放到github.com的projects里面,进行版本化管理和共享。
这里介绍创建创建自己chart的方法,在控制台输入:
helm create mongodb
#目录结构如下:
mongodb
├── Chart.yaml #Chart本身的版本和配置信息
├── charts #依赖的chart
├── templates #配置模板目录
│ ├── NOTES.txt #helm提示信息
│ ├── _helpers.tpl #用于修改kubernetes objcet配置的模板
│ ├── deployment.yaml #kubernetes Deployment object
│ └── service.yaml #kubernetes Serivce
└── values.yaml #kubernetes object configuration
目录结构和文件是helm自动生成的,具体的文件内容可以进目录去查看。
先验证、测试一下:
helm install --dry-run --debug mongodb
安装到本地Kubernetes服务中:
helm install mongodb
查看下该服务在Kubernetes环境下的运行状态:
kubectl get pod
查看Helm仓库:
helm ls
删除仓库中的服务,如:
helm delete mongodb
对该服务打包:
helm package .
注意,因为Kubernetes面向的网络服务集群,helm的后台是通过tiller服务远程执行的(即便位于同一个机器),因此需要tiller服务可用,如果reset集群后,可以通过helm init重新安装。
正常情况下,Kubernetes服务运行状态如下:
kubectl get pod --namespace=kube-system
NAME READY STATUS RESTARTS AGE
etcd-docker-for-desktop 1/1 Running 0 56m
kube-apiserver-docker-for-desktop 1/1 Running 0 56m
kube-controller-manager-docker-for-desktop 1/1 Running 0 55m
kube-dns-6f4fd4bdf-gv59d 3/3 Running 0 55m
kube-proxy-r4xnw 1/1 Running 0 55m
kube-scheduler-docker-for-desktop 1/1 Running 0 57m
kubernetes-dashboard-845747bdd4-v8jg6 1/1 Running 0 25m
tiller-deploy-7594bf7b76-dlxt2 1/1 Running 0 8m
其中的dashboard是一个Kubernetes管理Web可视化面板,可以参照这里安装:
参考:https://docs.bitnami.com/kubernetes/how-to/deploy-application-kubernetes-helm/