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 的关系如下:

  1. Tiller 是 Helm 2.x 版本中使用的一个服务器端组件。它负责在 Kubernetes 集群中管理 Helm 部署的 chart 和 release。

  2. Helm 2.x 版本使用 Tiller 来与 Kubernetes API 服务器交互,执行 chart 安装、升级和删除等操作。

  3. Helm 3.x 版本删除了 Tiller 组件,改为直接与 Kubernetes API 服务器交互。这样simplificationed了安装和使用 Helm 的过程,并提高了安全性。

  4. Tiller 的主要功能包括:

    • 管理 Helm 的 release 生命周期
    • 存储 release 的历史记录
    • 与 Kubernetes API 服务器进行交互
    • 权限和角色控制
  5. 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

 

posted @ 2022-04-28 12:23  不会跳舞的胖子  阅读(603)  评论(0编辑  收藏  举报