• 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm


    前言

    上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应用。大家都知道 Kubernetes上的应用对象,都是由特定的资源描述组成,然后保存至一个个YAML文件,通过 kubectl apply –f 部署,但是这种手动的方式面临很多问题,容易出错,代码冗余,缺少版本控制等。所以我们需要一些工具来帮助我们更快的达到部署以及管理应用的目的。目前很流行的工具主要是 Helm 和 Kustomize(下一篇会介绍),本篇主要介绍 Helm

    Helm是一个 Kubernetes 的包管理工具,就像Linux下的包管理器,如 yum/apt 等,可以很方便的将之前打包好的yaml文件部署到 kubernetes 上。Helm有几个重要概念:

    • helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理
    • Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合
    • Release:基于Chart的部署实体,一个 Chart 被 Helm 运行后将会生成对应的一个 release;将在k8s中创建出真实运行的资源对象
    • Repository:主要就是用来存放和共享 Chart 使用,相当于是 GitHub,不过这里主要是供 Kubernetes 使用。

    关键词: Helm入门,Helm实践,使用Terraform 安装Helm Charts,自制Helm Charts,自定义Helm Chart,编写自己的Helm Charts

     

    安装

    参考官方文档,我这里是MacOS `brew install helm` 就行了。

     

    使用Helm命令安装Chart

    我们以安装bitnami 的Nginx为例子

    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm repo list
    helm search repo nginx
    helm install mywebserver bitnami/nginx

    安装到一个已存在的Namespace

    helm install mywebserver bitnami/nginx -n demo

    安装到一个新的Namespace

    helm install mywebserver bitnami/nginx -n demo --create-namespace

    安装某特定版本

    helm install mywebserver bitnami/nginx --version 13.2.8

    查看

    helm list
    helm list -n demo

    修改参数安装,如下是把service type 改为ClusterIP,默认为LB类型

    helm install my-nginx bitnami/nginx --set service.type="ClusterIP"

    ## 更多参数可参考文档

     

    也可通过values.yaml修改参数

    helm inspect values bitnami/nginx > values.yaml
     
    vim values.yaml
     
    helm install mywebserver bitnami/nginx -f values.yaml
     
    NAME: mywebserver
    LAST DEPLOYED: Tue Oct  4 10:23:16 2022
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    CHART NAME: nginx
    CHART VERSION: 13.2.9
    APP VERSION: 1.23.1

    如果想把Chart从repository下载到本地安装

    pull到本地并解压 然后install from local

    helm pull bitnami/nginx --untar
     
    helm install mywebserver2 ./nginx

    Clean up 

    helm uninstall mywebserver
     
    helm repo remove bitnami

     ### 本文首发于博客园 https://www.cnblogs.com/wade-xu/p/16839834.html

     

    使用 Terraform Helm Provider 安装 Helm Chart

    还没有Terraform入门的,请移步本人前面的文档。例 云原生之旅 - 3)基础设施即代码 Terraform 快速入门

    Terraform 代码示例如下

    terraform {
      backend "gcs" {
        bucket = "global-sre-dev-terraform"
        prefix = "helm/state"
      }
    }
    backend.tf
    terraform {
      required_version = ">= 1.2.9"
    
      required_providers {
        helm = {
          source = "hashicorp/helm"
          version = "2.7.0"
        }
      }
    }
    
    data "google_project" "this" {
      project_id = "global-sre-dev"
    }
    
    data "google_client_config" "this" {}
    
    data "google_container_cluster" "this" {
      name     = "sre-mgmt"
      location = "us-west1"
      project  = data.google_project.this.project_id
    }
    
    provider "helm" {
      kubernetes {
        host                   = "https://${data.google_container_cluster.this.private_cluster_config[0].public_endpoint}"
        token                  = data.google_client_config.this.access_token
        cluster_ca_certificate = base64decode(data.google_container_cluster.this.master_auth[0].cluster_ca_certificate)
      }
    
      experiments {
        manifest = true
      }
    }
    provider.tf
    resource "helm_release" "my-nginx" {
      name       = "my-nginx-release"
    
      repository = "https://charts.bitnami.com/bitnami"
      chart      = "nginx"
    
      set {
        name  = "service.type"
        value = "ClusterIP"
      }
    
      set {
        name  = "replicaCount"
        value = "2"
      }
    }
    nginx.tf

    然后执行terraform 命令安装Nginx helm chart

    terraform init
     
    terraform plan
     
    terraform apply

    Reference: Terraform Helm Provider

     

    自己制作 Helm Chart

    helm create mychart

    list 能看到目录结构如下

    • Chart.yaml
    • values.yaml
    • templates
    • charts
    Chart.yaml 定义了这个chart的版本之类的信息。最重要的是templates目录,包含将部署到集群的应用程序的所有资源描述YAML文件

    charts 目录可以放一些依赖的chart包,属于高阶用法,目前置空就行了。values.yaml文件为模版变量默认值。

    现在,做一个最简单的Helm Charts 创建 namespace

    templates 目录下仅需一个文件 namespace.yaml 

    复制代码
    ---
    {{ range $i, $ns := .Values.namespaces -}}
    apiVersion: v1
    kind: Namespace
    metadata:
      name: {{ $ns.name }}
      annotations:
        helm.sh/resource-policy: keep
        {{- if hasKey $ns "extraAnnotations" }}
          {{- toYaml $ns.extraAnnotations | nindent 4 }}
        {{- end }}
    ---
    {{- end }}
    复制代码

    Chart.yaml

    apiVersion: v2
    description: Helm chart for maintaining user namespaces
    name: user-namespaces
    version: 1.1.0

    values.yaml 放一个默认值来测试下

    namespaces:
    - name: wade-test
      owner: "wade@demo.com"
      extraAnnotations:
        abc: def

    测试

    1
    helm template user-namespaces

    现在就可以local直接安装了,命令上面已经介绍过。

     

    我们现在选择打包并且publish 到一个bucket 作为repository来共享给别人使用。也可以通过github作为repository,有类似solution,不再赘述。

    我这里的例子是gcs bucket 作为私有 helm repository

    1
    helm package user-namespaces

    此命令会生成一个tgz 包: `user-namespaces-1.1.0.tgz` 

    然后借助一款工具 helm-gcs which is a helm plugin that allows you to manage private helm repositories on Google Cloud Storage aka buckets.

    helm gcs init gs://package/charts/infra/
    
    helm repo add my-repo gs://package/charts/infra/
    
    helm gcs push user-namespaces-1.1.0.tgz my-repo

    你会看到此bucket下面会有两个文件

    % gsutil ls gs://package/charts/infra/
    gs://package/charts/infra/index.yaml
    gs://package/charts/infra/user-namespaces-1.1.0.tgz

    使用 Terraform Helm Provider 安装此Chart 代码示例:

    复制代码
    locals {
        my_namespace = "demo-system"
     
        namespace_yaml = <<-EOT
        namespaces:
        - name: ${local.my_namespace}
          owner: wadexu
      EOT
    }

    resource "helm_release" "my_namespace" {
      name       = "my-first-chart"
      repository = "gs://package/charts/infra"
      chart      = "user-namespaces"
      version    = "1.1.0"

      values = [local.namespace_yaml]
    }
     
    复制代码

    after terraform init and apply the resource

    你的第一个自定义 Helm Chart 通过Terraform 安装成功了。

    Helm list result:

     

     `kubectl gs ns` you will see this new namespace just created

    % kubectl get ns
    NAME              STATUS   AGE
    wade-demo         Active   75s

     

    总结

    通过此文章的学习,您将了解到Helm的基本命令,以及Terrraform 安装 Helm 的方式,以便于后续自动化整个安装应用来Provisioning Kubernetes Clusters的流程。另外还了解到如何制作自己的第一个Helm Chart。

     

    感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力。

     

  • 相关阅读:
    【切片】基础不扎实引发的问题
    曲线艺术编程 coding curves 第八章 贝赛尔曲线(Bézier Curves)
    手把手教学:二阶魔方还原
    因特网中的DNS域名系统
    SpringCloud-2.0-周阳(19. 分布式配置中心 - Nacos)
    HTML5网页设计成品:汽车介绍特斯拉 (dreamweaver作业静态HTML网页设计模板)
    电脑技巧:推荐一款桌面增强工具AquaSnap
    天翼云安全一体化纵深体系是怎么炼成的?
    LVGL中LV_SCROLL_SNAP_CENTER宏的作用
    AZ 305学习笔记
  • 原文地址:https://www.cnblogs.com/wade-xu/p/16839834.html