zoukankan      html  css  js  c++  java
  • 十八,helm的原理及基础使用

    helm介绍

    helm把一系列复杂的有状态和无状态服务的部署封装起来(实际上就是对yaml文件的组织),然后你可以暴露出一些自定义参数信息供用户选择,这样部署就会变得简单很多.

    核心术语

    • Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
    • Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart和Config 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
    • Chart :一个Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件
    • Repoistory: Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
    • Release 使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release

    组成示意图

    helm安装

    helm安装

    wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz
    tar xf helm-v2.14.3-linux-amd64.tar.gz
    cd linux-amd64 #进入解压目录会看到两个可执行文件helm和tiller, 若采用容器化部署到kubernetes中,则可以不用管tiller,只需将helm复制到/usr/bin目录即可
    cp helm /usr/bin/
    echo "source <(helm completion bash)" >> /root/.bashrc # 命令自动补全
    

    Tiller安装

    创建tiller相关的rbac

    [root@master helm]# vim helm-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
        
    [root@master helm]# kubectl apply -f helm-rbac.yaml 
    serviceaccount/tiller created
    clusterrolebinding.rbac.authorization.k8s.io/tiller created   
    
    helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    

    因为墙, 所以指定国内tiller镜像, tiller标签和helm保持一致, 这里是v2.14.3

    kubectl get pods -n kube-system -l app=helm
    kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
    

    初始化后通过命令查看tiller pod创建情况

    helm使用

    添加chart源

    由于阿里的chart源可能更新不及时, 会比较老, 所以建议替换为默认源或者微软的azure源

    参考链接: https://github.com/BurdenBear/kube-charts-mirror

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

    helm常用命令:

    release管理:

    install:创建一个release,下载的压缩文件默认存放路径为/$HOME/.helm/cache/archive/
    delete
    upgrade/rollback
    list
    history:release的历史信息;
    status:获取release状态信息;

    chart管理:

    create
    fetch :远程获取并展开
    get
    inspect :查看chart详细信息
    package:打包chart文件
    verify:校验

    基础命令

    命令 作用
    搜索chart helm search CHARTNAME
    查看chart详细信息 helm inspect CHARTNAME
    安装 helm install --name mem1(指定别名) stable/redis --values valueFiles
    获取状态信息 helm status mem1
    列出release helm list [-a]
    删除release helm delete [--purge] mem1
    下载chart helm fetch stable/redis
    创建chart helm create CHARTNAME
    语法检测 helm lint CHARTNAME
    打包 helm package CHARTNAME

    自定义chart

    一、chart的结构

    (1)更改helm为阿里云仓库源

    [root@master helm]# helm repo remove stable
    "stable" has been removed from your repositories
    
    [root@master helm]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    "stable" has been added to your repositories
    
    [root@master helm]# helm repo list
    NAME         URL                                                        
    local        http://127.0.0.1:8879/charts                               
    incubator    https://kubernetes-charts-incubator.storage.googleapis.com/
    stable       https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    
    #更新
    [root@master helm]# helm repo update
    Hang tight while we grab the latest from your chart repositories...
    ...Skip local chart repository
    ...Successfully got an update from the "incubator" chart repository
    ...Successfully got an update from the "stable" chart repository
    Update Complete. ⎈ Happy Helming!⎈
    

    (2)

    [root@master helm]# pwd
    /root/manifests/helm
    [root@master helm]# helm fetch stable/redis    #获取chart,会得到一个压缩包
    
    [root@master helm]# tar zxf redis-6.4.3.tgz
    
    [root@master helm]# ls
    redis  redis-6.4.3.tgz  tiller-rbac.yaml
    
    #chart目录结构
    [root@master helm]# tree redis
    redis
    ├── Chart.yaml            #chart元数据描述信息(关键词,版本等...)
    ├── ci
    │   ├── default-values.yaml
    │   ├── dev-values.yaml
    │   ├── production-values.yaml
    │   ├── redisgraph-module-values.yaml
    │   └── redis-lib-values.yaml
    ├── README.md           #该chart的简介,可选文件
    ├── templates            #资源定义清单模板文件
    │   ├── configmap.yaml
    │   ├── health-configmap.yaml
    │   ├── _helpers.tpl
    │   ├── metrics-deployment.yaml
    │   ├── metrics-prometheus.yaml
    │   ├── metrics-svc.yaml
    │   ├── networkpolicy.yaml
    │   ├── NOTES.txt
    │   ├── redis-master-statefulset.yaml
    │   ├── redis-master-svc.yaml
    │   ├── redis-rolebinding.yaml
    │   ├── redis-role.yaml
    │   ├── redis-serviceaccount.yaml
    │   ├── redis-slave-deployment.yaml
    │   ├── redis-slave-svc.yaml
    │   └── secret.yaml
    ├── values-production.yaml
    └── values.yaml            #为 templates中的资源定义清单设置自定义属性值
    #其他目录结构
    requirements.yaml        #当前chart是否依赖其他chart,这个文件是可选的。
    charts/               #里面放置的是当前chart所要依赖的其他chart,这个是可选的。
    
    #可以通过chart官方手册,来了解以上每项的详细含义: 
    https://docs.helm.sh/developing_charts/#charts
    

    二、用helm生成基础chart示例性文件

    (1)

    [root@master helm]# helm create myapp  #创建myapp,自动生成chart基础目录结构
    Creating myapp
    
    [root@master helm]# ls |grep myapp
    myapp
    
    [root@master helm]# tree myapp/
    myapp/
    ├── charts
    ├── Chart.yaml
    ├── templates  #go模板语法
    │   ├── deployment.yaml
    │   ├── _helpers.tpl
    │   ├── ingress.yaml
    │   ├── NOTES.txt
    │   └── service.yaml
    └── values.yaml
    
    
    [root@master myapp]# vim Chart.yaml   #自定义Chart.yaml
    apiVersion: v1
    appVersion: "1.0"
      scription: A Helm chart for Kubernetes  myapp
    name: myapp
    version: 0.0.1
    maintainer:
       name: li
       email: ll@163.com
       url: www.beijing.club
    
    [root@master myapp]# vim requirements.yaml 
    #自定义依赖的chart,定义chart的name,version,来自哪个仓库等,该步骤为可选步骤
    
    [root@master myapp]# cd templates/
    [root@master templates]# tree ../templates/
    ../templates/
    ├── deployment.yaml                                                                       
    ├── _helpers.tpl
    ├── ingress.yaml
    ├── NOTES.txt         #提供给用户的提示信息
    ├── service.yaml
    └── tests
        └── test-connection.yaml
    
    #可以自己修改每个文件里的值,然后做语法检查
    [root@master helm]# helm lint myapp     #语法检查,注意执行的目录,需要在myapp的上级目录
    ==> Linting myapp
    [INFO] Chart.yaml: icon is recommended
    
    1 chart(s) linted, no failures
    
    #打包
    [root@master helm]# helm package myapp/   #打包chart
    Successfully packaged chart and saved it to: /root/manifests/helm/myapp-0.0.1.tgz
    
    [root@master helm]# ls |grep myapp
    myapp
    myapp-0.0.1.tgz
    

    (2)启动本地仓库,并应用

    [root@master helm]# helm repo list
    NAME      URL                                             
    stable    https://kubernetes-charts.storage.googleapis.com
    local     http://127.0.0.1:8879/charts  #通过本机的8878端口获取
    
    #启动本地仓库
    [root@master helm]# helm serve    #启动8878端口
    Regenerating index. This may take a moment.
    Now serving you on 127.0.0.1:8879
    
    #查看,可见myapp已经自动保存在仓库中了
    [root@master ~]# helm search myapp
    NAME           CHART VERSION    APP VERSION    DESCRIPTION                            
    local/myapp    0.0.1            1.0            A Helm chart for Kubernetes myapp chart
    
    #如果定义的没问题,就可以部署了
    [root@master ~]# helm install --name myapp1 local/myapp
    
    #查看当前Release的状态信息
    [root@node1 ~]# helm status myapp1
    
    #当前Release
    [root@master ~]# helm delete --purge myapp1  # --purge 移除并释放该名称,后续还可继续使用myapp1名称
    

    参考链接:https://www.cnblogs.com/peitianwang/p/11649621.html,https://www.cnblogs.com/tylerzhou/p/11136107.html

  • 相关阅读:
    Java学习笔记二:发展史之Java的发展
    Java学习笔记一:发展史之Java诞生前
    JPA学习笔记四:理论篇之CRUD
    JPA学习笔记二:实践篇之SpringBoot集成JPA
    JPA学习笔记一:理论篇之JPA介绍
    JPA学习笔记三:实践篇之实现正向工程
    MySQL:大表优化
    如何理解原型链中的prototype和__proto__?
    Node版本的升级和降级
    常用的git提交代码命令
  • 原文地址:https://www.cnblogs.com/peng-zone/p/11821498.html
Copyright © 2011-2022 走看看