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

目录

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

 定义Charts

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

  • Chart.yamlmysql

配置示例:git

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

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

字段sql

是否必填apache

说明api

name架构

app

当前Chart名称ide

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)

相关文章
相关标签/搜索