找回密码
 立即注册
搜索

基于helm形式部署k8s的蓝鲸DevOps流水线实践

sx_lityliao 2024-7-22 14:41:37

 

helm是k8s的包管理工具,是一组资源文件的集合,使用helm进行发布便于对资源管理。蓝鲸DevOps平台提供了基于helm形式部署k8s的能力,下面我们将基于已有项目实践,来讲解该种方式在DevOps流水线上的实践。

1. Helm发布k8s基本逻辑  

1.1 基本概念

1.1.1 helm

helm是kubernetes的包管理器,是一个命令行工具,类似于管理rpm的yum工具,而helm用于管理chart包。helm由客户端组件helm和服务端组件tiller组成,能将一组k8s资源(模板文件yaml)打包统一管理。其中,tiller负责接收helm请求,与k8s的apiserver交互,根据chart来生成一个release并管理。因此,helm的优势就是方便统一管理配置和更新k8s的资源文件,将一系列资源当作一个软件包管理。

1.1.2 Chart

chart是helm的打包格式,其实就是一系列文件打包出来的整体。一个chart包里可以包含多个资源文件,在发布时只需要通过一个命令便能实现多个资源文件一起发布。平台上提供的helm仓库用于管理chart包。

1.2 发布基本逻辑

1.2.1 配置Chart包

配置chart包需要用到helm工具,本地需先安装

1)先创建chart,此处chart名是test-service

helm create test-service

2)配置好chart中的k8s资源文件yaml

如:Chart.yaml、values.yaml和templates\xxx.yaml等

3)chart打包,形成chart包

helm package test-service

4)上传chart包到helm仓库(可参考下面步骤)

5)更新本地helm仓库,使得本地仓库和远程仓库同步

helm repo update

1.2.2 helm发布k8s

1)从远程仓库拉取chart在本地解压,或者本地存在chart,在部署时使得helm能够解析到chart结构,最主要读取的是chart目录中的value.yaml,tiller

2)通过helm install命令将chart发布k8s,最基本用法如下

helm install <chart_name> <release_name>

2. 在蓝鲸DevOps中做Helm发布k8s

2.1 总体思路

1)开通网络策略

2)登记K8S凭证

3)K8S集群的配置

4)helm制品管理

5)配置流水线

2.2 具体动作

2.2.1 网络策略开通

DevOps公共构建机

K8S所有节点

源IP

方向

目标IP

端口

说明

-->

K8S的master节点

调用K8S的api端口(一般6443)

调用K8S进行发布

-->

DevOps镜像仓库域名/其他镜像仓库域名

访问端口:80(http)/443(https)/其他(按实际)

拉取镜像

2.2.2 登记k8s凭据

1)获取K8S凭据

位置:K8S集群内任何一台master服务器 /root/.kube/config文件

2)在DevOps登记凭证

位置:项目内【设置】-【凭证管理】,点击【新增凭据】,类型选择“K8S凭据”,把config里的全部内容复制到 凭据配置 里,名称没有强制要求(例如可以写成“k8s_token”),填写好其他信息后点击确定即可。

9b89a3a09f944b9156df1b80005d961b (1).png

2.2.3 k8s集群配置

1)安装tiller(K8S1.14版需要)

tiller是helm2的服务端,k8s1.14适配helm2需要安装才能使用插件部署

位置:k8s集群的master节点

可参考以下文档进行搭建

https://blog.csdn.net/bbwangj/article/details/81087911

https://www.jianshu.com/p/d0cdbb49569b

2)登录镜像仓库

位置:k8s集群的master节点

需要先在集群中登录镜像仓库,就会在服务器中生成/root/.docker/config.json文件,记录登录信息,用于创建secret

docker login 镜像仓库域名

3)创建namespace

kubectl create namespace test-service

4)创建secret

secret对象用来存储敏感数据,如 Pod 用于访问服务的凭据,此处需创建secret用于存储访问镜像仓库的凭据

位置:k8s集群的master节点

参考文档:https://code84.com/174214.html#harbor_382

参考命令:

# 查看登录凭证(base64)cat /root/.docker/config.json | base64 -w 0# 创建secret的配置文件(将凭证写入data的.dockerconfigjson)vim test-service.yamlapiVersion: v1kind: Secretmetadata:  name: test-service-pull-secret  namespace:test-servicedata:  .dockerconfigjson: XXXX# 创建secret资源kubectl create -f test-service.yaml# 查看secretkubectl get secrets

2.2.4 chart制品管理

1)创建helm仓库

访问项目,由项目管理员创建helm仓库,并根据仓库内指引生成凭证。

2)配置chart包

需要参数配置完整的chart包才能通过流水线进行helm部署。

chart中主要需关注的yaml有Chart.yaml、values.yaml和templates\xxx.yaml

  • Chart.yaml:对于chart包版本的信息会记录在Chart.yaml中,在helm打包时会自动生成以该版本号命名的.tgz包(如下配置,打出的包是(test-service-1.0.2.tgz)

apiVersion: v1appVersion:   1.0  description: 测试服务name: test-serviceversion: 1.0.2
  • values.yaml:对于镜像版本(tag)等信息,或者数据库链接、端口等信息,可以配置到values.yaml中,以变量形式传入templates/xxx.yaml中

# 镜像版本信息,如下配置会以变量名形式{{ .Values.app.version }}赋值到templates/xxx.yamlapp:  version: 1.4.2  active: test
  • templates\xxx.yaml:对于镜像和secret配置的信息在templates\xxx.yaml中,部署时拉镜像和启动pod会识别

# 以下是其中一段的示例(只是其中一段)apiVersion: apps/v1kind: Deploymentmetadata:  name: test-service  labels:    app: test-servicespec:  replicas: {{ .Values.api.replicas }}  selector:    matchLabels:      app: test-service  template:    metadata:      labels:        app: test-service    spec:      imagePullSecrets:        - name: test-service-pull-secret      containers:        - name: test-service          image: docker-bkrepo.xxx.com/a1234b/docker-test-service/test-service:{{ .Values.app.version }}          imagePullPolicy: Always

3)上传chart包到helm仓库

访问项目内的helm仓库,根据指引上传chart包

curl -F   chart=@<FILE_NAME>   -u <USERNAME>:< PERSONAL_ACCESS_TOKEN> https://bkrepo.xxx.com/helm/api/a1234b/helm-repository/charts# 例如curl -F   chart=@test-service-1.0.2.tgz   -u zhangsan:cb0e0b71caca4db79f706451ba945280 https://bkrepo.xxx.com/helm/api/a1234b/helm-repository/charts

2.2.5 流水线配置

1)集成和构建推送镜像

按常规的流水线集成动作,配置拉取代码、编译、构建和上传镜像

  1e6c267a1e85449043f8cb9b73735c24.png

2)拉取helm仓库制品

插件:【拉取Helm仓库制品】

  aab1b852f5ac40c066699e58cc31adb0.png

插件配置说明

① 选择项目:本项目

② helm仓库名:项目中对应helm仓库名称

③ chart包名称:helm仓库中对应的chart包名称

④ helm仓库用户:访问该helm仓库的用户名

⑤ 密码:访问该helm仓库的用户对应的访问token

3)解压chart包

插件:【Bash脚本】,编写命令解压chart包

03643ed2af574ece630e2a4923637d4e.png  

tar -xf xxxx.tgz

4)本地HELM发布K8S

插件:【本地Helm包部署到Kubernetes】、【本地Helm包部署到K8S1.14】

版本支持:

  • 【本地Helm包部署到Kubernetes】支持K8S1.16-1.22

  • 【本地Helm包部署到K8S1.14】支持K8S1.14(需先在k8s的master中安装tiller2.14.3版(helm2的服务端))

44bcdafa3fe94b656551fd8683919af6.png  

配置说明

① 凭证:在【凭证管理】中登记的K8S凭证

② 命名空间:K8S的namespace名字

③ Chart地址:Chart文件夹相对工作空间的路径

④ 发布名称:chart对应发布的名称

⑤ 等待超时:等待所有Pod启动完成的时间,建议根据实际情况填写。如果等待超时表示部署失败,为0时会一直等待,默认不填则不等待、直接认为部署成功。

⑥ 副本数量:副本集数量,存在则覆盖配置文件中的副本数

3. 常见问题及排查思路

3.1 问题排查思路

1)报错时看流水线插件日志,确认是在那一步出错,具体错误是什么,再对症下药

2)报错时看流水线插件的配置,确认配置无误,如包名、路径、发布名等

3)进入k8s看集群pod状态,根据详细信息排查: kubectl describe pod

3.2 常见问题场景

3.2.1 拉取镜像相关报错

问题:检查pod发现拉取镜像出错(拉取不到、拉取失败等)

排查方向

1)检查制品仓库中有无镜像,镜像有无和配置一致的版本;

2)检查网络策略是否开通;

3)检查登录仓库情况,可以测试直接在集群中通过原生docker命令拉取;

4)检查secret和yaml的配置

参考如下:https://www.cnblogs.com/unchch/p/11771005.html

3.2.2 configmaps已存在

问题:报错configmaps already exists

排查方向:检查pod运行占用情况,解除占用后再发布

3.2.3 报错release没找到

问题:报错release xxxxxx not found

排查方向:检查chart包资源文件中的配置是否有问题

3.2.4 报错端口占用

问题:端口占用,报错provided port is already allocated

排查方向:检查端口是否有被其他服务占用,尝试要改用别的端口(修改配置文件)

3.2.5 等待启动超时

问题:仅报错timed out waiting for the condition,等待启动超时,没有更具体原因

排查方向:helm侧问题不大,可以排查k8s侧,检查是否配置secret等

您需要登录后才可以回帖 立即登录
共收到 0 条点评
返回顶部