使用 Okta SSO 时无法从 docker 为 AWS ECR 创建本地 kubernetes 机密
Can't create local kubernetes secret from docker for AWS ECR when using Okta SSO
我使用 Docker 桌面 运行 连接本地 Kubernetes 集群在 Windows 上做了一个非常简单的 Kubernetes 演练,并在几分钟内成功。
我现在正在尝试做同样的事情,除了使用我自己来自 AWS ECR 的图像。我无法获得 Kubernetes 授权来访问我的私人仓库。
我创建了一个 AWS ECR 存储库。我使用 Okta SSO,安装了 AWS CLI,并且可以正常执行命令。我将我的图像推送到我的私有存储库并可以在 CLI 上查看它。我已经验证 docker 可以获取我的私人图像和 运行 容器:> docker run MY_ECR_ADDRESS.dkr.ecr.MY_REGION.amazonaws.com/MY_REPO_NAME:latest
然后我尝试使用 kubernetes documentation 授权 Kubernetes 访问我的私人仓库,但这是我遇到问题的地方。
在使用和不使用 > docker login
步骤进行尝试之后,我
> aws ecr get-login-password --region MY_REGION | docker login --username AWS --password-stdin MY_ECR_ADDRESS.dkr.ecr.MY_REGION.amazonaws.com
> Login Succeeded
> kubectl create secret generic regcred --from-file=.dockerconfigjson=<path/to/.docker/config.json> --type=kubernetes.io/dockerconfigjson
> secret/regcred created
我可以在 windows 和 wsl2 上查看 .docker/config.json
文件,但它没有 Kubernetes 文档所说的假设的 base64 编码授权。该页面说我应该看到这样的内容:
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "c3R...zE2"
}
}
}
但是我看到了这样的东西:
{
"auths": {
"MYECRADDRESS.dkr.ecr.MYREGION.amazonaws.com": {}
},
"credsStore": "desktop",
"stackOrchestrator": "swarm",
"currentContext": "default"
}
我已经想出我需要文件中的 base64 编码的 auth 字符串并且一切都取决于它,但我还是尝试部署:
> kubectl create deployment test --image=MY_ECR_ADDRESS.dkr.ecr.MY_CORRECT_REGION.amazonaws.com/MY_REPO_NAME:latest
> kubectl get deploy
> NAME READY UP-TO-DATE AVAILABLE AGE
> test 0/1 1 0 2m10s
> > kubectl get pods -l app=test
NAME READY STATUS RESTARTS AGE
test-b4d8dccfc-9ttzb 0/1 ImagePullBackOff 0 2m41s
正如预期的那样,您会看到我得到了 ImagePullBackOff,这意味着我的本地集群无法访问我的私有存储库。
有人可以帮我从 docker creds store 获取授权字符串并授权 Kubernetes 从我的私人仓库中提取吗?
but it does not have the assumed base64 encoded auth the kubernetes documentation says should be there
Docker 使用自己的凭据存储的桌面:"credsStore": "desktop"
。所以这里没有 "auth"
key:
Note: If you use a Docker credentials store, you won't see that auth entry but a credsStore entry with the name of the store as value.
无论如何,您可以尝试使用 second way 直接创建凭据而不生成 .docker/config.json
:
kubectl create secret docker-registry regcred --docker-server=MY_ECR_ADDRESS.dkr.ecr.MY_REGION.amazonaws.com --docker-username=AWS --docker-password="$(aws ecr get-login-password --region MY_REGION)"
另外别忘了设置imagePullSecrets
parameter inside deployment description file. In other way you may send secret name parameter directly by .
解决问题的第三种方法是手动生成auth
块。
根据 this and this 文章 auth
只是 username:password
base64 编码行。您可以使用 THE_AUTH="$(echo 'AWS:'$(aws ecr get-login-password --region aws_region) | base64)"; echo $THE_AUTH
生成它
对此的快速解释是:
- 您无需从 docker 获取访问权限,您可以从 aws cli
获取
- AFAIK,你不能在 kubectl cli 上使用部署,你必须使用图表来指定添加的秘密
想要解决方案的人的详细信息:
通过根据需要命名凭据并使用 get-login-password 确保您在 kubernetes 中拥有身份验证:
> kubectl create secret docker-registry myAwsCred --docker-server=MY_ECR_ADDRESS.dkr.ecr.MY_REGION.amazonaws.com --docker-username=AWS --docker-password=$(aws ecr get-login-password --region MY_REGION)
为部署创建一个图表,指定您为机密命名的任何内容:
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: app
image: MY_ECR_ADDRESS.dkr.ecr.MY_REGION.amazonaws.com/MY_REPO:latest
ports:
- containerPort: 80
imagePullSecrets:
- name: myAwsCred
然后,根据您的图表创建一个使用正确命名的秘密的部署:
> kubectl apply -f c:\mylocaltestdeploy.yaml
我使用 Docker 桌面 运行 连接本地 Kubernetes 集群在 Windows 上做了一个非常简单的 Kubernetes 演练,并在几分钟内成功。
我现在正在尝试做同样的事情,除了使用我自己来自 AWS ECR 的图像。我无法获得 Kubernetes 授权来访问我的私人仓库。
我创建了一个 AWS ECR 存储库。我使用 Okta SSO,安装了 AWS CLI,并且可以正常执行命令。我将我的图像推送到我的私有存储库并可以在 CLI 上查看它。我已经验证 docker 可以获取我的私人图像和 运行 容器:> docker run MY_ECR_ADDRESS.dkr.ecr.MY_REGION.amazonaws.com/MY_REPO_NAME:latest
然后我尝试使用 kubernetes documentation 授权 Kubernetes 访问我的私人仓库,但这是我遇到问题的地方。
在使用和不使用 > docker login
步骤进行尝试之后,我
> aws ecr get-login-password --region MY_REGION | docker login --username AWS --password-stdin MY_ECR_ADDRESS.dkr.ecr.MY_REGION.amazonaws.com
> Login Succeeded
> kubectl create secret generic regcred --from-file=.dockerconfigjson=<path/to/.docker/config.json> --type=kubernetes.io/dockerconfigjson
> secret/regcred created
我可以在 windows 和 wsl2 上查看 .docker/config.json
文件,但它没有 Kubernetes 文档所说的假设的 base64 编码授权。该页面说我应该看到这样的内容:
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "c3R...zE2"
}
}
}
但是我看到了这样的东西:
{
"auths": {
"MYECRADDRESS.dkr.ecr.MYREGION.amazonaws.com": {}
},
"credsStore": "desktop",
"stackOrchestrator": "swarm",
"currentContext": "default"
}
我已经想出我需要文件中的 base64 编码的 auth 字符串并且一切都取决于它,但我还是尝试部署:
> kubectl create deployment test --image=MY_ECR_ADDRESS.dkr.ecr.MY_CORRECT_REGION.amazonaws.com/MY_REPO_NAME:latest
> kubectl get deploy
> NAME READY UP-TO-DATE AVAILABLE AGE
> test 0/1 1 0 2m10s
> > kubectl get pods -l app=test
NAME READY STATUS RESTARTS AGE
test-b4d8dccfc-9ttzb 0/1 ImagePullBackOff 0 2m41s
正如预期的那样,您会看到我得到了 ImagePullBackOff,这意味着我的本地集群无法访问我的私有存储库。
有人可以帮我从 docker creds store 获取授权字符串并授权 Kubernetes 从我的私人仓库中提取吗?
but it does not have the assumed base64 encoded auth the kubernetes documentation says should be there
Docker 使用自己的凭据存储的桌面:"credsStore": "desktop"
。所以这里没有 "auth"
key:
Note: If you use a Docker credentials store, you won't see that auth entry but a credsStore entry with the name of the store as value.
无论如何,您可以尝试使用 second way 直接创建凭据而不生成 .docker/config.json
:
kubectl create secret docker-registry regcred --docker-server=MY_ECR_ADDRESS.dkr.ecr.MY_REGION.amazonaws.com --docker-username=AWS --docker-password="$(aws ecr get-login-password --region MY_REGION)"
另外别忘了设置imagePullSecrets
parameter inside deployment description file. In other way you may send secret name parameter directly by
解决问题的第三种方法是手动生成auth
块。
根据 this and this 文章 auth
只是 username:password
base64 编码行。您可以使用 THE_AUTH="$(echo 'AWS:'$(aws ecr get-login-password --region aws_region) | base64)"; echo $THE_AUTH
对此的快速解释是:
- 您无需从 docker 获取访问权限,您可以从 aws cli 获取
- AFAIK,你不能在 kubectl cli 上使用部署,你必须使用图表来指定添加的秘密
想要解决方案的人的详细信息:
通过根据需要命名凭据并使用 get-login-password 确保您在 kubernetes 中拥有身份验证:
> kubectl create secret docker-registry myAwsCred --docker-server=MY_ECR_ADDRESS.dkr.ecr.MY_REGION.amazonaws.com --docker-username=AWS --docker-password=$(aws ecr get-login-password --region MY_REGION)
为部署创建一个图表,指定您为机密命名的任何内容:
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: app
image: MY_ECR_ADDRESS.dkr.ecr.MY_REGION.amazonaws.com/MY_REPO:latest
ports:
- containerPort: 80
imagePullSecrets:
- name: myAwsCred
然后,根据您的图表创建一个使用正确命名的秘密的部署:
> kubectl apply -f c:\mylocaltestdeploy.yaml