50-服务编排(下):基于Helm的服务编排部署实战

 

制作IAM Chart包

 

我们假设IAM项目源码根目录为${IAM_ROOT},进入 ${IAM_ROOT}/deployments目录,在该目录下创建Chart包。具体创建流程分为四个步骤, 

第一步,创建一个模板Chart。

Chart是一个组织在文件目录中的集合,目录名称就是Chart名称(没有版本信息)。你可以看看这个 Chart 开发指南 ,它介绍了如何开发你自己的Chart。

不过,这里你也可以使用 helm create 命令来快速创建一个模板Chart,并基于该Chart进行修改,得到你自己的Chart。创建命令如下:

$ helm create iam

helm create iam会在当前目录下生成一个iam目录,里面存放的就是Chart文件。Chart目录结构及文件如下:

$ tree -FC iam/
├── charts/                            # [可选]: 该目录中放置当前Chart依赖的其他Chart
├── Chart.yaml                         # YAML文件,用于描述Chart的基本信息,包括名称版本等
├── templates/                         # [可选]: 部署文件模版目录,模版使用的值来自values.yaml和由Tiller提供的值
│   ├── deployment.yaml                # Kubernetes Deployment object
│   ├── _helpers.tpl                   # 用于修改Kubernetes objcet配置的模板
│   ├── hpa.yaml                       # Kubernetes HPA object
│   ├── ingress.yaml                   # Kubernetes Ingress object
│   ├── NOTES.txt                      # [可选]: 放置Chart的使用指南
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests/                         # 定义了一些测试资源
│       └── test-connection.yaml
└── values.yaml                        # Chart的默认配置文件

上面的目录中,有两个比较重要的文件:

  • Chart.yaml 文件
  • templates目录

下面我来详细介绍下这两个文件。我们先来看Chart.yaml 文件。

Chart.yaml用来描述Chart的基本信息,包括名称、版本等,内容如下:

apiVersion: Chart API 版本 (必需)
name: Chart名称 (必需)
version: 语义化版本(必需)
kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 对这个项目的一句话描述(可选)
type: Chart类型 (可选)
keywords:
  - 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:
  - 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选)
  - name: Chart名称 (nginx)
    version: Chart版本 ("1.2.3")
    repository: (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
    condition: (可选) 解析为布尔值的YAML路径,用于启用/禁用Chart(e.g. subchart1.enabled )
    tags: # (可选)
      - 用于一次启用/禁用 一组Chart的tag
    import-values: # (可选)
      - ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
    alias: (可选) Chart中使用的别名。当你要多次添加相同的Chart时会很有用
maintainers: # (可选)
  - name: 维护者名字 (每个维护者都需要)
    email: 维护者邮箱 (每个维护者可选)
    url: 维护者URL (每个维护者可选)
icon: 用作icon的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号
deprecated: 不被推荐的Chart(可选,布尔值)
annotations:
  example: 按名称输入的批注列表 (可选).

我们再来看下templates目录这个文件。

templates目录中包含了应用中各个Kubernetes资源的YAML格式资源定义模板,例如:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: {{ .Values.pump.name }}
  name: {{ .Values.pump.name }}
spec:
  ports:
  - name: http
    protocol: TCP
    {{- toYaml .Values.pump.service.http| nindent 4 }}
  selector:
    app: {{ .Values.pump.name }}
  sessionAffinity: None
  type: {{ .Values.serviceType }}

{{ .Values.pump.name }}会被deployments/iam/values.yaml文件中pump.name的值替换。上面的模版语法扩展了 Go text/template包的语法:

# 这种方式定义的模版,会去除test模版尾部所有的空行
{{- define "test"}}
模版内容
{{- end}}

# 去除test模版头部的第一个空行
{{- template "test" }}

下面是用于YAML文件前置空格的语法:

# 这种方式定义的模版,会去除test模版头部和尾部所有的空行
{{- define "test" -}}
模版内容
{{- end -}}

# 可以在test模版每一行的头部增加4个空格,用于YAML文件的对齐
{{ include "test" | indent 4}}

最后,这里有三点需要你注意:

  • Chart名称必须是小写字母和数字,单词之间可以使用横杠-分隔,Chart名称中不能用大写字母,也不能用下划线,.号也不行。
  • 尽可能使用SemVer 2来表示版本号。
  • YAML 文件应该按照双空格的形式缩进(一定不要使用tab键)。

第二步,编辑 iam 目录下的Chart文件。

我们可以基于helm create生成的模板Chart来构建自己的Chart包。这里我们添加了创建iam-apiserver、iam-authz-server、iam-pump、iamctl服务需要的YAML格式的Kubernetes资源文件模板:

$ ls -1 iam/templates/*.yaml
iam/templates/hpa.yaml                                   # Kubernetes HPA模板文件
iam/templates/iam-apiserver-deployment.yaml              # iam-apiserver服务deployment模板文件
iam/templates/iam-apiserver-service.yaml                 # iam-apiserver服务service模板文件
iam/templates/iam-authz-server-deployment.yaml           # iam-authz-server服务deployment模板文件
iam/templates/iam-authz-server-service.yaml              # iam-authz-server服务service模板文件
iam/templates/iamctl-deployment.yaml                     # iamctl服务deployment模板文件
iam/templates/iam-pump-deployment.yaml                   # iam-pump服务deployment模板文件
iam/templates/iam-pump-service.yaml                      # iam-pump服务service模板文件

模板的具体内容,你可以查看deployments/iam/templates/。

在编辑 Chart 时,我们可以通过 helm lint 验证格式是否正确,例如:

$ helm lint iam
==> Linting iam

1 chart(s) linted, 0 chart(s) failed

0 chart(s) failed 说明当前Iam Chart包是通过校验的。

第三步,修改Chart的配置文件,添加自定义配置。

我们可以编辑deployments/iam/values.yaml文件,定制自己的配置。具体配置你可以参考deployments/iam/values.yaml。

在修改 values.yaml 文件时,你可以参考下面这些最佳实践。

  • 变量名称以小写字母开头,单词按驼峰区分,例如chickenNoodleSoup
  • 给所有字符串类型的值加上引号。
  • 为了避免整数转换问题,将整型存储为字符串更好,并用 {{ int $value }} 在模板中将字符串转回整型。
  • values.yaml中定义的每个属性都应该文档化。文档字符串应该以它要描述的属性开头,并至少给出一句描述。例如:
# serverHost is the host name for the webserver
serverHost: example
# serverPort is the HTTP listener port for the webserver
serverPort: 9191

这里需要注意,所有的Helm内置变量都以大写字母开头,以便与用户定义的value进行区分,例如.Release.Name.Capabilities.KubeVersion

为了安全,values.yaml中只配置Kubernetes资源相关的配置项,例如Deployment副本数、Service端口等。至于iam-apiserver、iam-authz-server、iam-pump、iamctl组件的配置文件,我们创建单独的ConfigMap,并在Deployment中引用。

第四步,打包Chart,并上传到Chart仓库中。

这是一个可选步骤,可以根据你的实际需要来选择。如果想了解具体操作,你可以查看 Helm chart 仓库获取更多信息。

最后,IAM应用的Chart包见deployments/iam。

IAM Chart部署

上面,我们制作了IAM应用的Chart包,接下来我们就使用这个Chart包来一键创建IAM应用。IAM Chart部署一共分为10个步骤,你可以跟着我一步步操作下。

第一步,配置scripts/install/environment.sh

scripts/install/environment.sh文件中包含了各类自定义配置,你主要配置下面这些跟数据库相关的就可以,其他配置使用默认值。

  • MariaDB配置:environment.sh文件中以MARIADB_开头的变量。
  • Redis配置:environment.sh文件中以REDIS_开头的变量。
  • MongoDB配置:environment.sh文件中以MONGO_开头的变量。

第二步,创建IAM应用的配置文件。

$ cd ${IAM_ROOT}
$ make gen.defaultconfigs # 生成iam-apiserver、iam-authz-server、iam-pump、iamctl组件的默认配置文件
$ make gen.ca # 生成 CA 证书

上面的命令会将IAM的配置文件存放在目录${IAM_ROOT}/_output/configs/下。

第三步,创建 iam 命名空间。

我们将IAM应用涉及到的各类资源都创建在iam命名空间中。将IAM资源创建在独立的命名空间中,不仅方便维护,还可以有效避免影响其他Kubernetes资源。

$ kubectl create namespace iam

第四步,将IAM各服务的配置文件,以ConfigMap资源的形式保存在Kubernetes集群中。

$ kubectl -n iam create configmap iam --from-file=${IAM_ROOT}/_output/configs/
$ kubectl -n iam get configmap iam
NAME   DATA   AGE
iam    4      13s

第五步,将IAM各服务使用的证书文件,以ConfigMap资源的形式保存在Kubernetes集群中。

$ kubectl -n iam create configmap iam-cert --from-file=${IAM_ROOT}/_output/cert
$ kubectl -n iam get configmap iam-cert
NAME       DATA   AGE
iam-cert   14     12s

第六步,创建镜像仓库访问密钥。

在准备阶段,我们开通了腾讯云镜像仓库服务,并创建了用户10000099``xxxx,密码为iam59!z$

接下来,我们就可以创建docker-registry secret了。Kubernetes在下载Docker镜像时,需要docker-registry secret来进行认证。创建命令如下:

$ kubectl -n iam create secret docker-registry ccr-registry --docker-server=ccr.ccs.tencentyun.com --docker-username=10000099xxxx --docker-password='iam59!z$'

第七步,创建Docker镜像,并Push到镜像仓库。

$ make push REGISTRY_PREFIX=ccr.ccs.tencentyun.com/marmotedu VERSION=v1.1.0

第八步,安装IAM Chart包。

在49讲里,我介绍了4种安装Chart包的方法。这里,我们通过未打包的IAM Chart路径来安装,安装方法如下:

$ cd ${IAM_ROOT}
$ helm -n iam install iam deployments/iam
NAME: iam
LAST DEPLOYED: Sat Aug 21 17:46:56 2021
NAMESPACE: iam
STATUS: deployed
REVISION: 1
TEST SUITE: None

执行 helm install 后,Kubernetes会自动部署应用,等到IAM应用的Pod都处在 Running 状态时,说明IAM应用已经成功安装:

$ kubectl -n iam get pods|grep iam
iam-apiserver-cb4ff955-hs827        1/1     Running   0          66s
iam-authz-server-7fccc7db8d-chwnn   1/1     Running   0          66s
iam-pump-78b57b4464-rrlbf           1/1     Running   0          66s
iamctl-59fdc4995-xrzhn              1/1     Running   0          66s

第九步,测试IAM应用。

我们通过helm installiam命令空间下创建了一个测试Deployment iamctl。你可以登陆iamctl Deployment所创建出来的Pod,执行一些运维操作和冒烟测试。登陆命令如下:

$ kubectl -n iam exec -it `kubectl -n iam get pods -l app=iamctl | awk '/iamctl/{print $1}'` -- bash

登陆到iamctl-xxxxxxxxxx-xxxxx Pod中后,你就可以执行运维操作和冒烟测试了。

先来看运维操作。iamctl工具以子命令的方式对外提供功能,你可以使用它提供的各类功能,如下图所示:

图片

再来看冒烟测试:

# cd /opt/iam/scripts/install
# ./test.sh iam::test::smoke

如果./test.sh iam::test::smoke命令打印的输出中,最后一行为congratulations, smoke test passed!字符串,就说明IAM应用安装成功。如下图所示:

图片

第十步,销毁EKS集群的资源。

$ kubectl delete namespace iam

你可以根据需要选择是否删除EKS集群,如果不需要了就可以选择删除。

IAM应用多环境部署

在实际的项目开发中,我们需要将IAM应用部署到不同的环境中,不同环境的配置文件是不同的,那么IAM项目是如何进行多环境部署的呢?

IAM项目在configs目录下创建了多个Helm values文件(格式为values-{envName}-env.yaml):

  • values-test-env.yaml,测试环境Helm values文件。
  • values-pre-env.yaml,预发环境Helm values文件。
  • values-prod-env.yaml,生产环境Helm values文件。

在部署IAM应用时,我们在命令行指定-f参数,例如:

$ helm -n iam install -f configs/values-test-env.yaml iam deployments/iam # 安装到测试环境。

总结

这一讲,我们通过 helm create iam 创建了一个模板Chart,并基于这个模板Chart包进行了二次开发,最终创建了IAM应用的Helm Chart包:deployments/iam。

有了Helm Chart包,我们就可以通过 helm -n iam install iam deployments/iam 命令来一键部署好整个IAM应用。当IAM应用中的所有Pod都处在 Running 状态后,说明IAM应用被成功部署。

最后,我们可以登录iamctl容器,执行 test.sh iam::test::smoke 命令,来对IAM应用进行冒烟测试。

课后练习

  1. 试着在Helm Chart中加入MariaDB、MongoDB、Redis模板,通过Helm一键部署好整个IAM应用。
  2. 试着通过 helm 命令升级、回滚和删除IAM应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/534024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【汇编语言实战】已知10个整数求最大值

C语言描述该程序流程&#xff1a; #include <stdio.h> int main() {int a[]{11,33,23,54,12,51,2,4,34,45};int maxa[0];for(int i1;i<9;i){if(a[i]>max){maxa[i];}}printf("%d",max); }汇编语言&#xff1a; include irvine32.inc .data arr dword 11…

深入了解Redis——持久化

一&#xff0c;Redis持久化 Redis持久化即将内存中的数据持久化到磁盘中&#xff0c;在下一次重启后还能进行使用&#xff0c;Redis持久化分为RDB和AOF两种&#xff0c;我们接下来分别介绍RDB和AOF的内部原理和区别 RDB Redis运行时会将当前的内存快照存入至磁盘中&#xff…

c++ 字符串与STL用法

文章目录 StringVector构造增加删除大小清空排序 map定义添加数据遍历数据查找清空删除长度判断空交换排序常用用法 String Vector vector是动态扩充的数组 构造 ​ vector()​:创建一个空vectorvector(int nSize)​:创建一个vector,元素个数为nSize​vector(int nSize,co…

【MATLAB】基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据(附代码)

基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据 WiFi指纹匹配是室内定位最为基础和常见的研究&#xff0c;但是WiFi指纹的采集可以称得上是labor-intensive和time-consuming。现在&#xff0c;给大家分享一下我们课题组之前在做WiFi指纹定位时的基于射线跟踪技术仿真WiFi…

Josephus排列:组合数学与跨学科应用

Josephus排列&#xff1a;组合数学与跨学科应用 一、背景二、定义和历史三、问题的形式化描述四、解决方案4.1 n2&#xff0c;任意m4.2 m1&#xff0c;任意n4.3 n为奇数&#xff0c;m为偶数4.4 n和m都是奇数 五、红黑树简介六、Josephus排列问题描述七、使用红黑树解决Josephus…

设计模式之备忘录模式(上)

备忘录模式 1&#xff09;概述 1.定义 在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;可以在以后将对象恢复到原先保存的状态。 2.作用 备忘录模式提供了一种状态恢复的实现机制&#xff0c;使得用户可以方便…

展厅设计方案需要考虑哪些因素环节

1、整体展厅规划 整体规划是展厅搭建中需要优先考虑的环节&#xff0c;必须为搭建成本和效果提供坚实的基础。需确定整体展厅面积、展厅的使用目的、产品布局以及进入展厅的路线、确定展厅的整体框架之后&#xff0c;还需考虑展品种类、产生的呈现效果&#xff0c;这些都将影响…

el-table动态合并列

需要合并列&#xff0c;并且不确定需要合并多少列的&#xff0c;可以参照如下代码 首先需要再el-table上传入span-method方法 arraySpan({ row, column, rowIndex, columnIndex }){if (row.groupName 汇总 && columnIndex 0) {return [0,0]} else if (row.groupName…

迷宫 — — 蓝桥杯(动态规划)

迷宫 题目&#xff1a; 输入样例&#xff1a; 3 1 1 1 2 3 4 5 6 7 8 9 2 2 1 3 1 R输出样例&#xff1a; 21思路&#xff1a; 题目大意&#xff1a;给定一个n x m的平面网格&#xff0c;并且每一个格子都有一定的代价&#xff0c;并且设有障碍物和陷阱&#xff0c;障碍物的意…

win11 连接海康摄像头 ONVif协议

目录 Win 11 通过脚本打开自带的IE浏览器访问海康摄像头 海康摄像头设置支持onvif协议 安装onvif协议 onvif协议示例代码 Win 11 通过脚本打开自带的IE浏览器访问海康摄像头 第一步、桌面右键新建一个 txt 的文档 第二步、打开文档并且复制粘贴下面代码 CreateObject(&…

【科研】搜索文献的网站

文章目录 paperswithcode【最新论文&#xff0c;代码】huggingface【大语言模型&#xff0c;最新论文】dblp【关键词搜索】arxiv【最新文章】semanticscholar【相关引用查询】connectedpapers【相关引用查询】github【工程&#xff0c;代码&#xff0c;论文开源代码】 paperswi…

OV证书为什么更可信

在网络安全领域&#xff0c;SSL/TLS证书扮演着至关重要的角色&#xff0c;其中组织验证&#xff08;Organization Validation&#xff0c;简称OV&#xff09;证书以其深度验证机制和高度可信性脱颖而出。 OV证书为何更值得信赖&#xff0c;关键在于其严格的验证流程。 首先&am…

金三银四面试题(十九):MySQL中的锁

在MySQL中&#xff0c;锁是非常重要的&#xff0c;特别是在多用户并发访问数据库的环境中&#xff0c;因此也是面试中常问的话题。 请说说数据库的锁&#xff1f; 关于MySQL 的锁机制&#xff0c;可能会问很多问题&#xff0c;不过这也得看面试官在这方面的知识储备。 MySQL …

东方博宜 1169. 编程输入10个正整数,然后自动按从大到小的顺序输出

东方博宜 1169. 编程输入10个正整数&#xff0c;然后自动按从大到小的顺序输出 学了sort函数的新用法。 从小到大排列 sort(a , an ) 从大到小排列 sort(a , an , greater() ) #include<iostream> #include<algorithm> using namespace std; int main() {int a[…

瑞_23种设计模式_访问者模式

文章目录 1 访问者模式&#xff08;Visitor Pattern&#xff09;1.1 介绍1.2 概述1.3 访问者模式的结构1.4 访问者模式的优缺点1.5 访问者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 拓展——双分派4.1 分派4.2 动态分派&#xff08;多态&am…

新型[datahelper@onionmail.org].datah 勒索病毒来袭:如何筑起安全防线?

在数字化时代&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒成为了一种非常严重的威胁。[datahelperonionmail.org].datah勒索病毒就是其中的佼佼者&#xff0c;它以其复杂的加密手段和恶劣的勒索行为&#xff0c;给用户带来了巨大的损失。本文将从病毒的运行机制、…

systemctl start docker报错(code=exited, status=1/FAILURE)

运行systemctl start docker报错内容如下: 输入systemctl status docker.service显示以下内容&#xff1a; 本次启动不起来与docker服务无关 具体解决问题是修改 /etc/docker/daemon.json&#xff0c;vim /etc/docker/daemon.json # 添加如下内容 {"registry-mirrors&qu…

Win10安装sqlplus遇到报错的解决办法

1.下载安装sqlplus.exe的错误解决过程 最近有用到sqlplus连接Oracle数据库执行自动化脚本&#xff0c;Orcle服务器版本是11.2.0.1。在Navicat工具上通过如下语句查询到的版本信息截图如图1所示&#xff1a; SELECT * FROM v$version; 图1 Oracle服务器版本信息 其中“Oracle Da…

图像分割-RSPrompter

文章目录 前言1. 自动化提示器1.1 多尺度特征增强器1.2 RSPrompterAnchor-based PrompterQuery-based Prompter 2. SAM的扩展3. 结果WHU数据集NWPU数据集SSDD数据集 前言 《RSPrompter: Learning to prompt for remote sensing instance segmentation based on visual foundati…

面试算法-172-对称二叉树

题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 解 class Solution {public boolean isSymmetric(TreeNode root) {return isSymm(root.left,root.right);}public b…