我有一个类似的工作流程,我希望这可以帮助你找到一些方向。我正在为 CI 使用 bitbucket 管道,但我相信 Jenkins 也可以正常工作。
这就是我在 CI 流程中所做的:
- 构建我的代码并安装依赖项
- 创建一个具有唯一标签 (commit-id) 的容器 >
my-cntnr:12
- 推送到 ECR
- 用于 my-pod > set 的 Curl Rancher API(图片
my-cntnr:12
:)
- Kubernetes 更新 pod 并从 ECR 中拉取标签为 12 的容器
这是供参考的脚本:
- composer install --no-interaction
- docker build -t cms .
- docker tag myrepo:latest 123456789.dkr.ecr.my-region.amazonaws.com/myrepo:$BITBUCKET_BUILD_NUMBER
- aws ecr get-login --no-include-email --region my-region >> login.sh
- sh login.sh
- docker push 123456799.dkr.ecr.my-region.amazonaws.com/myrepo:$BITBUCKET_BUILD_NUMBER
- sh .docker/workload-update.sh // my curl script calling rancher API
注意:由于我使用的是 Rancher,我可以使用 Rancher API 来更新 pod 及其配置。
现在对于 Kubernetes 的 ECR 凭证部分,您必须创建一个密钥(仅限 Kubernetes 的实体),该密钥是使用您的 AWS ECR 详细信息创建的。然后你可以在你的 pod.yml 中使用这个秘密作为 image-pull-secret。这将告诉 k8 使用秘密并从 ECR 中提取图像
我有一个简单的脚本可以快速做到这一点。
#
# RUN me where kubectl is available,& make sure to replace account,region etc
#
ACCOUNT=123456789
REGION=my-region
SECRET_NAME=${REGION}-ecr-registry
EMAIL=email@email.com ( can be anything)
#
# Fetch token (which will expire in 12 hours)
#
TOKEN=`aws ecr --region=$REGION get-authorization-token --output text --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2`
#
# Create or replace registry secret
#
kubectl delete secret --ignore-not-found $SECRET_NAME
kubectl create secret docker-registry $SECRET_NAME \
--docker-server=https://${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com \
--docker-username=AWS \
--docker-password="${TOKEN}" \
--docker-email="${EMAIL}"
这就是你如何在你的 pod.yml 中使用它
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
app: my-app
spec:
containers:
- image: 123456789.dkr.ecr.my-region.amazonaws.com/my-repo
name: -cntnr
ports:
- containerPort: 8080
imagePullSecrets:
- name: my-secret-name ( this will be same as name of secret we created earlier)
我也写了一篇关于这个过程的详细文章。请在这里找到。