使用 AWS EKS 和 AWS Fargate 从私有 github 包中提取 docker 图像
Pulling docker image from private github package using AWS EKS with AWS Fargate
我希望在 aws 上使用 kubernetes 部署 docker 化服务。为此,我使用最近发布的 AWS EKS 和 AWS Fargate 功能。服务的 docker 图像存储在 github.
上的私有包中
为了部署我的服务,我使用了包含机密、部署和服务的 kubernetes 清单文件。
在 minikube 上使用 kubectl 进行本地部署时,部署 pods 成功从私有 github 包中拉取镜像。我成功重现了访问私有 dockerhub 注册表的过程。
然后我配置了 kubectl 以连接到我的 eks 集群。 在应用清单文件时,我在从 dockerhub[= 拉取表单 github 包时获得部署 pods 的 ImagePullBackOff 状态50=]。清单文件的不同之处如下:
正在为 github 个包生成秘密:
kubectl create secret docker-registry mySecret --dry-run=true --docker-server=https://docker.pkg.github.com --docker-username=myGithubUsername --docker-password=myGithubAccessToken -o yaml
正在为 docker 集线器生成秘密:
kubectl create secret docker-registry mySecret --dry-run=true --docker-server=https://index.docker.io/v1/ --docker-username=myDockerhubUsername --docker-password=myDockerhubPassword -o yaml
部署规范参考如下:
spec:
containers:
# when pulling from github packages
- image: docker.pkg.github.com/myGithubUsername/myRepo/myPackage:tag
# when pulling from dockerhub
- image: myDockerhubUsername/repository:tag
...
imagePullSecrets:
- name: mySecret
尝试使这项工作特别是 github 包 我尝试了 AWS Secrets Manager。
我创建了一个秘密 "mySecret" 如下:
{
"username" : "myGithubUsername",
"password" : "myGithubAccessToken"
}
然后我创建了一个策略来访问这个秘密:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
"arn:aws:secretsmanager:eu-west-1:myAWSAccountId:secret:mySecret"
]
}
]
}
然后我将该策略附加到我的 eks 集群的集群 IAM 角色及其 fargate 配置文件中引用的 Pod 执行角色 "fp-default"。我只在默认的 kubernetes 命名空间中工作。
我的secret和cluster都在eu-west-1区域。
仍然,我在部署时收到 ImagePullBackOff 状态。
我很难找到将 AWS Fargate 与 AWS EKS 结合使用来解决此问题的方法,希望对此有一些见解:)
编辑:编辑问题是为了更清楚地说明问题主要与使用 github 软件包作为注册表提供程序有关。
如果对 AWS 文档没有希望,您可以执行以下操作:
- 运行 daemonset,它将按设计为每个节点创建 pod。
- 这些 pods 将安装类型为 hostPath (/var/run/docker.sock) 的卷。
这些pods有docker个客户和运行以下"command "
docker login docker.pkg.github.com -u username -p passWord
现在你在容器里面登录了,但是并没有反映到Node.然后,您需要安装另一个 hostPath 卷 (~/.docker/config.json)。但挑战在于了解 Fargate 节点的主目录是什么。在下面的示例中,我输入了 /root
(卷),但它可以是其他内容。例如 /home/ec2-user
... 要检查的内容。
这是它的样子
apiVersion: apps/v1
kind: Daemonset
metadata:
name: docker-init
spec:
replicas: 1
template:
metadata:
name: worker
labels:
app: worker
spec:
initContainers:
- name: login-private-registies
image: docker
command: ['sh', '-c', 'docker login docker.pkg.github.com -u username -p passWord']
volumeMounts:
- name: dockersock
mountPath: "/var/run/docker.sock"
- name: dockerconfig
mountPath: "/root/.docker"
volumes:
- name: dockersock
hostPath:
path: /var/run/docker.sock
- name: dockerconfig
hostPath:
path: /root/.docker
我认为您需要在与部署相同的名称空间中创建您的机密。我能够通过创建一个秘密来完成这项工作
kubectl create secret docker-registry mySecret --dry-run=true --docker-server=https://docker.pkg.github.com --docker-username=myGithubUsername --docker-password=myGithubAccessToken --namespace=my-api -o yaml
在我的 deployment.yaml 中,我引用了它
spec:
containers:
- name: my-api
image: docker.pkg.github.com/doc-api:0.0.0
ports:
- containerPort: 5000
resources: {}
imagePullSecrets:
- name: mySecret
在深入挖掘并与一些 AWS 技术人员交流之后:
问题似乎是 EKS Fargate 在后台使用了 Containerd。
Containerd 和 Docker 尝试以不同的方式拉取图像。 Containerd 目前正在跟踪多个注册表提供商的多个问题,这些提供商仅正确支持 Docker 而不是 OCI HTTP API V2,github being one of them.
作为 mentioned 产品总监 Github,该问题将在几周到几个月内得到解决。
我希望在 aws 上使用 kubernetes 部署 docker 化服务。为此,我使用最近发布的 AWS EKS 和 AWS Fargate 功能。服务的 docker 图像存储在 github.
上的私有包中为了部署我的服务,我使用了包含机密、部署和服务的 kubernetes 清单文件。
在 minikube 上使用 kubectl 进行本地部署时,部署 pods 成功从私有 github 包中拉取镜像。我成功重现了访问私有 dockerhub 注册表的过程。
然后我配置了 kubectl 以连接到我的 eks 集群。 在应用清单文件时,我在从 dockerhub[= 拉取表单 github 包时获得部署 pods 的 ImagePullBackOff 状态50=]。清单文件的不同之处如下:
正在为 github 个包生成秘密:
kubectl create secret docker-registry mySecret --dry-run=true --docker-server=https://docker.pkg.github.com --docker-username=myGithubUsername --docker-password=myGithubAccessToken -o yaml
正在为 docker 集线器生成秘密:
kubectl create secret docker-registry mySecret --dry-run=true --docker-server=https://index.docker.io/v1/ --docker-username=myDockerhubUsername --docker-password=myDockerhubPassword -o yaml
部署规范参考如下:
spec:
containers:
# when pulling from github packages
- image: docker.pkg.github.com/myGithubUsername/myRepo/myPackage:tag
# when pulling from dockerhub
- image: myDockerhubUsername/repository:tag
...
imagePullSecrets:
- name: mySecret
尝试使这项工作特别是 github 包 我尝试了 AWS Secrets Manager。
我创建了一个秘密 "mySecret" 如下:
{
"username" : "myGithubUsername",
"password" : "myGithubAccessToken"
}
然后我创建了一个策略来访问这个秘密:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
"arn:aws:secretsmanager:eu-west-1:myAWSAccountId:secret:mySecret"
]
}
]
}
然后我将该策略附加到我的 eks 集群的集群 IAM 角色及其 fargate 配置文件中引用的 Pod 执行角色 "fp-default"。我只在默认的 kubernetes 命名空间中工作。 我的secret和cluster都在eu-west-1区域。
仍然,我在部署时收到 ImagePullBackOff 状态。
我很难找到将 AWS Fargate 与 AWS EKS 结合使用来解决此问题的方法,希望对此有一些见解:)
编辑:编辑问题是为了更清楚地说明问题主要与使用 github 软件包作为注册表提供程序有关。
如果对 AWS 文档没有希望,您可以执行以下操作:
- 运行 daemonset,它将按设计为每个节点创建 pod。
- 这些 pods 将安装类型为 hostPath (/var/run/docker.sock) 的卷。
这些pods有docker个客户和运行以下"command "
docker login docker.pkg.github.com -u username -p passWord
现在你在容器里面登录了,但是并没有反映到Node.然后,您需要安装另一个 hostPath 卷 (~/.docker/config.json)。但挑战在于了解 Fargate 节点的主目录是什么。在下面的示例中,我输入了
/root
(卷),但它可以是其他内容。例如/home/ec2-user
... 要检查的内容。这是它的样子
apiVersion: apps/v1 kind: Daemonset metadata: name: docker-init spec: replicas: 1 template: metadata: name: worker labels: app: worker spec: initContainers: - name: login-private-registies image: docker command: ['sh', '-c', 'docker login docker.pkg.github.com -u username -p passWord'] volumeMounts: - name: dockersock mountPath: "/var/run/docker.sock" - name: dockerconfig mountPath: "/root/.docker" volumes: - name: dockersock hostPath: path: /var/run/docker.sock - name: dockerconfig hostPath: path: /root/.docker
我认为您需要在与部署相同的名称空间中创建您的机密。我能够通过创建一个秘密来完成这项工作
kubectl create secret docker-registry mySecret --dry-run=true --docker-server=https://docker.pkg.github.com --docker-username=myGithubUsername --docker-password=myGithubAccessToken --namespace=my-api -o yaml
在我的 deployment.yaml 中,我引用了它
spec:
containers:
- name: my-api
image: docker.pkg.github.com/doc-api:0.0.0
ports:
- containerPort: 5000
resources: {}
imagePullSecrets:
- name: mySecret
在深入挖掘并与一些 AWS 技术人员交流之后:
问题似乎是 EKS Fargate 在后台使用了 Containerd。
Containerd 和 Docker 尝试以不同的方式拉取图像。 Containerd 目前正在跟踪多个注册表提供商的多个问题,这些提供商仅正确支持 Docker 而不是 OCI HTTP API V2,github being one of them.
作为 mentioned 产品总监 Github,该问题将在几周到几个月内得到解决。