作者:张新峰
审校:孙海洲
原文链接:http://www.servicemesher.com/blog/prow-quick-start-guide/
编者按
Prow 是 Google 发起的适应云原生开源项目的 ChatOps 系统。Kubernetes、Istio 等项目都使用 Prow 实现开源协同。
我们将以我的 Github 测试仓库 zhangsean/prow-test 为例,来演示在一个本地k8s集群上使用 Prow 来实现CI/CD的诸多效果。
准备一个k8s集群
Prow 运行在 k8s 集群中,最好运行在有公网IP地址的k8s集群,可以免去 Webhook 转发的麻烦。临时测试可以使用本地集群。我使用 kind 创建一个本地 k8s 集群,使用 minikube 等其他工具都可以。
# 创建一个本地集群kind create clusterexport KUBECONFIG=$(kind get kubeconfig-path)# 确认k8s启动成功kubectl versionkubectl get po -A# 部署 Ingress 控制器会使访问更方便,如果你的 k8s 集群已经有 Ingress 或者想用 NodePort 则可以跳过# 以下 Traefik Ingress Controller 中启用了默认 https 协议,替换111.22.3.4成你的主机IP即可访问 http://traefik.主机IP.nip.io 查看 Traefik 控制界面curl -sSL https://github.com/zhangsean/prow-quickstart/blob/master/traefik-ds.yaml?raw= | sed 's|192.168.64.10|111.22.3.4|g' | kubectl apply -f - 创建一个本地集群
kind create cluster
export KUBECONFIG=$(kind get kubeconfig-path)
# 确认k8s启动成功
kubectl version
kubectl get po -A
# 部署 Ingress 控制器会使访问更方便,如果你的 k8s 集群已经有 Ingress 或者想用 NodePort 则可以跳过
# 以下 Traefik Ingress Controller 中启用了默认 https 协议,替换111.22.3.4成你的主机IP即可访问 http://traefik.主机IP.nip.io 查看 Traefik 控制界面
curl -sSL https://github.com/zhangsean/prow-quickstart/blob/master/traefik-ds.yaml?raw= | sed 's|192.168.64.10|111.22.3.4|g' | kubectl apply -f -
准备一个 Github 机器人账号
说明:体验 Prow 效果并不需要额外注册一个 Github 机器人账号,用个人账号完全不影响 Prow 的效果,给 Prow 配置机器人账号只是可以在 PR 中清楚区分哪些是人为和机器人的操作。
如果你还没有机器人账号,请在 Github 注册一个机器人账号,我注册了 zhangsean-bot
。
在你的项目仓库中把机器人账号加入合作者中,复制邀请链接,用机器人账号登录 Github 打开邀请链接并接受邀请,这样机器人就有权限读取和操作你的仓库了。
准备 Github 认证令牌
为了授权 Prow 访问 Github 项目动态,用机器人或个人账号登录 Github 并在 Github Tokens 中添加一个含有 repo:status
和 public_repo
权限的令牌。
添加成功后把生成的令牌字符串写入到
oauth-token
文件并保存到 k8s 中。
echo "f192f1277d47aff3eb60e99530b1cdc6639fda3c" > oauth-tokenkubectl create secret generic oauth-token --from-file=oauth=./oauth-token
再生成一个用于 Github Webhook 认证的 hmac 令牌,并保存到 k8s 中:
openssl rand -hex 20 > hmac-tokenkubectl create secret generic hmac-token --from-file=hmac=./hmac-token
部署 Prow
# 部署 Prow starter 集群,默认部署到 default 命名空间kubectl apply -f https://github.com/kubernetes/test-infra/blob/master/prow/cluster/starter.yaml?raw=# 等待所有 pods 状态都变成 Runningkubectl get po# 查看 Prow 默认部署的 ingresskubectl get ing# 查看 deck 和 hook 服务的 NodePort 端口kubectl get svc 部署 Prow starter 集群,默认部署到 default 命名空间
kubectl apply -f https://github.com/kubernetes/test-infra/blob/master/prow/cluster/starter.yaml?raw=
# 等待所有 pods 状态都变成 Running
kubectl get po
# 查看 Prow 默认部署的 ingress
kubectl get ing
# 查看 deck 和 hook 服务的 NodePort 端口
kubectl get svc
服务列表如下所示,deck
的 NodePort 端口是31920
,hook
的 NodePort 端口是30868
。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEdeck NodePort 10.0.13.133 <none> 80:31920/TCP 85shook NodePort 10.0.2.190 <none> 8888:30868/TCP 85skubernetes ClusterIP 10.0.0.1 <none> 443/TCP 28mtide NodePort 10.0.86.177 <none> 80:31254/TCP 85s
hook NodePort 10.0.2.190 <none> 8888:30868/TCP 85s
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 28m
tide NodePort 10.0.86.177 <none> 80:31254/TCP 85s