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

provider.tf

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

文章插图
云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

文章插图
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 initterraform planterraform applyReference: Terraform Helm Provider
自己制作 Helm Charthelm create mychartlist 能看到目录结构如下
  • 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: v1kind: Namespacemetadata:  name: {{ $ns.name }}  annotations:    helm.sh/resource-policy: keep    {{- if hasKey $ns "extraAnnotations" }}      {{- toYaml $ns.extraAnnotations | nindent 4 }}    {{- end }}---{{- end }}Chart.yaml
apiVersion: v2description: Helm chart for maintaining user namespacesname: user-namespacesversion: 1.1.0values.yaml 放一个默认值来测试下
namespaces:- name: wade-test  owner: "wade@demo.com"  extraAnnotations:    abc: def测试
helm template user-namespaces
云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

文章插图
现在就可以local直接安装了,命令上面已经介绍过 。
我们现在选择打包并且publish 到一个bucket 作为repository来共享给别人使用 。也可以通过github作为repository , 有类似solution,不再赘述 。
我这里的例子是gcs bucket 作为私有 helm repository
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.yamlgs://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
云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

文章插图
你的第一个自定义 Helm Chart 通过Terraform 安装成功了 。
Helm list result:
云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

文章插图
`kubectl gs ns` you will see this new namespace just created
% kubectl get nsNAME              STATUS   AGEwade-demo         Active   75s

推荐阅读