Prerequisites
- 具有一个 Kubernetes 集群 以部署 Spinnaker
- 可运行 Docker 的环境 (1 vCPU, 3.75 GB) 或者是 Ubuntu,用以安装 Halyard (用于 spinnaker 的服务)
- 对象存储 (MinIO),用于持久化 Spinnaker 的数据
- 对象存储的 Bucket 的访问账号
安装执行步骤
安装 Halyard
可以直接使用 Docker 方式安装,这个没什么必要性,就是管理工具而已,参考附录1 [1]
首先创建映射目录
|
|
然后执行 docker run 运行容器
|
|
因为 docker 环境不能重启服务,需要修改配置文件,这里可以在外部创建一个配置文件来映射进去,这里后面会说到 GCS 的问题
|
|
修改 spinnaker 部分的配置,将 enabled: true
,改为 enabled: false
|
|
然后将输出的配置文件保存到宿主机,而后映射到容器内即可
|
|
安装kubectl
这部分在上一章中注明了挂载 kubectl 的路径
使用 Docker 运行的 Halyard 可以直接挂在 kubectl 到 容器内就可以了,halyard 默认的路径在 /usr/local/bin
只要避免和这个路径冲突就可以了。
halyard 中附带的 kubectl 不一定与你的集群版本一致
最后进入容器就可以管理 spinnaker 了
|
|
生成一个 Halyard config [3]
离线安装时,需要生成一个 Halyard config 文件,默认在 ~/.hal/config
|
|
Notes:
- 如果是选择离线安装或者 Local 方式安装,那么 local 关键字必须加
- 如果主机没有网,此时需要指定参数
--no-validate
来控制关闭验证,验证通常要联网- 对于执行大部分的 hal 命令都会在
~/.hal/config
生成配置文件
选择云供应商
这里可以指选择一个 Kubernetes 集群将其添加到 Halyard config 中
注意,这里需要时 Kubectl 可以正常请求集群,即需要 kubectl 与 kubeconfig
但在选择 Kubernetes 作为 Halyard 的 provider 之前,可以在 Kubernetes 中创建一个新的 service 以在 Halyard 中使用。
|
|
启用 kubernetes,并配置使用的 kubernetes 用户
|
|
Halyard 有几种部署 Spinnaker 服务的选项,例如Local, git 和 Distributed,这里使用 Distributed 模式,将 Spinnaker 以分布式方式部署到 Kubernetes内。
|
|
配置S3存储
Spinnaker 需要外部存储,例如 S3 对象存储置,为此,我使用 Minio 作为外部存储服务。这里使用 docker 进行部署,作为学习,也可以使用 minIO 官方提供的 minIO-dev [4],可以快速在 Kubernetes 集群上部署一个单实例的 minIO
|
|
如果需要开启,那么需要在目录 ~/.hal/default/profiles/front50-local.yml
创建文件
|
|
然后使用以下命令进行配置到 halyard config 文件
|
|
生成一个BOM文件
找一台有外网的主机,执行下列命令
|
|
Note: 如果开启了
gcs.enabled: true
需要重新启动一个容器,因为这个步骤需要联网查询
|
|
将输出的文件保存在 halyard 容器内 ~/.hal/.boms/bom/{version}.yml
,将 {version}
替换为你安装的版本,例如这里为 1.19.2
其次,要在本地执行此操作的容器内,需要在 halconfig
目录下有对应的 BOM 清单,清单格式如下:
|
|
这些文件夹需要自行创建,并且里面的配置文件也需要自行创建,如果不知道格式如何,可以参考 Spinnaker github 仓库上,每一个上面的文件夹都是一个项目仓库,而这些仓库的根目录都存在一个 halconfig 目录,此时需要你将对应的文件保存到对应目录下,例如,clouddriver 文件夹需要选择 github.com/spinnaker/clouddriver 项目,而配置文件需要选择 {service_name}.yml
为命名的,例如 clouddriver 就需要选择 clouddriver.yml,这个需要自行下载。
可以使用下列脚本进行生成这些配置文件(需要上网)
|
|
在执行脚本时需要在容器运行的宿主机进行,如果这台主机没有网络,那么可以在其他机器执行
额外下载一个 packer.tar.gz
这里 进入文件夹 rosco/master
rosco
有一个文件夹叫packer,这将其移至文件夹并解压缩为 packer.tar.gz
|
|
为BOM服务配置local关键字
对于离线安装,我们需要为 BOM 中的每个服务使用的镜像名称都增加一个 local:
前缀,这是官方的固定格式 [5]
|
|
配置镜像获取源
这里可以选择 直接 docker 导入镜像到每个 Kubernetes worker 节点上,也可以选择配置私有镜像仓库。
如果需要使用私有镜像,那么需要修改 VERSION.yml
中的dockerRegistry 选项,将其修改为你自己的镜像仓库
|
|
或者使用 docker save
通过命令导出镜像为 tar.gz
文件,然后导入到所有的 Kubernetes 的工作节点上
部署
可以直接执行 hal deploy
命令可以进行部署,更新,删除等操作
|
|
在默认部署情况下,igor 与 fiat 是不开启的,如果你配置了授权与CI的配置,那么会部署上这两个服务sss
这里会生成 Kubernetes 的资源,而手动创建的资源会存在 S3 对象存储中
Troubleshooting
Could not load “versions.yml” from config bucket: xx [2]
这是因为默认情况下从GCS读取配置文件,可以通过修改配置文件 /opt/spinanker/config/halyard-local.yml
关闭 gcs 功能(或 /opt/halyard/config/halyard.yml
)
|
|
Notes: 修改完成后需要重启进程,并且修改时需要使用root用户进入容器内
text
1 2
docker exec -it 4f3c037d2e3c bash hal shutdown
Unable to retrieve profile “clouddriver.yml”
|
|
解决:BOM需要按照固定格式,创建对应每个配置文件的清单
Unable to retrieve profile “versions.yml”
|
|
解决:关闭 GCS 即可
No persistent storage type was configured
|
|
解决:hal config storage s3 edit
Error retirveing contentes of archive packer.tar.gz
|
|
解决:拷贝对应服务的 github 仓库中的 packer 文件夹
No profile reader exists to read
|
|
解决:因为 bom 文件中镜像没有设置 local
Access to XMLHttpRequest at ‘xxx’ has been blocked by CORS policy
如下图所示:
官方给出的检查方法是“排查 gate 服务的可用性” [8],但检查 gate 日志没有问题,service ip 请求也是通的
|
|
请求 service ip + port
|
|
浏览器访问 gate url 也是正常的
访问首页提示如下错误,但是单独访问 gate 页面没有问题
报错如下:
|
|
解决:如果使用 Halyard 部署 Spinnaker,则可以使用以下设置创建文件 ~/.hal/default/profiles/gate-local.yml
|
|
Reference
[2] ERROR Could not load “versions.yml” from config bucket: 403 #3920
[3] Spinnaker: How to bring custom boms into spinnaker pod to be able to deploy it with hal?
[4] MinIO Object Storage for Kubernetes
[5] BOMs and Configuration on your Filesystem
[6] ! ERROR No persistent storage type was configured. #5875
[7] Install in Air Gaped Environment
[8] I can’t load the Applications screen
[9] use k8s cluster private, how to access? not use localhost! #4689