Spinnaker可以通过Docker镜像的变化来触发部署,这种方法允许你在Docker镜像发生变化时自动启动新的部署流程。
示例原理如下图所示:
以下是如何在Spinnaker中实现基于Docker Registry触发部署的配置流程。最终实现的效果如下:
前置要求:
官方文档:https://spinnaker.io/docs/setup/install/providers/docker-registry/
配置spinnaker,启用docker-registry提供程序:
hal config provider docker-registry enable
假设您的注册表具有地址 $ADDRESS
、存储库 $REPOSITORIES
、用户名 $USERNAME
和密码 $PASSWORD
ADDRESS=registry.cn-shenzhen.aliyuncs.com
REPOSITORIES=cnmirror/nginx
USERNAME=[email protected]
PASSWORD=xxxxxx
运行以下 hal
的帐户添加到 Docker 注册表帐户列表中:
hal config provider docker-registry account add aliyun-acr \
--address $ADDRESS \
--repositories $REPOSITORIES \
--track-digests=true \
--username $USERNAME \
--password $PASSWORD
注意:参数–track-digests=true是一个重要的参数,因此即使标签已经存在但内容随摘要(哈希值)更改,管道也可以自动触发。
重新部署spinnaker,以使配置生效。
hal deploy apply
点击右侧Create Application
配置名称和邮箱
选择Automated Triggers,点击Add Trigger
在Type选框中搜索Docker Registry,并选择以下参数
在下方Artifact Constraints
中,定义一个新的Artifact
填写的相关参数:
Docker image: registry.cn-shenzhen.aliyuncs.com/cnmirror/nginx
Object path:registry.cn-shenzhen.aliyuncs.com/cnmirror/nginx:${parameters['VERSION']}
点击 Add stage
选择Type类型为Deploy(Manifest),选择Account及应用部署的Namespace,最后配置Manifest。
示例Manifest如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-app
name: nginx-app
spec:
replicas: 1
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/cnmirror/nginx
name: nginx-app
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app
labels:
run: nginx-app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx-app
点击右下方的Save Changes。
这里准备一个nginx镜像作为示例应用,jenkins镜像构建部分省略,作为演示使用手动方式上传镜像到镜像仓库。
docker pull docker.io/library/nginx:latest
docker tag docker.io/library/nginx:latest registry.cn-shenzhen.aliyuncs.com/cnmirror/nginx:v1.0
docker push registry.cn-shenzhen.aliyuncs.com/cnmirror/nginx:v1.0
等待片刻,点击PIPELINES,查看部署是否成功
连接到kubernetes集群,查看部署的nginx-app pods以及service
root@node40:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app-7bf7d4d4cd-hhrtj 1/1 Running 0 26s
root@node40:~#
root@node40:~# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 74m
nginx-app ClusterIP 10.96.3.41 <none> 80/TCP 63m
查看镜像
root@node40:~# kubectl get pods -l app=nginx-app -o yaml | grep image:
- image: registry.cn-shenzhen.aliyuncs.com/cnmirror/nginx:v1.0
image: registry.cn-shenzhen.aliyuncs.com/cnmirror/nginx:v1.0
推送新的镜像到镜像仓库,模拟jenkins镜像构建
docker tag docker.io/library/nginx:latest registry.cn-shenzhen.aliyuncs.com/cnmirror/nginx:v1.1
docker push registry.cn-shenzhen.aliyuncs.com/cnmirror/nginx:v1.1
确认新的PIPELINES部署已自动执行
查看镜像,已更新为v1.1版本
root@node40:~# kubectl get pods -l app=nginx-app -o yaml | grep image:
- image: registry.cn-shenzhen.aliyuncs.com/cnmirror/nginx:v1.1
image: registry.cn-shenzhen.aliyuncs.com/cnmirror/nginx:v1.0
参考:
https://docs.armory.io/continuous-deployment/spinnaker-user-guides/kubernetes-deployments/