亚马逊AWS官方博客
在 Amazon EKS 上使用 Spinnaker 实现持续交付
我与合作伙伴密切合作,帮助他们在 AWS 上为客户构建解决方案。有些客户在 Amazon Elastic Kubernetes Service (Amazon EKS) 上运行基于微服务的应用程序,他们需要使用 Jenkins 和 Spinnaker 构建完整的端到端持续集成 (CI) 和持续部署/交付 (CD) 管道方面的指导。使用 Jenkins 的好处很多:它是备受欢迎的 CI 服务器,配备出色的社区支持,同时还支持多种插件(Slack、GitHub、Docker、Build Pipeline)。Spinnaker 提供自动发布和内置部署功能,并支持即开即用的蓝/绿部署。本文重点介绍持续交付,并将讨论如何在 Amazon EKS 上安装和配置 Spinnaker。
您还可以参阅之前的博文在 Kubernetes 上使用 Spinnaker 构建部署管道,在本文中,Prabhat Sharma 对 Spinnaker 的一些基本概念进行了解释。
概念概述
Amazon EKS 在多个 AWS 可用区中运行 Kubernetes 管理基础设施,并且会自动检测并替换运行状况不佳的控制平面节点,同时提供按需升级和修补。您只需预置工作节点并将它们连接到所提供的 Amazon EKS 终端节点即可。
在软件工程中,持续集成是一种每天数次将所有开发人员的工作副本合并到共享主线中的做法。持续集成 (CI) 一词由 Grady Booch 于 1991 年首次提出,但是他并未主张每天进行多次集成。
持续交付是一种软件工程方法。采用该方法的团队可以在短周期内生成软件,确保可以随时、可靠地发布软件(支持手动发布)。这种方法旨在更快、更频繁地构建、测试和发布软件。
持续部署是一种软件发布策略。采用该策略后,所有通过自动化测试阶段的代码提交都将自动发布到生产环境中,用于进行对软件用户可见的更改。
先决条件
为了实现本文中列出的操作,您需要以下资源:
架构
本文中,我们将讨论下列适用于持续交付的架构:
图 1.持续交付架构
我们将按照以下步骤创建持续交付架构:
- 创建 AWS Cloud9 环境
- 配置 AWS Cloud9 环境
- 创建 Amazon EKS 集群
- 安装并配置 Spinnaker
- 清理
创建 AWS Cloud9 环境
登录 AWS 管理控制台,然后在搜索栏中搜索 Cloud9 服务:
图 2.AWS 管理控制台
单击 Cloud9,然后在 us-east-2 区域创建基于 Ubuntu Server 18.04 LTS(Amazon Linux 尚不支持 Halyard)的 AWS Cloud9 环境。选择相应的设置(如图 3 所示),其中平台类型选择 Ubuntu Server 18.04 LTS。
图 3.AWS Cloud9 设置
配置 AWS Cloud9 环境
启动 AWS Cloud9 IDE。在新打开的终端会话中,按照下方说明配置 AWS Cloud9 环境。
1.安装并配置 Kubectl
在 AWS Cloud9 Ubuntu 计算机上安装 kubectl
和 aws-iam-authenticator
:
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
curl -o aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.7/2019-06-11/bin/linux/amd64/aws-iam-authenticator
chmod +x ./aws-iam-authenticator
mkdir -p $HOME/bin && cp ./aws-iam-authenticator $HOME/bin/aws-iam-authenticator && export PATH=$HOME/bin:$PATH
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
aws-iam-authenticator help
该脚本通过显示 aws-iam-authenticator
的帮助内容来验证 aws-iam-authenticator
是否正常工作。
2.升级 awscli
aws --version
pip install awscli --upgrade --user
3.安装 eksctl
curl --silent --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
4.安装 Terraform
wget https://releases.hashicorp.com/terraform/0.12.4/terraform_0.12.4_linux_amd64.zip
unzip terraform_0.12.4_linux_amd64.zip
sudo mv terraform /usr/local/bin/
export PATH=$PATH:/usr/local/bin/terraform
5.安装 Halyard
curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/debian/InstallHalyard.sh
sudo bash InstallHalyard.sh
sudo update-halyard
hal -v
创建 Amazon EKS 集群
为了创建完整环境,我将创建三个 AWS EKS 集群:一个用于生产,一个用于 UAT,一个用于 Spinnaker 安装。在 AWS Cloud9 IDE 内,运行以下命令来创建这些 Amazon EKS 集群。(您可以选择自己的首选区域。在本文中,我将使用 us-east-2 来预置用于 Spinnaker 部署的 Amazon EKS 集群,并使用 us-east-1 预置 UAT 和生产版 Amazon EKS 集群。)
1.创建生产版 Amazon EKS 集群
eksctl create cluster --name=eks-prod --nodes=3 --region=us-east-1 \
--write-kubeconfig=false
图 4. eksctl
2.创建 UAT Amazon EKS 集群
eksctl create cluster --name=eks-uat --nodes=3 --region=us-east-1 \
--write-kubeconfig=false
3.创建 Spinnaker Amazon EKS 集群
eksctl create cluster --name=eks-spinnaker --nodes=2 --region=us-east-2 \
--write-kubeconfig=false
eksctl 是一款用于在 Amazon EKS 上创建集群的简单 CLI 工具,可用于创建 Amazon EKS 集群架构的以下组件:
图 5.Amazon EKS 集群
安装并配置 Spinnaker
本部分将引导您完成与 Amazon EKS 配套使用的 Spinnaker 的安装和配置过程。我更喜欢使用 Armory Spinnaker,因为:
- Armory 提供的安装程序可以通过执行
hal armory init
命令来完成许多所需的配置,并且这些配置支持 AWS Simple Storage Service S3。 - Armory 提供管道即代码功能,您可以将管道配置存储在源代码控件中,实现一种可保证一致性的版本化应用程序部署方法。在 op 中,您只能通过 UI 创建管道。
- Armory 使用第三方工具开发了 Spinnaker 的原生集成 (https://www.armory.io/integrations)。
1.检索 Amazon EKS 集群 kubectl 上下文
aws eks update-kubeconfig --name eks-spinnaker --region us-east-2 \
--alias eks-spinnaker
aws eks update-kubeconfig --name eks-uat --region us-east-1 \
--alias eks-uat
aws eks update-kubeconfig --name eks-prod --region us-east-1 \
--alias eks-prod
2.检查 halyard 版本
hal -v
3.创建并配置 Docker 注册表
hal config provider docker-registry enable
hal config provider docker-registry account add ibuchh-docker \
--address index.docker.io --username ibuchh --password
该命令会提示您输入 Docker 账户密码。
4.添加并配置 GitHub 账户
hal config artifact github enable
hal config artifact github account add spinnaker-github --username ibuchh \
--password --token
该命令会提示您输入 GitHub 令牌(可从 GitHub 账户设置中获取)。
5.添加并配置 Kubernetes 账户
生产版 Amazon EKS 账户:
启用 Kubernetes 提供程序:
hal config provider kubernetes enable
kubectl config use-context eks-prod
kubeconfig 文件中的上下文元素用于通过方便快捷的命名对访问参数进行分组。每个上下文都有三个参数:集群、命名空间和用户。默认情况下,kubectl 命令行工具使用当前上下文中的参数与集群进行通信。
CONTEXT=$(kubectl config current-context)
我们将为三个 Amazon EKS 集群创建服务账户。请参阅 Kubernetes 文档,详细了解服务账户。
kubectl apply --context $CONTEXT \
-f https://spinnaker.io/downloads/kubernetes/service-account.yml
提取 spinnaker-service-account
的密钥令牌:
TOKEN=$(kubectl get secret --context $CONTEXT \
$(kubectl get serviceaccount spinnaker-service-account \
--context $CONTEXT \
-n spinnaker \
-o jsonpath='{.secrets[0].name}') \
-n spinnaker \
-o jsonpath='{.data.token}' | base64 --decode)
在 kubeconfig
中设置用户条目:
kubectl config set-credentials ${CONTEXT}-token-user --token $TOKEN
kubectl config set-context $CONTEXT --user ${CONTEXT}-token-user
将 eks-prod 集群
添加为 Kubernetes 提供程序。
hal config provider kubernetes account add eks-prod --provider-version v2 \
--docker-registries ibuchh-docker --context $CONTEXT
UAT Amazon EKS 账户:
kubectl config use-context eks-uat
CONTEXT=$(kubectl config current-context)
kubectl apply --context $CONTEXT \
-f https://spinnaker.io/downloads/kubernetes/service-account.yml
提取 spinnaker-service-account
的密钥令牌:
TOKEN=$(kubectl get secret --context $CONTEXT \
$(kubectl get serviceaccount spinnaker-service-account \
--context $CONTEXT \
-n spinnaker \
-o jsonpath='{.secrets[0].name}') \
-n spinnaker \
-o jsonpath='{.data.token}' | base64 --decode)
在 kubeconfig
文件中设置服务账户条目:
kubectl config set-credentials ${CONTEXT}-token-user --token $TOKEN
kubectl config set-context $CONTEXT --user ${CONTEXT}-token-user
将 eks-uat
集群添加为 Kubernetes 提供程序。
hal config provider kubernetes account add eks-uat --provider-version v2 \
--docker-registries ibuchh-docker --context $CONTEXT
Spinnaker Amazon EKS 账户:
kubectl config use-context eks-spinnaker
CONTEXT=$(kubectl config current-context)
kubectl apply --context $CONTEXT \
-f https://spinnaker.io/downloads/kubernetes/service-account.yml
提取 spinnaker-service-account
的密钥令牌:
TOKEN=$(kubectl get secret --context $CONTEXT \
$(kubectl get serviceaccount spinnaker-service-account \
--context $CONTEXT \
-n spinnaker \
-o jsonpath='{.secrets[0].name}') \
-n spinnaker \
-o jsonpath='{.data.token}' | base64 —decode)
在 Kubeconfig 文件中设置服务账户条目:
kubectl config set-credentials ${CONTEXT}-token-user --token $TOKEN
kubectl config set-context $CONTEXT --user ${CONTEXT}-token-user
将 eks-spinnaker
集群添加为 Kubernetes 提供程序。
hal config provider kubernetes account add eks-spinnaker --provider-version v2 \
--docker-registries ibuchh-docker --context $CONTEXT
6.启用构件支持
hal config features edit --artifacts true
7.配置 Spinnaker 以便在 Kubernetes 中安装
基于环境情况,我们将在 Kubernetes 集群上使用分布式 Spinnaker 安装。该安装模型通过 Halyard 分别部署每个 Spinnaker 微服务。分布式安装有助于限制由更新造成的停机时间,因此建议您在生产环境中使用该模型。
hal config deploy edit --type distributed --account-name eks-spinnaker
8.配置 Spinnaker 以便使用 AWS S3
此步骤需要您的 AWS 账户的访问密钥和秘密访问密钥。
export YOUR_ACCESS_KEY_ID=<access-key>
hal config storage s3 edit --access-key-id $YOUR_ACCESS_KEY_ID \
--secret-access-key --region us-east-2
在提示符处输入您的 AWS 账户的秘密访问密钥。
hal config storage edit --type s3
9.选择 Spinnaker 版本
要确定需要安装的 Spinnaker 的最新版本,请运行以下命令获取可用版本的列表:
hal version list
截至写作本文时,Spinnaker 的最新版本是 1.15.0:
export VERSION=1.15.0
hal config version edit --version $VERSION
现在,我们已完成在 eks-spinnaker Amazon EKS 集群上安装 Spinnaker 的准备工作。
hal deploy apply
10.验证 Spinnaker 安装
kubectl -n spinnaker get svc
图 6.Spinnaker 微服务
11.使用弹性负载均衡器暴露 Spinnaker
我将通过运行以下命令来创建 spin-gate-public
和 spin-deck-public
服务,经由负载均衡器暴露 Spinnaker API (Gate) 和 Spinnaker UI (Deck):
export NAMESPACE=spinnaker
kubectl -n ${NAMESPACE} expose service spin-gate --type LoadBalancer \
--port 80 --target-port 8084 --name spin-gate-public
kubectl -n ${NAMESPACE} expose service spin-deck --type LoadBalancer \
--port 80 --target-port 9000 --name spin-deck-public
export API_URL=$(kubectl -n $NAMESPACE get svc spin-gate-public \
-o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
export UI_URL=$(kubectl -n $NAMESPACE get svc spin-deck-public \
-o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
hal config security api edit --override-base-url http://${API_URL}
hal config security ui edit --override-base-url http://${UI_URL}
hal deploy apply
12.重新验证 Spinnaker 安装
kubectl -n spinnaker get svc
图 7.Spinnaker UI 终端节点
13.登录 Spinnaker 控制台
打开浏览器,使用 spin-deck-public services
终端节点登录 Spinnaker UI,如上图所示。
图 8.Spinnaker 控制台
清理
在 AWS Cloud9 IDE 内,运行以下命令来清理这三个 Amazon EKS 集群:
eksctl delete cluster --name=eks-uat --region=us-east-1
eksctl delete cluster --name=eks-prod --region=us-east-1
eksctl delete cluster --name=eks-spinnaker --region=us-east-2
小结
在本文中,我概述了在 Amazon EKS 上使用 Spinnaker (Halyard) 安装和配置持续交付平台所需步骤的详细说明。Spinnaker 可以与 Jenkins 集成以构建完整的持续集成 (CI) 和持续部署/交付 (CD) 管道。有关更多信息,请参阅 Spinnaker 文档。
如果您有任何问题或建议,请在下方留言。