12

.NET Core + Kubernetes:Helm

 3 years ago
source link: https://beckjin.com/2020/08/23/aspnet-k8s-helm/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

structure.jpg

Helm 安装与配置

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

1
2
3
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 类似)。如:

helmSearchWordpress.png

搭建 repo

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

1
2
3
4
5
hostname: 192.168.124.9   # 访问地址
http:
port: 8888 # 端口
chart:
absolute_url: enabled

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

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

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

harbor.png

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

1
2
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

1
2
3
4
5
6
7
8
9
10
11
12
13
├── 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 通过变量实现,如:
    1
    2
    3
    {{- 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,其他可保持默认:

1
2
3
4
5
6
7
8
9
10
11
replicaCount: 3

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

service:
type: NodePort
port: 80
nodePort: 31000

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

1
2
3
4
5
6
7
8
livenessProbe:
httpGet:
path: /weatherforecast
port: http
readinessProbe:
httpGet:
path: /weatherforecast
port: http

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

1
2
3
4
5
6
7
8
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/

1
2
3
4
5
6
└── helm-push
├── bin
│   └── helmpush
├── helm-push_0.8.1_linux_amd64.tar.gz
├── LICENSE
└── plugin.yaml

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

1
helm package k8sdemo/

推送到 harbor

1
helm push k8sdemo-1.0.0.tgz harbor

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

harborHelmCharts.png

安装 Chart

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

helmSearchK8sdemo.png

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

helmInstall.png

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

helmUpgrade.png

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

helmRollback.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK