Helm部署

红米2年前技术文章646

1、helm介绍

在没使用helm之前,向Kubernetes部署应用,需要依次部署deployment、svc等,步骤教繁琐,况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了kubernetes应用的部署和管理。

helm的本质就是让k8s的应用管理(deployment、service等)可配置,能动态生成,通过动态生成k8s资源清单文件(deployment.yaml、service.yaml等),然后调用kubectl自动执行k8s资源部署。

helm是官方提供的类似于yum的包管理器,是部署环境的流程封装。helm有两个重要的概念:chart和release。

chart:是创建一个应用的信息合集,包括各种的kubernetes对象的配置模版、参数定义、依赖管理、文档说明等。chart是应用部署的自包含逻辑单元,可以将chart想象成apt、yum中的软件安装包。

release:是chart的运行实例,代表了一个正在运行的应用。当chart被安装到Kubernetes集群,就生成了一个release,chart能够多次安装到同一个集群,每次安装都是一个release。

Helm包含两个组件:Helm客户端和Tiller服务器,如下图所示:

01.png

helm客户端负责chart和release的创建和管理以及和Tiller的交互。Tiller服务器运行在Kubernetes集群中,它会处理helm的客户端的请求,与Kubernetes API Server 交互。

2、helm2部署

下载安装包:

wget [https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz](https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz)

解压:

tar -zxvf helm-v2.13.1-linux-amd64.tar.gz

进入目录:

cd linux-amd64/

复制执行文件至/usr/bin

cp helm /usr/bin/

为了安装服务端tiller,还需要在确保该机器上已配置好kubectl工具和kubeconfig文件,确保kubectl工具可以在这台机器上访问apiserver并且正常使用。此处的matser节点已经配置好了kubectl。

因为kubernetes APIServer开启了RBAC访问控制,(从Kubernetes 1.6开始,基于角色的访问控制默认是启用的。RBAC允许你根据你组织中的用户和角色指定行为类型。)所以需要创建tiller使用的 service account: tiller 并分配合适的角色给它。详细内容可以查看helm文档中的 https://docs.helm.sh/using_helm/#role-based-access-control

这里简单起见直接分配cluster-admin这个集群内置的ClusterRole给它。创建rbac-config.yaml文件:

[root@k8s-master opt]# cat rbac-helm.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system

---

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

执行yaml文件:

kubectl apply -f rbac-helm.yaml

初始化helm:

helm init --service-account tiller --skip-refresh

正常情况下执行 helm init 即可,

但是在kubernetes 1.16.0及之后的版本上执行却报错误:

原因是因为1.16.0之后的deployment 的apiversion的endpoint发生了变化。

解决方法,执行如下命令:

helm init --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 rbac-helm.yaml

安装完成之后查看版本:

helm version

此时发现,再次报错,查看对应pod,发现镜像拉取失败

执行命令:

kubectl describe pod tiller-deploy-6fc68fb6d5-l5bqw -n kube-system

查看镜像拉取地址。

修改该pod的镜像下载地址为:registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3

kubectl edit pod tiller-deploy-6fc68fb6d5-l5bqw -n kube-system

再次查看该pod已正常运行

3、helm基础使用

a、查看helm版本信息

命令:helm version

查看helm版本信息,必须保证可以查看出来client和server,才可正常使用helm

发生报错:socat not found

解决方案:集群中有节点主机缺少socat软件包,检查集群中所有节点是否缺少socat软件包,然后下载安装

yum install -y socat

b、配置helm仓库

命令:helm repo list

默认是Google,在国外,速度特别慢,所以需要更换为国内源

[root@k8s-master opt]# helm repo add stable \
 [  \
 (  "stable" has been added to your repositories

c、更新仓库

helm repo update

d、安装服务

helm search mysql #查看服务包
helm inspect stable/mysql #查看安装包信息

安装报错:解决方法:查看集群支持Deployment版本

命令:kubectl explain deployment


进入目录:/root/.helm/cache/archive

将文件解压:tar -zxvf mysql-0.3.5.tgz

进入目录:/root/.helm/cache/archive/mysql/templates

修改文件:deployment.yaml,将apiVersion修改为如下内容:

接下来从本地安装mysql

helm install /root/.helm/cache/archive/mysql

再次修改文件:deployment.yaml,

添加如下内容:

spec:
  selector:
    matchLabels:
      app: {{template "mysql.fullname" .}}

4、helm3部署

安装的前提条件:

  • kubernetes集群已经就绪

  • 配置了正确权限的kubeconfig,在helm与API Server通信时使用

  • 本地kubectl客户端工具已经配置就绪

安装方式有多种选择,例如:使用二进制文件安装、使用脚本安装、使用包管理器安装等等。

a、下载安装helm3

地址:https://github.com/helm/helm/releases

#解压

tar -zxvf helm-v3.5.4-linux-arm64.tar.gz
ln -s /software/linux-amd64/helm /usr/bin/helm

b、查看版本:

helm version

c、基本概念:

在 helm 中有三个关键概念:Chart,Repo 及 Release

  • Chart: 一系列 k8s 资源集合的命名,它包含一系列 k8s 资源配置文件的模板与参数,可供灵活配置

  • Repo: 即 chart 的仓库,其中有很多个 chart 可供选择,如官方 helm/charts[5]

  • Release: 当一个 Chart 部署后生成一个 release

Chart 简介

使用 helm create 创建一个 chart,了解简单 chart 的目录结构:

#创建一个 chart

[root@master01 ~]# helm create test
Creating test

打印test目录结构 --dirsfirst #先打印文件夹名称

[root@master01 ~]# tree --dirsfirst test/
test/
├── charts
├── templates
│   ├── tests
│   │   └── test-connection.yaml
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   └── service.yaml
├── Chart.yaml
└── values.yaml

主要查看两个文件目录

  • templates/: 这是配置文件模板,示例是最简单应用的资源配置,但复杂应用还会有 pvc,role,service-acount 等等

  • values.yaml: 这是可选参数配置文件,但是大部分参数都已经内置了

d、使用 helm 3部署基础服务

1)添加相关repo源:

通过 helm repo add 可以添加 Repo,这里列出几个频率使用较高的 Repo

  • helm

  • bitnami

如果在国内有网络问题,可以使用阿里云镜像:

helm repo add stable https://apphub.aliyuncs.com/stable

另外,对于一些大软件公司也会维护自己的 Chart,如 gitlab,elasti

  • elastic

  • gitlab

2)查找相关 Chart

helm search repo redis

3)选定 Chart,跟进 Chart 的官方文档

添加国内源

helm repo add stable  http://mirror.azure.cn/kubernetes/charts

4)添加harbor源

helm repo add harbor  https://helm.goharbor.io

5、总结两个版本区别

1、helm v2 版本

包含两个组件,分别是 helm 客户端 和 Tiller 服务器,

helm 是一个命令行工具,用于本地开发及管理chart,chart仓库管理等

Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互

2、helm v3 版本

移除了Tiller helm直接和K8s交互

SA通过 kuberconfig 配置认证

  • 设计原理

它是一个线程的方式运行

  1. Helm-cotroller 运行在master节点并list/walch HelmChart CRD对象

  2. CRD onChange时执行Job更新

  3. Job Container使用rancherklilpper-helm为entrypoint

  4. Killper-helm内 thelm cli,可以安装/升级/删除对应的chart


相关文章

Oozie web console is disabled 问题解决

Oozie web console is disabled 问题解决

一、问题一a、错误现象b、解决方案①、根据提示查看Oozie Quick Start 发现是缺少ExtJS 2.2库(必须是2.2版)下载ExtJS2.2下载地址:http://archive.clo...

apiserver指标分析

apiserver指标分析

概述kube-apiserver 是集群所有请求的入口,指标的分析可以反应集群的健康状态。Apiserver 的指标可以分为以下几大类:请求速率和延迟控制器队列的性能etcd 的性能进程状态:文件系统...

Kafka数据恢复

一、增量恢复增量恢复需要使用 MirrorMaker 来实现,下面是 MirrorMaker 的用法示例:# 创建MirrorMaker 配置文件cat > /tmp/mirror-maker....

MySQL mgr部署文档

MySQL mgr部署文档

一、环境说明1.1服务器信息1.2目录规划1.2目录规划二、环境配置2.1 关闭防火墙和selinuxservice iptabls stop /etc/selinux/conf...

MySQL数据库复制延迟

【问题处理记录】1.查看资源情况,通过查找慢 SQL 发现,从 3:00 开始,存在较多 update 和 delete 操作。怀疑是表结构无主键,由于 RDS 日志模式默认采取的 row 模式,导致...

Shell中单引号和双引号区别

1)在/home/atguigu/bin创建一个test.sh文件[atguigu@hadoop102 bin]$ vim test.sh在文件中添加如下内容#!/bin/bashdo_date=$1...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。