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

  • 2019 年 10 月 8 日
  • 筆記

目录

定义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”参数绑定其他地址和端口