ToB企服应用市场:ToB评测及商务社交产业平台

标题: 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm [打印本页]

作者: 农民    时间: 2022-10-30 20:12
标题: 云原生之旅 - 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入门,Helm实践,使用Terraform 安装Helm Charts,自制Helm Charts,自定义Helm Chart,编写自己的Helm Charts
 
安装

参考官方文档,我这里是MacOS `brew install helm` 就行了。
 
使用Helm命令安装Chart

我们以安装bitnami 的Nginx为例子
  1. helm repo add bitnami https://charts.bitnami.com/bitnami
  2. helm repo list
  3. helm search repo nginx
  4. helm install mywebserver bitnami/nginx
复制代码
安装到一个已存在的Namespace
  1. helm install mywebserver bitnami/nginx -n demo
复制代码
安装到一个新的Namespace
  1. helm install mywebserver bitnami/nginx -n demo --create-namespace
复制代码
安装某特定版本
  1. helm install mywebserver bitnami/nginx --version 13.2.8
复制代码
查看
  1. helm list
  2. helm list -n demo
复制代码
修改参数安装,如下是把service type 改为ClusterIP,默认为LB类型
  1. helm install my-nginx bitnami/nginx --set service.type="ClusterIP"
复制代码
## 更多参数可参考文档
 
也可通过values.yaml修改参数
  1. helm inspect values bitnami/nginx > values.yaml
  2. vim values.yaml
  3. helm install mywebserver bitnami/nginx -f values.yaml
  4. NAME: mywebserver
  5. LAST DEPLOYED: Tue Oct  4 10:23:16 2022
  6. NAMESPACE: default
  7. STATUS: deployed
  8. REVISION: 1
  9. TEST SUITE: None
  10. NOTES:
  11. CHART NAME: nginx
  12. CHART VERSION: 13.2.9
  13. APP VERSION: 1.23.1
复制代码
如果想把Chart从repository下载到本地安装
pull到本地并解压 然后install from local
  1. helm pull bitnami/nginx --untar
  2. helm install mywebserver2 ./nginx
复制代码
Clean up 
  1. helm uninstall mywebserver
  2. helm repo remove bitnami
复制代码
 ### 本文首发于博客园 https://www.cnblogs.com/wade-xu/p/16839834.html
 
使用 Terraform Helm Provider 安装 Helm Chart

还没有Terraform入门的,请移步本人前面的文档。例 云原生之旅 - 3)基础设施即代码 Terraform 快速入门
Terraform 代码示例如下
  1. terraform {
  2.   backend "gcs" {
  3.     bucket = "global-sre-dev-terraform"
  4.     prefix = "helm/state"
  5.   }
  6. }
复制代码
backend.tf
  1. terraform {
  2.   required_version = ">= 1.2.9"
  3.   required_providers {
  4.     helm = {
  5.       source = "hashicorp/helm"
  6.       version = "2.7.0"
  7.     }
  8.   }
  9. }
  10. data "google_project" "this" {
  11.   project_id = "global-sre-dev"
  12. }
  13. data "google_client_config" "this" {}
  14. data "google_container_cluster" "this" {
  15.   name     = "sre-mgmt"
  16.   location = "us-west1"
  17.   project  = data.google_project.this.project_id
  18. }
  19. provider "helm" {
  20.   kubernetes {
  21.     host                   = "https://${data.google_container_cluster.this.private_cluster_config[0].public_endpoint}"
  22.     token                  = data.google_client_config.this.access_token
  23.     cluster_ca_certificate = base64decode(data.google_container_cluster.this.master_auth[0].cluster_ca_certificate)
  24.   }
  25.   experiments {
  26.     manifest = true
  27.   }
  28. }
复制代码
provider.tf
  1. resource "helm_release" "my-nginx" {
  2.   name       = "my-nginx-release"
  3.   repository = "https://charts.bitnami.com/bitnami"
  4.   chart      = "nginx"
  5.   set {
  6.     name  = "service.type"
  7.     value = "ClusterIP"
  8.   }
  9.   set {
  10.     name  = "replicaCount"
  11.     value = "2"
  12.   }
  13. }
复制代码
nginx.tf然后执行terraform 命令安装Nginx helm chart
  1. terraform init
  2. terraform plan
  3. terraform apply
复制代码
Reference: Terraform Helm Provider
 
自己制作 Helm Chart
  1. helm create mychart
复制代码
list 能看到目录结构如下
Chart.yaml 定义了这个chart的版本之类的信息。最重要的是templates目录,包含将部署到集群的应用程序的所有资源描述YAML文件charts 目录可以放一些依赖的chart包,属于高阶用法,目前置空就行了。values.yaml文件为模版变量默认值。
现在,做一个最简单的Helm Charts 创建 namespace
templates 目录下仅需一个文件 namespace.yaml 
  1. ---
  2. {{ range $i, $ns := .Values.namespaces -}}
  3. apiVersion: v1
  4. kind: Namespace
  5. metadata:
  6.   name: {{ $ns.name }}
  7.   annotations:
  8.     helm.sh/resource-policy: keep
  9.     {{- if hasKey $ns "extraAnnotations" }}
  10.       {{- toYaml $ns.extraAnnotations | nindent 4 }}
  11.     {{- end }}
  12. ---
  13. {{- end }}
复制代码
Chart.yaml
  1. apiVersion: v2
  2. description: Helm chart for maintaining user namespaces
  3. name: user-namespaces
  4. version: 1.1.0
复制代码
values.yaml 放一个默认值来测试下
  1. namespaces:
  2. - name: wade-test
  3.   owner: "wade@demo.com"
  4.   extraAnnotations:
  5.     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.
  1. helm gcs init gs://package/charts/infra/
  2. helm repo add my-repo gs://package/charts/infra/
  3. helm gcs push user-namespaces-1.1.0.tgz my-repo
复制代码
你会看到此bucket下面会有两个文件
  1. % gsutil ls gs://package/charts/infra/
  2. gs://package/charts/infra/index.yaml
  3. gs://package/charts/infra/user-namespaces-1.1.0.tgz
复制代码
使用 Terraform Helm Provider 安装此Chart 代码示例:
  1. locals {<br>
复制代码
    my_namespace = "demo-system"     namespace_yaml =




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4