.NET Core + Kubernetes:Helm

Helm 作为 Kubernetes 体系的包管理工具,已经逐渐成为了应用分发标准,在 .NET 开发中,可以理解为与 NuGet 包类似。回顾之前文章中的介绍,Kubernetes 中单个服务的部署有时会涉及到多种资源类型,如:DeployemetServiceIngressPVCConfigMapSecret 等,而通过 Helm 可以把服务相关资源打包到一个 chart 中,以 chart 为单位,进行版本管理,简化 Kubernetes 部署应用的版本控制、打包、发布、删除、更新等操作。

以下是 Helm 3 的架构图,通过 Helm Client 创建 chart ,然后把基于 chart 将相关资源在 Kubernetes 中创建,同时 chart 可被保存到 chart 仓库,进行 chart 包管理与共享。

Helm 安装与配置

Helm 3 的安装参考文档 Installing Helm 简单几步即可完成,我这里采用的是 Binary Releases 方式。安装完成后需添加 chart 仓库源,有了 chart 仓库源才能进行搜索与安装。下面先添加 azurealiyun 的仓库源:

helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update

经过以上配置,就可以通过 helm search repo xxxx 搜索相关 chart 包进行安装使用(和 docker search 类似)。如:

搭建 repo

这里将使用 harbor 来保存 Helm chart,下载最新 harbor-offline-installer 的 release 版本,解压后对 harbor.yml 进行相关修改,主要调整配置如下(如果不使用 https ,需要注释配置文件中 https 相关字段):

hostname: 192.168.124.9   # 访问地址
http:
  port: 8888              # 端口
chart:
  absolute_url: enabled

首次安装,执行以下命令(之后停止或启动执行 ./docker-compose start|stop):

./install.sh --with-clair --with-chartmuseum

安装成功后,访问 http://192.168.124.9:8888,创建名为 charts 的项目作为接下来使用的 chart 仓库。

在 Helm 中添加自建的 repo http://192.168.124.9:8888/chartrepo/charts,因为 charts 项目是私有级别,所以在添加时需要传入用户名和密码,如下:

helm repo add harbor http://192.168.124.9:8888/chartrepo/charts --username=admin --password=Harbor12345
helm repo update

创建 Chart

执行命令 helm create k8sdemo 创建名为 k8sdemo 的 chart,会生成一批文件,文件结构如下图,可以看出有些文件是我们比较熟悉的,如:deployement.yamlingress.yamlservice.yaml

├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
  • charts:存放该 chart 依赖的所有子 chart;
  • Chart.yaml:基本信息定义,如:名称、版本、描述等;
  • templates:存放模板文件,_helpers.tpl 定义变量,NOTES.txt 注释文件,yaml 文件则是各资源类型定义模板,tests 下是相关的测试模板;
  • values.yaml:定义模板中需要使用的常量,如果需要对常量进行二次处理,则需要在 _helpers.tpl 通过变量实现,如:
{{- define "k8sdemo.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}

在 templates 文件夹下的模板文件中包含大量的常量、变量的引用,具体语法就不详细介绍了,基本多看两眼都能理解

k8sdemo chart 创建主要包含以下 3 个文件的调整:

values.yaml 主要修改内容如下,创建 3 个 Pod,镜像使用beckjin/k8sdemo:1.0.0 版本,以 NodePort 的方式提供服务,对外端口为 31000,其他可保持默认:

replicaCount: 3

image:
  repository: beckjin/k8sdemo
  pullPolicy: IfNotPresent
  tag: "1.0.0"

service:
  type: NodePort
  port: 80
  nodePort: 31000

templates/deployment.yaml 主要修改健康检查的配置,默认是 / 路由,这里改成 /weatherforecast,如下:

livenessProbe:
  httpGet:
    path: /weatherforecast
    port: http
readinessProbe:
  httpGet:
    path: /weatherforecast
    port: http

templates/service.yaml 主要修改 nodePort 字段,引用常量 Values.service.nodePort,如下:

spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      nodePort: {{ .Values.service.nodePort }}
      protocol: TCP
      name: http

其他的几个模板文件暂无需调整,可通过查看每个 yaml 文件的具体代码,像 hpa.yamlingress.yamlserviceaccount.yaml 都是含开关控制的,默认不启用。最后可以通过 helm lint k8sdemo/ 进行语法检查,如果没问题就可以直接打包成 chart 使用了。

推送到 repo

chart 的推送这里将使用 helm-push 插件来完成,它的作用是将创建出来的 chart 包推送到远端的 chart 仓库。由于网络上的问题,建议直接下载对应系统版本的 release 包,上传至 Helm 的插件目录,Linux 下为:/root/.local/share/helm/plugins/

└── helm-push
    ├── bin
    │   └── helmpush
    ├── helm-push_0.8.1_linux_amd64.tar.gz
    ├── LICENSE
    └── plugin.yaml

将 k8sdemo 文件夹进行打包,生成 k8sdemo-1.0.0.tgz

helm package k8sdemo/

推送到 harbor

helm push k8sdemo-1.0.0.tgz harbor 

推送成功后在 charts 项目的 Helm Charts 下会有出现对应的 chart 包:

安装 Chart

在进行安装使用前,需要先进行 helm repo update 操作,不然获取不到最新的内容,另外可执行命令 helm search repo k8sdemo 查看结果:

执行命令 helm install k8sdemo harbor/k8sdemo 进行安装,最终会输出如下内容,这部分信息其实是在 NOTES.txt 中定义的。我们可以根据提示信息执行命令,获取服务访问地址,当然也可以直接通过 kubectl get services 查看。

升级

如果 chart 需要升级,可修改 Chart.yaml 中的 version 字段,重新打包并推送,然后 helm repo update 更新 chart 仓库,最后执行 helm upgrade k8sdemo harbor/k8sdemo 进行升级。

回滚

通过 helm history k8sdemo 查看历史版本,然后执行 helm rollback k8sdemo 版本号 即可回滚到之前的版本。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342