首页 > 其他分享 >云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

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

时间:2022-10-30 14:22:36浏览次数:90  
标签:Kubernetes nginx 管理工具 Chart helm yaml Helm bitnami

前言

上一篇文章 [基础设施即代码 使用 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: "[email protected]"
  extraAnnotations:
    abc: def

测试

helm template user-namespaces

现在就可以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.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。

 

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

 

标签:Kubernetes,nginx,管理工具,Chart,helm,yaml,Helm,bitnami
From: https://www.cnblogs.com/wade-xu/p/16839834.html

相关文章

  • Kubernetes - Cordon, Drain and Uncordon a node
    [cloud-user@rext03-0141project]$kubectlcordonintnode04node/intnode04cordoned[cloud-user@rext03-0141project]$kubectldrainintnode04--ignore-daemonsets......
  • 二进制安装Kubernetes v1.25.0
    前言:因为ecs资源丰富,这回敞开用当回地主,一共使用了8台机器,分别是三台master节点,三台工作节点和两台负载均衡。1.部署规划表hostnameIPSoftwareVersion......
  • Kubernetes--Pod存活性探测(设置HTTP探针)
    基于HTTP的探测(HTTPGetAction)向目标容器发起一个HTTP请求,根据其响应码进行结果判定,响应码形如2xx或者3xx时表示检测通过。“sepc.containers.livenessProbe.httpGet”字段......
  • 云原生之旅 - 4)基础设施即代码 使用 Terraform 创建 Kubernetes
    前言上一篇文章我们已经简单的入门Terraform,本篇介绍如何使用Terraform在GCP和AWS创建Kubernetes资源。Kubernetes在云原生时代的重要性不言而喻,等于这个时代的操作......
  • Kubernetes_19_梳理出UserAccount用户账号一条线
    系列文章目录文章目录​​系列文章目录​​​​前言​​​​一、六种认证方式​​​​二、X509客户证书(最重要的用户账号凭证文件,默认方式)​​​​三、在HTTP请求中放入......
  • Kubernetes容器编排技术---Kubernetes基于kubeadm安装与配置(新)
      环境准备1、关闭防火墙和selinux2、配置docker和kubernetes镜像源docker源#step1:安装必要的一些系统工具sudoyuminstall-yyum-utilsdevi......
  • Kubernetes Pod
    POD定义Pod是可以在Kubernetes中创建和管理的、最小的可部署的计算单元,每个Pod包含了一个pause容器,pause容器时Pod的父容器,负责僵尸进程的回收管理,通过pause容器可以......
  • Kubernetes实战入门
    本篇文章将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问。一、NamespaceNamespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多......
  • Istio(二):在Kubernetes(k8s)集群上安装部署istio1.14
    目录一.模块概览二.系统环境三.安装istio3.1使用Istioctl安装3.2使用IstioOperator安装3.3生产部署情况如何?3.4平台安装指南四.GetMesh4.1如何开始使用?4.2如何......
  • kubernetes资源管理
    一、资源管理介绍在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓......