zoukankan      html  css  js  c++  java
  • kubernetes系列:(三)、helm的安装和使用

    一、helm简介

    kubernetes : 解决了容器维护的难题,通过yaml编写,比如deployment,job,statefulset、configmap等等,通过控制循环,让容器镜像便于管理,集群维护难度大减(google 15年 生产负载经验,每周维护数十亿容器)

    管理应用过程中,维护一系列yaml文件,学习成本有点高。

    所以Helm来了,Helm 定义了一套 Chart 格式来描述一个应用。打个比方,一个安卓程序打包成 APK 格式,就可以安装到任意一台运行安卓系统的手机上。如果我们把 kubernetes 比做安卓系统,kubernetes 应用比做安卓程序,那么 Chart 就可以比做 APK。这也意味着,kubernetes 应用只要打包成 Chart,就可以通过 Helm 部署到任意一个 kubernetes 集群上。

    Helm 社区已经维护了一个官方 Helm Hub,我们可以直接使用别人已经做好的 Helm Chart,如下图,通过helm能更简单的管理比较复杂的应用程序。

     

    所以对于我们来说:

    面向java编程:java文件

    面向docker编程:dockerfile

    面向kubernetes编程:yaml

    面向helm编程:chart

    二、helm部署

    helm现在最新版本是Helm v3.0.0-alpha.2 ,是大版本更新,不需要安装服务端组件 Tiller。

    1. 下载

     github下载release版本:博主下载的是amd64  具体可以通过  lsb_release -a     查看系统版本

    2. 安装

    # 解压文件
    tar -zxvf helm-v3.0.0-alpha.2-linux-amd64.tar.gz
    
    # 拷贝 helm 指令放到bin目录下
    cp linux-amd64/helm  /usr/local/bin/
    
    # 验证
    helm help
    

    3. 初始化

    helm init
    

    4. 常用命令介绍

    # 查找
    helm search nginx 
    
    # 安装
    helm install 

    三、试做一个hello-world

    1. 创建my-hello-world的chart

    # 在文件夹下,执行命令
    helm create my-hello-world

    对应文件夹下下出现my-hello-world子目录,就是helm自动生成的空chart,这个chart里的名称是my-hello-world

    需要注意的是,Chart里面的my-hello-world名称需要和生成的Chart文件夹名称一致。如果修改my-hello-world,则需要做一致的修改。

    在根目录下的Chart.yaml文件内,声明了当前Chart的名称、版本等基本信息,这些信息会在该Chart被放入仓库后,供用户浏览检索。

    # 进入文件夹
    [root@cbov10-sso55-113 kubernetes]# cd my-hello-world/
    [root@cbov10-sso55-113 my-hello-world]# ll
    total 8
    drwxr-x--- 2 root root    6 Aug 21 15:52 charts
    -rw-r----- 1 root root  912 Aug 21 15:52 Chart.yaml
    drwxr-x--- 2 root root  106 Aug 21 15:52 templates
    -rw-r----- 1 root root 1067 Aug 21 15:52 values.yaml

    templates目录下,存kubernetes相关的yaml文件,如下:deployment.yaml,service.yaml

    [root@cbov10-sso55-113 my-hello-world]# cd templates/
    [root@cbov10-sso55-113 templates]# ll
    total 20
    -rw-r----- 1 root root 1357 Aug 21 15:52 deployment.yaml
    -rw-r----- 1 root root 1457 Aug 21 15:52 _helpers.tpl
    -rw-r----- 1 root root  910 Aug 21 15:52 ingress.yaml
    -rw-r----- 1 root root 1320 Aug 21 15:52 NOTES.txt
    -rw-r----- 1 root root  430 Aug 21 15:52 service.yaml

    2.Chart说明和配置

    Helm Chart对于应用的打包,不仅仅是将Deployment和Service以及其它资源整合在一起。我们看到deployment.yaml和service.yaml文件被放在templates/文件夹下,相较于原生的Kubernetes配置,多了很多渲染所用的可注入字段。比如在deployment.yaml的spec.replicas 中,使用的是  .Values.replicaCount  而不是Kubernetes本身的静态数值。这个用来控制应用在Kubernetes上应该有多少运行副本的字段,在不同的应用部署环境下可以有不同的数值,而这个数值便是由注入的 Values 提供。

    在根目录下我们看到有一个values.yaml文件,这个文件提供了应用在安装时的默认参数。在默认的Values中,我们看到 replicaCount: 1说明该应用在默认部署的状态下只有一个副本。

    为了使用我们要部署应用的镜像,我们看到deployment.yaml里在  spec.template.spec.containers  里,imageimagePullPolicy都使用了Values中的值。其中image字段由  .Values.image.repository  和  .Chart.AppVersion  组成。看到这里,同学们应该就知道我们需要变更的字段了,一个是位于values.yaml内的    image.repository  ,另一个是位于Chart.yaml里的    AppVersion 。我们将它们与我们需要部署应用的docker镜像匹配起来。

    这里我们把values.yaml里的  image.repository  设置成somefive/hello-world,把Chart.yaml里的  AppVersion  设置成1.0.0即可。

    类似的,我们可以查看service.yaml内我们要部署的服务,其中的主要配置也在values.yaml中。默认生成的服务将80端口暴露在Kubernetes集群内部。我们暂时不需要对这一部分进行修改。

    由于部署的hello-world服务会从环境变量中读取USERNAME环境变量,我们将这个配置加入deployment.yaml。相关部分如下:

    - name: {{ .Chart.Name }}
      image: "{{ .Values.image.repository }}:{{ .Chart.AppVersion }}"
      imagePullPolicy: {{ .Values.image.pullPolicy }}
      env:
        - name: USERNAME
          value: {{ .Values.Username }}

    现在我们的deployment.yaml模版会从values.yaml中加载Username字段,因此相应的,我们也在values.yaml中添加Username: AppHub

     3.打包使用

     完成上述配置后,我们可以使用

    helm lint --strict my-hello-world

    进行格式检查。显示

    1 chart(s) linted, 0 chart(s) failed
        [INFO] Chart.yaml: icon is recommended

    表示正常

    接下来,我们运行

    helm package my-hello-world

    指令对我们的Chart文件夹进行打包。现在我们就得到了 my-hello-world-0.1.0.tgz 的Chart包。到这一步我们的Chart便已经完成了。

     之后,运行

    helm install my-hello-world-chart-test my-hello-world-0.1.0.tgz

    来将本地的chart安装到my-hello-world-chart-test的Release中。运行 kubectl get pods 我们可以看到要部署的pod已经处于运行状态

    NAME                                         READY   STATUS    RESTARTS   AGE
    my-hello-world-chart-test-65d6c7b4b6-ptk4x   1/1     Running   0          4m3s

    运行

      kubectl port-forward my-hello-world-chart-test-65d6c7b4b6-ptk4x 8080:80

    后,就可以直接在本地运行

    curl localhost:8080

    看到 Hello AppHub 了!

     4.进阶使用

    上述提到values.yaml只是Helm install参数的默认设置,我们可以在安装Chart的过程中使用自己的参数覆盖。比如我们可以运行

    helm install my-hello-world-chart-test2 my-hello-world-0.1.0.tgz --set Username="Cloud Native"

    来安装一个新Chart。同样运行

    kubectl port-forward

    进行端口映射,这时可以得到  Hello Cloud Native。用 kubectl get pod -owide 命令也可以,如下图

    我们注意到在安装Chart指令运行后,屏幕的输出会出现

    NOTES:
    1. Get the application URL by running these commands:
      export POD_NAME=$(kubectl get pods -l "app=my-hello-world,release=my-hello-world-chart-test2" -o jsonpath="{.items[0].metadata.name}")
      echo "Visit http://127.0.0.1:8080 to use your application"
      kubectl port-forward $POD_NAME 8080:80

    这里的注释是由Chart中的  templates/NOTES.txt,提供的。我们注意到原始的NOTES中,所写的

    "app={{ template "my-hello-world.name" . }},release={{ .Release.Name }}"

    和我们的deployment.yaml中所写的配置不太一样。我们可以把它改成

    "app.kubernetes.io/name={{ template "my-hello-world.name" . }},app.kubernetes.io/instance={{ .Release.Name }}"

    ,将values.yaml中的version更新成0.1.1。然后重新打包Chart(运行helm package)。得到新的my-hello-world-0.1.1.tgz之后,重新安装Chart(运行

    helm install my-hello-world-chart-test3 my-hello-world-0.1.1.tgz --set Username="New Chart"

    ),就能看到更新过后的NOTES了。

    NAME: my-hello-world-chart-test3
    LAST DEPLOYED: 2019-07-10 14:02:55.321468411 +0800 CST m=+0.091032750
    NAMESPACE: default
    STATUS: deployed
    
    NOTES:
    1. Get the application URL by running these commands:
      export POD_NAME=$(kubectl get pods -l "app.kubernetes.io/name=my-hello-world,app.kubernetes.io/instance=my-hello-world-chart-test3" -o jsonpath="{.items[0].metadata.name}")
      echo "Visit http://127.0.0.1:8080 to use your application"
      kubectl port-forward $POD_NAME 8080:80

    5.其他

    Helm Chart还有诸如dependency等其他功能,更加详细的资料可以参考Helm官方文档的相关章节

    参考

    1.阿里云 helm chart 创作指南

    2.helm官网(3.0版本的doc)

    【倒计时 6 天!云原生应用大赛火热报名中】9月2日前,使用任意语言开发一个可以被容器化、运行在 K8s 上的应用,并把该应用做成 Helm Charts 格式提交即可参赛!苹果 Airpods,Cherry键盘、天猫精灵等丰厚礼品等你拿!

    还来得及,加油。

    感谢您的观看和支持。

    如有疏漏请及时联系。感谢

  • 相关阅读:
    ACL2016信息抽取与知识图谱相关论文掠影
    决策树之信息与熵的计算
    从零开始一个http服务器(六)-多路复用和压力测试
    从零开始一个http服务器(三)-返回response 构造
    从零开始一个http服务器(二)-请求request解析
    从零开始一个http服务器(一)-开始
    从零开始一个http服务器(五)-模拟cgi
    从零开始一个http服务器(四)-动态返回
    拼音转汉字
    24点牌 递归算法
  • 原文地址:https://www.cnblogs.com/haoprogrammer/p/11269171.html
Copyright © 2011-2022 走看看