• 利用Helm简化Kubernetes应用部署(2)


    目录

    • 定义Charts 
    • 使用Helm部署Demo 
    • Helm常用操作命令 

     定义Charts

    回到之前的“charts”目录,我们依次进行解读并进行简单的修改。

    • Chart.yaml

    配置示例:

    apiVersion: v1
    appVersion: "1.1"
    description: A demo Helm chart for Kubernetes
    name: k8sapp
    version: 0.1.1

    如上述定义所示,Chart.yaml用于提供Charts相关的元数据定义,比如名称、版本,属于必备文件。主要字段如下所示:

    字段

    是否必填

    说明

    name

    当前Chart名称

    version

    版本号

    apiVersion

    chart API 版本,一直为“v1”

    description

     

    Chart描述

    keywords

     

    关键字列表

    home

     

    项目主页URL

    kubeVersion

     

    依赖的Kubernetes版本

    sources

     

    源码地址列表

    maintainers

     

    维护者列表,由name、email、url组成

    engine

     

    模板引擎名称,默认为gotpl,即go模板

    icon

     

    图标地址

    appVersion

     

    应用程序版本

    deprecated

     

    是否已废弃

    tillerVersion

     

    依赖的Tiller版本,例如">2.0.0"

    • values.yaml和模板

    values.yaml配置示例:

    # 定义k8sapp的默认配置
    fullnameOverride: k8sapp
    replicaCount: 1 #副本数
    image: #镜像配置
      repository: ccr.ccs.tencentyun.com/magicodes/k8sapp
      tag: latest

     pullPolicy: Always #镜像拉取策略,Always表示总是拉取最新镜像,IfNotPresent表示如果本地存在则不拉取,Never则表示只使用本地镜像

    service:   #Service配置
      type: NodePort #NodePort服务类型,以便外部访问
      port: 80
    secrets: {}
    ingress:
      enabled: false    #不配置ingress
    #资源限制
    resources:
      limits:
        cpu: 1
        memory: 228Mi
      requests:
        cpu: 100m
        memory: 128Mi

    如以上示例配置所示,我们在一个values.yaml配置了Deployment和Service的配置,整个配置简单干净,当然我们还能配置更多,比如ingress和secrets等等。那么我们的配置是怎么起作用的呢?这里的配置又是如何转换为对应的Deployment、Service等配置的呢?我们来打开“templates”目录下的deployment.yaml模板文件:

    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
      name: {{ template "k8sapp.fullname" . }}
      labels:
        app: {{ template "k8sapp.name" . }}
        chart: {{ template "k8sapp.chart" . }}
        draft: {{ default "draft-app" .Values.draft }}
        release: {{ .Release.Name }}
        heritage: {{ .Release.Service }}
    spec:
      replicas: {{ .Values.replicaCount }}
      selector:
        matchLabels:
          app: {{ template "k8sapp.name" . }}
          release: {{ .Release.Name }}
      template:
        metadata:
          labels:
            app: {{ template "k8sapp.name" . }}
            draft: {{ default "draft-app" .Values.draft }}
            release: {{ .Release.Name }}
          annotations:
            buildID: {{ .Values.buildID }}
        spec:
          containers:
            - name: {{ .Chart.Name }}
              image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
              imagePullPolicy: {{ .Values.image.pullPolicy }}
              ports:
                - name: http
                  containerPort: 80
                  protocol: TCP
              env:
                {{- $root := . }}
                {{- range $ref, $values := .Values.secrets }}
                {{- range $key, $value := $values }}
                - name: {{ $ref }}_{{ $key }}
                  valueFrom:
                    secretKeyRef:
                      name: {{ template "k8sapp.fullname" $root }}-{{ $ref | lower }}
                      key: {{ $key }}
                {{- end }}
                {{- end }}
              resources:
    {{ toYaml .Values.resources | indent 12 }}
        {{- with .Values.imagePullSecrets }}
          imagePullSecrets:
    {{ toYaml . | indent 8 }}
        {{- end }}

    如上所示,这是一个使用Go模板的Deployment模板文件,它通过读取“Chart.yaml”和“values.yaml”中的配置进行转换。同样的,service.yaml、ingress.yaml也是如此,同时我们也可以基于其语法编写更多的模板。这些模板在执行“helm install”命令时进行转换。

    值得注意的是,“.Values”对象可以访问values.yaml中的任何配置,如果使用自定义的值则会覆盖此值。“. Release”对象则为预定义的值,可用于任意模板,并且无法被覆盖。其中,常用的预定义值如下所示:

    名称

    说明

    Release.Name

    发布的资源实例名称

    Release.Time

    Chart最后发布时间

    Release.Namespace

    命名空间

    Release.Service

    发布服务名称,通常是“Tiller”

    Release.IsUpgrade

    当前操作是否升级

    Release.IsInstall

    当前操作是否为安装

    Release.Revision

    修订号,从1开始递增

    Chart

    对应“Chart.yaml”

    Files

    可以访问所有的非模板文件和非特殊文件

    • requirements.yaml

    requirements.yaml用于管理依赖关系。例如:

    dependencies:
      - name: apache
        version: 1.2.3
        repository: http://example.com/charts
      - name: mysql
        version: 3.2.1
        repository: http://another.example.com/charts

    如上所示,常用的字段如下所示:

    • name表示Chart名称;

    • version表示Chart版本;

    • repository表示Chart存储库地址,注意,我们还必须使用“helm repo add”命令在本地添加该存储库地址;

    • alias表示别名;

    • tags用于指定仅装载匹配的Chart;

    • condition用于设置条件来装载匹配的Chart;

    • import-values则用于导入子Chart的多个值。

    如果要对依赖关系进行更好的控制,我们可以手工将被依赖的Charts复制到应用的Charts目录下,以明确的表达这种依赖关系。例如WordPress依赖于Apache和MySQL,则其依赖关系以目录的形式体现如下所示:

    使用Helm部署Demo

    好了,唠嗑了这么多,也该来点实际的了。接下来我们基于以上的认知和Demo配置来进行部署,部署流程如下所示:

     如上图所示,我们来开始Helm的部署之旅。

    1.准备Chart

    Chart我们已经准备好了,具体看上一节的“values.yaml”示例。

    2.推送Chart

    接下来我们来推送到仓库。这里为了简单,我们直接使用腾讯云的Tencent Hub提供的免费的Helm仓库。Tencent Hub的操作比较简单,我们这里略过。接下来,我们将该仓库添加到本地:

    helm repo add {mycharts} https://hub.tencentyun.com/charts/mycharts --username {myname} --password {mypassword}

    “helm repo add”命令用于将仓库添加到本地仓库列表,以上命令中的变量说明如下所示:

    • mycharts 替换为自己仓库的命名空间 (用户名或组织名)

    • myname 替换为 Tencent Hub 账号用户名

    • mypassword 替换为 Tencent Hub 账号密码

    添加完成后,我们可以使用命令“helm repo list”列出本地仓库列表:

     接下来,我们需要将我们的Chart包推送到Tencent Hub的Helm仓库,在推送之前,我们还需要安装平台的推送插件:

    yum install git #如果本地已经安装git,可以忽略此步骤

    helm plugin install https://github.com/imroc/helm-push #安装Tencent Hub推送插件

    插件安装完毕之后,我们就可以开始我们的操作了。首先,确保Chart文件在Helm客户端所在的机器上已经准备就绪,如下图中的“k8sapp”目录:

     然后就可以执行推送命令了:

    helm push ./k8sapp xinlai

    如上所示,“helm push”用于推送Chart,“./k8sapp”是目录位置,“xinlai”是存储库的名称。执行以上脚本会自动将目标目录打包并推送:

     接下来,我们可以在Tencent Hub管理界面上看到我们的包了:

     不仅如此,我们还能查看详情:

    1. 拉取并执行部署

    如果是在云端的k8s集群进行Helm应用部署,操作非常简单,云供应基本上都提供了封装:

     创建完成后如下所示:

     如上图所示,此Helm应用创建了Deployment资源和Service资源,其中Service的类型为NodePort,端口为“32160”,接下来我们可以通过节点端口访问:

     如果是本地集群呢?我们可以通过以下脚本拉取Chart并执行部署:

    helm repo update && helm fetch xinlai/k8sapp
    helm install xinlai/k8sapp

    部署完成后如图所示:

     注意:我们可以通过“--version”参数来部署指定版本的Helm应用:

     如图所示,我们得到了Service的端口为“32705”,同样的通过本地节点端口访问如下所示:

     至此,通过Helm我们部署了一个简单的“k8sapp”Demo应用。部署完成后,我们可以通过命令“helm list”来查看已部署的Release:

    Helm常用操作命令

    除了上面提到的一些Helm命令之外,一些常用的操作Demo如下所示:

    • 升级和更新

    helm upgrade zeroed-rodent xinlai/k8sapp --version 0.1.6

    #“zeroed-rodent”为Release名称,“xinlai/k8sapp”为Chart地址。

    helm upgrade --set imageTag=20190731075922 zeroed-rodent xinlai/k8sapp

    #更新镜像

    • 查看版本历史

    helm history zeroed-rodent

    #查看Release历史

    • 回滚

    helm rollback zeroed-rodent 1

    #回滚到版本1

    • 删除

    helm delete zeroed-rodent

    #删除Release

    • 下载Chart

    helm fetch xinlai/k8sapp

    #下载Chart

    • 基于本地Chart目录部署

    helm install ./k8sapp

    #基于目录“k8sapp”部署

    • 打包

    helm package ./k8sapp

    #会打包压缩生成类似于“/k8sapp-0.1.5.tgz”的文件

    • 搜索

    helm search k8sapp

    #在所有仓库里搜索Chart“k8sapp”

    • 启动本地仓储服务

    helm serve

    #默认地址为“127.0.0.1:8879”,可以使用“--address”参数绑定其他地址和端口

    往期内容链接

    集群故障处理之处理思路以及健康状态检查(三十二)

    集群故障处理之处理思路以及听诊三板斧(三十三)

    开源导入导出通用库Magicodes.ExporterAndImporter发布

    使用Kubectl部署应用

    通过Service访问应用 (1)

    通过Service访问应用 (2)

    使用Ingress来负载分发微服务

    利用Helm简化Kubernetes应用部署(1)

  • 相关阅读:
    一百个人眼中的一百种爱情
    苏迪曼杯羽毛球赛
    站点地图
    魔兽争霸微操教学(精华篇)
    (转)为winform程序注册闪屏(等待窗体)
    (转)Blend操作入门: 别站在门外偷看,快进来吧!
    (转)Asp.Net MVC的路由机制
    (转)VS2010在制作Setup项目的时候没有.NET 2.0的先决条件发行包
    (转)打造自己的LINQ Provider(上):Expression Tree揭秘
    (转)C#中的委托,匿名方法和Lambda表达式
  • 原文地址:https://www.cnblogs.com/codelove/p/11691842.html
Copyright © 2020-2023  润新知