K8S-Helm
前言:
随着容器技术和微服务架构逐渐被企业接受,在kubernetes上已经可以便捷的部署服务了,但对于复杂的应用或者中间件系统,在k8s上部署并非易事,通常需要研究docker镜像的运行需求,环境变量等内容,为容器配置依赖的存储、网络等资源,并设计编写deployment,configmap,service,volume,ingress等yaml文件,再将其一次提交给kubernetes管理部署。总之,微服务架构和容器化给复杂应用的部署和管理都带来了很大的挑战。
Helm用于需要在kubernetes部署的复杂应用进行定义,安装和更新,Helm将kubernetes的yaml资源进行打包为chart,而chart被保存到chart 仓库,由chart仓库存储,分发和共享;
Herlm支持应用的chart版本管理,简化了kubernetes用用部署的应用定义,打包和部署,更新,删除和回滚等操作。
Helm主要包含以下组件:
Chart:Helm软件包,包含一个用用所需资源对象的YAML文件,通常以tar.gz压缩包提供,也可以是文件夹形式。
Repository(仓库):用于存放和共享chart的仓库。
config(配置数据):部署时设置到chart中的配置数据。
release:基于chart和config部署到kubernetes集群中运行的一个实例,一个chart可以被部署多次,每次的release不同。
基于Helm的工作流程如下:
1. 开发人员将开发好的chart上传到chart仓库。
2. 运维人员基于chart的定义,设置必要的配置数据(configmap),使用Helm命令行工具将应用一键部署到kubernetes集群中,以release概念管理后续的更新,回滚等。
3. chart仓库中的chart可以用于共享和开发。
部署
github:https://github.com/helm/helm/releases
$ wget 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/ $ cp helm /usr/local/bin/
查看cluster role
helm]# kubectl get clusterrole NAME AGE admin 5d3h cluster-admin 5d3h edit 5d3h flannel 5d3h ...
Helm 和 Tiller 的关系如下:
-
Tiller 是 Helm 2.x 版本中使用的一个服务器端组件。它负责在 Kubernetes 集群中管理 Helm 部署的 chart 和 release。
-
Helm 2.x 版本使用 Tiller 来与 Kubernetes API 服务器交互,执行 chart 安装、升级和删除等操作。
-
Helm 3.x 版本删除了 Tiller 组件,改为直接与 Kubernetes API 服务器交互。这样simplificationed了安装和使用 Helm 的过程,并提高了安全性。
-
Tiller 的主要功能包括:
- 管理 Helm 的 release 生命周期
- 存储 release 的历史记录
- 与 Kubernetes API 服务器进行交互
- 权限和角色控制
-
Helm 3.x 版本通过使用 Kubernetes 原生的认证和授权机制来取代 Tiller,从而提高了安全性和易用性。
综上所述,Tiller 是 Helm 2.x 版本中用于管理 Kubernetes 资源的服务器端组件,而 Helm 3.x 版本通过与 Kubernetes 原生机制集成来取代了 Tiller。
3.x的helm与apiserver交互方式:
- Helm 3.x 会自动使用当前 Kubernetes 环境中的用户凭证来访问 API 服务器。
- 这些凭证通常是从
~/.kube/config
文件或环境变量中获取的。
为了安装服务端 tiller,还需要在这台机器上配置好 kubectl 工具和 kubeconfig 文件,确保 kubectl 工具可以在这台机器上访问 apiserver 且正常使用。 这里的 node1 节点以及配置好了 kubectl
Kubernetes APIServer 开启了 RBAC 访问控制,所以需要创建 tiller 使用的 service account: tiller 并分配合适的角色给它。 详细内容可以查看helm文档中的 [Role-based Access Control](https://docs.helm.sh/using_helm/#role-based-access-control)。 这里简单起见直接分配 cluster- admin 这个集群内置的 ClusterRole 给它。
创建 rbac-config.yaml 文件:
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
创建
kubectl create -f rbac-config.yaml serviceaccount/tiller created clusterrolebinding.rbac.authorization.k8s.io/tiller created
helm初始化
helm init --service-account tiller --skip-refresh
tiller 默认被部署在 k8s 集群中的 kube-system 这个namespace 下
kubectl get pod -n kube-system -l app=helm tiller-deploy-c4fd4cd68-dwkhv 1/1 Running 0 83s
查看版本
helm version Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
添加阿里云的repo源
[root@master ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts //添加阿里云的repo源
安装指定的mysql软件包,并命名为mysql
helm install stable/mysql -n mysql
查看当前安装的Chart包
helm list
查看mysql的状态信息
helm status mysql
helm 其他常用命令
helm ls //列出已经部署的 Release helm status RELEASE_NAME //查询一个特定的 Release 的状态 helm delete cautious-shrimp //移除所有与这个 Release 相关的 Kubernetes 资源 helm rollback RELEASE_NAME REVISION_NUMBER //回滚到指定版本 helm rollback cautious-shrimp 1 helm search mysql //查看与mysql相关的chart包 helm fetch stable/mysql //将mysql软件包下载到本地 helm inspect stable/mysql //查看该软件包的详细信息 helm delete --purge mysql //删除mysql,并将本地的缓存也进行删除 helm repo update //更新repo仓库资源 helm create helm_charts //创建一个chart,名称为helm_charts cd helm_charts/ && helm lint //测试charts语法 helm package helm_charts //打包charts helm template helm_charts-0.1.0.tgz //查看该软件包生成的yaml文件
配置体现在配置文件 values.yaml
cat <<'EOF' > ./values.yaml image: repository: gcr.io/google-samples/node-hello tag: '1.0' EOF
这个文件中定义的值,在模板文件中可以通过 .VAlues对象访问到
cat <<'EOF' > ./templates/deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hello-world spec: replicas: 1 template: metadata: labels: app: hello-world spec: containers: - name: hello-world image: {{ .Values.image.repository }}:{{ .Values.image.tag }} //调用values.yml的image.repository与tag ports: - containerPort: 8080 protocol: TCP EOF
在 values.yaml 中的值可以被部署 release 时用到的参数 --values YAML_FILE_PATH 或 --set key1=value1, key2=value2 覆盖掉
升级版本
helm install --set image.tag='v2' .
升级版本
helm upgrade -f values.yaml test .
Debug
使用模板动态生成K8s资源清单,非常需要能提前预览生成的结果。
使用--dry-run --debug 选项来打印出生成的清单文件内容,而不执行部署
helm install . --dry-run --debug --set image.tag=latest
目录结构
mychart ├── Chart.yaml ├── charts # 该目录保存其他依赖的 chart(子 chart) ├── templates # chart 配置模板,用于渲染最终的 Kubernetes YAML 文件 │ ├── NOTES.txt # 用户运行 helm install 时候的提示信息 │ ├── _helpers.tpl # 用于创建模板时的帮助类 │ ├── deployment.yaml # Kubernetes deployment 配置 │ ├── ingress.yaml # Kubernetes ingress 配置 │ ├── service.yaml # Kubernetes service 配置 │ ├── serviceaccount.yaml # Kubernetes serviceaccount 配置 │ └── tests │ └── test-connection.yaml └── values.yaml # 定义 chart 模板中的自定义配置的默认值,可以在执行 helm install 或 helm update 的时候覆盖
helm chart的升级与回滚
要想升级 chart 可以修改本地的 chart 配置并执行: helm upgrade [RELEASE] [CHART] [flags] helm upgrade redis ./redis -n namespace 使用 helm ls 的命令查看当前运行的 chart 的 release 版本,并使用下面的命令回滚到历史版本: helm rollback <RELEASE> [REVISION] [flags]
回滚
查看历史版本
# 查看历史 helm history redis # 回退到上一版本 helm rollback redis # 回退到指定版本 helm rollback redis 3