前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二进制安装k8s集群(19)-安装helm和tiller

二进制安装k8s集群(19)-安装helm和tiller

作者头像
TA码字
发布2020-04-01 15:03:38
1.3K0
发布2020-04-01 15:03:38
举报
文章被收录于专栏:TA码字

上一篇文章中我们安装了nginx application,在这个安装过程中我们部署了deployment文件,service文件,ingress文件。当然有的application还不只这些,还可能有service account,role,rolebinding,configmap,secret等等,这些资源对象构成了完整的application。那么很自然的就想到有没有办法把这些资源当作一个完整的应用包,我们只需要简单的命令就可以完成对于应用的安装升级等操作呢。可以想象一下,我们需要的是类似yum这样的工具来完成k8s应用的安装升级管理,在k8s里helm正是扮演了这样的角色。

对于helm有这些概念:

  • chart:这个就相当于k8s的应用包,我们可以理解成是yaml配置文件的集合,只不过chart有自己的目录结构罢了。可以对比想象yum中所依赖的rpm的集合。
  • release:对于chart在k8s里的安装称之为release,这个也不难理解,可以对比想象是yum中的一个版本的安装。
  • chart repo:存储chart的仓库,可以对比想象yum repo。
  • helm client:可以查找应用,安装应用,提供命令行工具,可以对比想象yum命令行。
  • tiller server:真正负责将chart安装到k8s集群里,helm与tiller交互,由tiller完成最终的部署。tiller可以是独立的服务,也可以作为deployment运行在k8s集群里。

接下来我们介绍heml client和tiller的安装,这里我们helm和tiller都采用2.14.3版本,tiller以deployment的形式运行在k8s集群里。

安装helm client

请提前下载安装包(2.14.3版本),这里在github下载有时候会很慢,甚至断掉。

代码语言:javascript
复制
mkdir -p /opt/sw/helm/install
cp helm-v2.14.3-linux-amd64.tar.gz /opt/sw/helm/install
cd /opt/sw/helm/install
tar -xzvf helm-v2.14.3-linux-amd64.tar.gz
cp ./linux-amd64/helm /usr/bin/
whereis helm

安装tiller server

这里有两件事情需要做,第一,tiller是以deployment的方式运行在k8s集群里,我们会将其部署到kube-system这个namespace里,所以请提前将tiller(2.14.3版本)的image push到我们的private repo里(可以参考以前文章关于harbor private repo的 介绍)。另外会把tiller server开启双向ssl认证,请提前制作tiller server和client的ssl证书,这里的client就是helm,因为helm会和tiller交互完成部署。关于证书的制作可以参考以前文章制作docker server ssl证书的文章。

创建配置文件目录:

由于tiller是以deployment的方式部署在k8s集群里的,一般都会有yaml部署文件,目前都放在此目录里。

代码语言:javascript
复制
mkdir -p /opt/application/k8s/helm
cd /opt/application/k8s/helm

创建tiller的service-account

代码语言:javascript
复制
cat > /opt/application/k8s/helm/tiller-service-account.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: serviceaccount-tiller
  namespace: kube-system
imagePullSecrets:
- name: container-registry
EOF

kubectl create -f /opt/application/k8s/helm/tiller-service-account.yaml
kubectl describe serviceaccount serviceaccount-tiller -n kube-system

创建tiller的cluster-role-binding:

这里为了方便,我们绑定k8s集群内置的cluster-admin角色。

代码语言:javascript
复制
cat > /opt/application/k8s/helm/tiller-cluster-role-binding.yaml <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-role-binding-tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: serviceaccount-tiller
  namespace: kube-system
EOF

kubectl create -f /opt/application/k8s/helm/tiller-cluster-role-binding.yaml
kubectl describe clusterrolebinding cluster-role-binding-tiller -n kube-system

运行命令查看部署tiller yaml的output:

这里我们用helm init --dry-run --debug命令,它的本质是生成tiller server需要的yaml文件,我们可以预览内容。如果觉得没有问题就可以把--dry-run参数去掉,这样就真正的部署tiller到k8s集群中了。其中有几个参数如下

  • kube-contex:因为helm部署tiller的时候需要和k8s集群交互,那么就避免不了需要用的kubeconfig文件,这个context就kubeconfig的context,可以用命令kubectl config view来查看的到
  • override:可以覆盖yaml里的field定义,这里我们把tiller的storage用k8s的secret对象。实际也可以支持postgres sql数据库存储,在实际应用中可以根据自己的需求做合理选择。
  • 更多的配置说明可以参考: https://helm.sh/docs/using_helm/#installing-helm
代码语言:javascript
复制
helm init --dry-run --debug \
--home=/opt/sw/helm \
--tiller-image=172.20.11.41:1034/infra-pub/tiller:2.14.3 \
--replicas=1 \
--history-max=20 \
--kube-context=context-one \
--tiller-namespace=kube-system \
--service-account=serviceaccount-tiller \
--tiller-tls \
--tiller-tls-verify \
--tiller-tls-cert=/opt/application/k8s/helm/tiller-server.crt \
--tiller-tls-key=/opt/application/k8s/helm/tiller-server.key \
--tls-ca-cert=/opt/application/k8s/helm/ca.crt \
--override='spec.template.spec.containers[0].command'='{/tiller,--storage=secret}'

安装tiller server

代码语言:javascript
复制
helm init --debug \
--home=/opt/sw/helm \
--tiller-image=172.20.11.41:1034/infra-pub/tiller:2.14.3 \
--replicas=1 \
--history-max=20 \
--kube-context=context-one \
--tiller-namespace=kube-system \
--service-account=serviceaccount-tiller \
--tiller-tls \
--tiller-tls-verify \
--tiller-tls-cert=/opt/application/k8s/helm/tiller-server.crt \
--tiller-tls-key=/opt/application/k8s/helm/tiller-server.key \
--tls-ca-cert=/opt/application/k8s/helm/ca.crt \
--override='spec.template.spec.containers[0].command'='{/tiller,--storage=secret}'

查看tiller在集群中的deployment和service

代码语言:javascript
复制
kubectl get deployment -n kube-system|grep tiller
kubectl get service -n kube-system|grep tiller

配置helm client

这里helm client虽然是binary文件直接可以用,但是它需要和tiller server交互,而我们的tiller server开启了双向ssl认证,所以我们这里要把相关证书配置好。默认helm使用环境变量$HELM_HOME下的ca.pem来认证server端,使用$HELM_HOME下的cert.pem和key.pem作为client端的证书和key。所以我们这里设置好环境变量,把相关证书文件放在默认路径下。当然不做这一步也可以,那就需要我们在命令里手动指定相应的ca,cert,key文件了,输入命令就比较麻烦。

配置环境变量:

将$HELM_HOME配置在/etc/profile中,这样就都可以加载了,这里我们设置$HELM_HOME为/opt/sw/helm

代码语言:javascript
复制
vi /etc/profile
source /etc/profile
echo $HELM_HOME

复制ca,cert,key文件到$HELM_HOME

代码语言:javascript
复制
cp /opt/application/k8s/helm/cert.pem /opt/sw/helm
cp /opt/application/k8s/helm/key.pem /opt/sw/helm
cp /opt/application/k8s/helm/ca.pem /opt/sw/helm

ls /opt/sw/helm/ |grep pem

测试helm与tiller交互命令:

代码语言:javascript
复制
helm version --tls
helm list --all --tls --debug

这里我们可以看到对于tiller的service是默认的。也就是cluster ip,并没有暴露出来,然而helm却是访问到了tiller。这里是用了隧道机制可以访问到k8s的service,每次隧道的port都不一样,上面的是40112端口,当再次运行时,隧道端口就会改变。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TA码字 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档