k8s helm

k8s helm

官网地址 :https://github.com/easzlab/kubeasz/blob/master/docs/guide/helm.md

镜像源问题

国外的镜像源在helm add的时候可能无法add,可以修改国外的镜像源改为国内镜像源

helm repo add rancher-<CHART_REPO> https://releases.rancher.com/server-charts/<CHART_REPO>

改为 
http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/<CHART_REPO>

1.1 helm介绍

如果我们想在k8s集群中创建一个mysql集群,我们需要设计svc,镜像等,很是繁琐
即使我们有别人给我们写好的yaml,当我们想改里面的内容时,需要先熟悉里面的配置才能修改,这样的话还不如自己写,helm则把所有参数提取出来了

helm 现在处于一个尴尬的位置,至少当前时间来说,v3版本已经出了,但是目前市面上都普遍使用v2版本。如同python一样,之前都是v2版本,包括现在的centos7里也是python2.6,但是现在各个公司写的东西大部分都是python3写出来的了。我们现在讲的是v2,因为helm的v3里面的一些模板还不可用

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

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

  • chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包,可以理解为docker中的镜像
  • release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release,可以理解为docker中的容器

Helm 包含两个组件:Helm 客户端和 Tiller 服务器,如下图所示,是v2版本的架构
image

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

2.1 Helm 部署

helm对时间要求很严格,所以在部署前一定确认机器时间是对的
越来越多的公司和团队开始使用 Helm 这个 Kubernetes 的包管理器,我们也将使用 Helm 安装 Kubernetes 的常用组件。 Helm 由客户端命 helm 令行工具和服务端 tiller 组成,Helm 的安装十分简单。 下载 helm 命令行工具到 master 节点 node1 的 /usr/local/bin 下,这里下载的 2.13. 1版本:

我这里把包下载到百度网盘了:
链接:https://pan.baidu.com/s/1_C44tFLgHKHA8ZbSpkaoXw
提取码:u07g

2.1.1 helm客户端安装

helm客户端可以在任何主机上,但是必须要有配置文件

$ ntpdate ntp1.aliyun.com
$ 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/bin/;chmod 755 /usr/bin/helm

此时的helm还无法和tiller交互,我们需要

2.1.2 tiller服务端安装

安装tiller,需要在每个节点上导入tiller镜像

docker load -i helm-tiller.tar

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

因为 Kubernetes APIServer 开启了 RBAC 访问控制,所以需要创建 tiller 使用的 service account: tiller 并分配合适的角色给它。 详细内容可以查看helm文档中的 Role-based Access Control。 这里简单起见直接分配 cluster- admin 这个集群内置的 ClusterRole 给它。创建 rbac-config.yaml 文件:

mkdir -p /opt/kubernets/helm/install
cd  /opt/kubernets/helm/install

vim rbac.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
	
//创建SA并绑定到cluster-admin集群角色权限,命名空间是kube-system,可以和apiserver交互
kubectl apply -f rbac.yaml

//让heml绑定新建的SA tiller。--skip-refresh不要跟远程仓库更新metadata,因为是在国外,无法连接
helm init --service-account tiller --skip-refresh

//helm repo list可以看到是海外的库,我们无法访问
[root@master1 install]# helm repo list
NAME  	URL                                             
stable	https://kubernetes-charts.storage.googleapis.com
local 	http://127.0.0.1:8879/charts

//heml版本
helm version

tiller 默认被部署在 k8s 集群中的 kube-system 这个namespace 下,apiserver也在这

[root@master1 ~]# kubectl get pod -n kube-system -l app=helm
NAME                             READY   STATUS    RESTARTS   AGE
tiller-deploy-58565b5464-6g6mg   1/1     Running   0          74m

3.1 Helm 自定义模板

//新建一个文件夹,用于存放helm模板
mkdir -p helloworld;cd helloworld

//创建自描述文件 Chart.yaml (名字固定不可变更), 这个文件必须有 name 和 version 定义,它会把两个拼接起来作为chart的名字
vim Chart.yaml

name: hello-world
version: 1.0.0

//创建模板文件, 用于生成 Kubernetes 资源清单(manifests)
mkdir ./templates
vim ./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: hub.atguigu.com/library/myapp:v1
          ports:
            - containerPort: 8080
              protocol: TCP

vim ./templates/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: hello-world
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    protocol: TCP
  selector:
    app: hello-world
	

我们上面对helm创建好后,可以使用helm查看已经创建环境

//如上,我们chart创建好了,然后我们可以基于chart创建release实例,同理,例如官网的 helm install release-redis bitnami/redis 是指定chart启动release-redis这样的实例
helm install .

//列出已经部署的 Release
helm ls

//helm repo list可以看到是海外的库,我们无法访问
[root@master1 install]# helm repo list
NAME  	URL                                             
stable	https://kubernetes-charts.storage.googleapis.com
local 	http://127.0.0.1:8879/charts

//heml版本
helm version

//查询一个特定的 Release 的状态,auxiliary-poodle是上面创建的实例release,release是chart的具体实现
helm status auxiliary-poodle

//移除所有与这个 Release 相关的 Kubernetes 资源
helm delete auxiliary-poodle

//回滚Release到某一个版本
helm rollback RELEASE_NAME REVISION_NUMBER
helm rollback auxiliary-poodle 1

//helm delete并不会真的删除,还保留着这个版本,标记REVISION_NUMBER为2
为1
helm delete auxiliary-poodle	
//helm ls --deleted 可以查到过去的删除记录,并且可以通过helm rollback回滚,回滚后版本会标记REVISION_NUMBER为2,helm ls --all 可以看到普通删除的release仍然在运行
helm ls --deleted
helm rollback auxiliary-poodle 1

//使用 helm delete --purge RELEASE_NAME 移除所有与指定 Release 相关的 Kubernetes 资源和所有这个 Release 的记录,这样删除的无法再恢复,只能重新install
helm delete --purge auxiliary-poodle

当然,我们可以把参数提取出来,这样后面的人只需要修改参数就可以修改整个yaml,而不需要熟悉yaml

//配置体现在配置文件 values.yaml 配置体现在配置文件 values.yaml
vim ./values.yaml

image:
  repository: gcr.io/google-samples/node-hello
  tag: '1.0'

vim ./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 }}
          ports:
            - containerPort: 8080
              protocol: TCP
			  
//升级版本
helm upgrade  -f values.yaml auxiliary-poodle .

//在install时覆盖value.yaml中的参数
helm install --set image.tag='latest' .

//在upgrade时覆盖value.yaml中的参数
helm upgrade --set image.tag='latest' auxiliary-poodle .

debug,只验证不升级

//使用模板动态生成K8s资源清单,非常需要能提前预览生成的结果。
//使用--dry-run --debug 选项来打印出生成的清单文件内容,而不执行部署
helm install . --dry-run --debug --set image.tag=latest

4.1 官网下载chart

官网: https://helm.sh/
点击charts : https://artifacthub.io/packages/search?sort=relevance&page=1

比如我们安装redis,想看redis的chart
image
回车,然后找一个redis点进去,查看这个支持的helm版本,我们用的是v2的话就不支持v3的
image
可以点击这里查找历史版本能支持v2版本的
image

posted @ 2022-08-02 12:09  liwenchao1995  阅读(241)  评论(0编辑  收藏  举报