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 网络策略开通
源IP
|
方向
|
目标IP
|
端口
|
说明
|
DevOps公共构建机
-->
|
K8S的master节点
|
调用K8S的api端口(一般6443)
|
调用K8S进行发布
|
K8S所有节点
-->
|
DevOps镜像仓库域名/其他镜像仓库域名
|
访问端口:80(http)/443(https)/其他(按实际)
|
拉取镜像
|
2.2.2 登记k8s凭据
1)获取K8S凭据
位置:K8S集群内任何一台master服务器 /root/.kube/config文件
2)在DevOps登记凭证
位置:项目内【设置】-【凭证管理】,点击【新增凭据】,类型选择“K8S凭据”,把config里的全部内容复制到 凭据配置 里,名称没有强制要求(例如可以写成“k8s_token”),填写好其他信息后点击确定即可。
2.2.3 k8s集群配置
1)安装tiller(K8S1.14版需要)
tiller是helm2的服务端,k8s1.14适配helm2需要安装才能使用插件部署
位置:k8s集群的master节点
可参考以下文档进行搭建
l https://blog.csdn.net/bbwangj/article/details/81087911
l 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)集成和构建推送镜像
按常规的流水线集成动作,配置拉取代码、编译、构建和上传镜像
2)拉取helm仓库制品
插件:【拉取Helm仓库制品】
插件配置说明
① 选择项目:本项目
② helm仓库名:项目中对应helm仓库名称
③ chart包名称:helm仓库中对应的chart包名称
④ helm仓库用户:访问该helm仓库的用户名
⑤ 密码:访问该helm仓库的用户对应的访问token
3)解压chart包
插件:【Bash脚本】,编写命令解压chart包
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的服务端))
配置说明
① 凭证:在【凭证管理】中登记的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等