亚马逊AWS官方博客

在 Amazon EKS 上使用 Spinnaker 实现持续交付

我与合作伙伴密切合作,帮助他们在 AWS 上为客户构建解决方案。有些客户在 Amazon Elastic Kubernetes Service (Amazon EKS) 上运行基于微服务的应用程序,他们需要使用 JenkinsSpinnaker 构建完整的端到端持续集成 (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 服务:

AWS 管理控制台用户界面。

图 2.AWS 管理控制台

单击 Cloud9,然后在 us-east-2 区域创建基于 Ubuntu Server 18.04 LTS(Amazon Linux 尚不支持 Halyard)的 AWS Cloud9 环境。选择相应的设置(如图 3 所示),其中平台类型选择 Ubuntu Server 18.04 LTS。

建议的 AWS Cloud9 设置。

图 3.AWS Cloud9 设置

配置 AWS Cloud9 环境

启动 AWS Cloud9 IDE。在新打开的终端会话中,按照下方说明配置 AWS Cloud9 环境。

1.安装并配置 Kubectl

在 AWS Cloud9 Ubuntu 计算机上安装 kubectlaws-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

eksctl 命令的详细输出。

图 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 集群架构的以下组件:

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

Spinnaker 微服务。

图 6.Spinnaker 微服务

11.使用弹性负载均衡器暴露 Spinnaker

我将通过运行以下命令来创建 spin-gate-publicspin-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

Spinnaker UI 终端节点。

图 7.Spinnaker UI 终端节点

13.登录 Spinnaker 控制台

打开浏览器,使用 spin-deck-public services 终端节点登录 Spinnaker UI,如上图所示。

Spinnaker 控制台。

图 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 文档

如果您有任何问题或建议,请在下方留言。