docker - 无法将私有(private)包/图像从 GitHub 容器注册表拉入 Okteto Kubernetes

标签 docker kubernetes minikube ghcr okteto

希望能征求您的意见。

问题简而言之:我的管道无法将私有(private)图像从 GHCR.IO 拉入 Okteto Kubernetes,但来自同一个私有(private)存储库的公共(public)图像可以工作。

我在 Windows 10 上使用 WSL2-Ubuntu 20.04 LTS 和 kinD 进行开发,也尝试过 minikube。

我在 Okteto 中收到一个错误,提示图像拉取是“未经授权”->“imagePullBackOff”。

我做过的事情:浏览 Stack Overflow、RTFM、Okteto 常见问题解答、下载 Okteto kubeconfig、急于求成并花费了比我愿意承认的更多的时间——仍然没有成功。

无论出于何种原因,我都无法创建有效的“kubectl secret”。当通过“docker login --username”登录到 ghcr.io 时,我可以在本地拉取私有(private)图像。

无论我尝试过什么,在 Okteto 中尝试拉取私有(private)镜像时,我仍然会收到“未经授权”的错误。

带有最新更新的我的设置:

  • Windows 10 专业版
  • JetBrains Rider IDE
  • WSL2-Ubuntu 20.04 LTS
  • ASP.NET Core MVC 应用
  • .NET 6 SDK
  • docker
  • 亲切
  • 迷你库
  • 巧克力
  • 自制

设置类型

kind create cluster --name my-name

kubectl create my-namespace

// create a secret to pull images from ghcr.io       
kubectl create secret docker-registry my-secret -n my-namespace --docker-username="my-username" --docker-password="my-password" --docker-email="my-email" --docker-server="https://ghcr.io"

// patch local service account
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "my-secret"}]}'

kubernetes.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: okteto-repo
  namespace: my-namespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: okteto-repo
  template:
    metadata:
      labels:
        app: okteto-repo
    spec:
      containers:
        - name: okteto-repo
          image: ghcr.io/user/okteto-repo:latest
          ports:
            - containerPort: 80
      imagePullSecrets:
        - name: my-secret
---
apiVersion: v1
kind: Service
metadata:
  name: okteto-repo
  annotations:
    dev.okteto.com/auto-ingress: "true"
spec:
  type: ClusterIP
  selector:
    app: okteto-repo
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80

您知道它为什么不起作用以及我可以做什么吗?

非常感谢我亲爱的 friend 们,非常感谢每一个输入!

希望你们假期愉快。

干杯, 迈克尔

最佳答案

我可以通过执行以下操作来拉取私有(private)图像:

  1. 在 GitHub 中创建具有 repo 访问权限的个人 token 。
  2. 构建镜像并将其推送到 GitHub 的容器注册表(我使用了 okteto build -t ghcr.io/rberrelleza/go-getting-started:0.0.1)
  3. 下载我的 kubeconfig credentials通过运行 okteto context update-kubeconfig 从 Okteto Cloud 获取。
  4. 使用我的凭据创建一个 secret :kubectl create secret docker-registry gh-regcred --docker-server=ghcr.io --docker-username=rberrelleza --docker-password=ghp_XXXXXX
  5. 修补默认帐户以将 secret 作为镜像拉取 secret 包含在内:kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "gh-regcred"}]}'
  6. 更新了 kubernetes list 中的图像名称
  7. 创建部署(kubectl apply -f k8s.yaml)

这些是我的 kubernetes 资源的样子,以防有帮助:

# k8s.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - image: ghcr.io/rberrelleza/go-getting-started:0.0.1
        name: hello-world

---

apiVersion: v1
kind: Service
metadata:
  name: hello-world
  annotations:
    dev.okteto.com/auto-ingress: "true"
spec:
  type: ClusterIP  
  ports:
  - name: "hello-world"
    port: 8080
  selector:
    app: hello-world
# default SA
apiVersion: v1
imagePullSecrets:
- name: gh-regcred
- name: okteto-regcred
kind: ServiceAccount
metadata:
  creationTimestamp: "2021-05-21T22:26:38Z"
  name: default
  namespace: rberrelleza
  resourceVersion: "405042662"
  uid: 2b6a6eef-2ce7-40d3-841a-c0a5497279f7
secrets:
- name: default-token-7tm42

关于docker - 无法将私有(private)包/图像从 GitHub 容器注册表拉入 Okteto Kubernetes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70427486/

相关文章:

kubernetes - `kubectl top nodes` 在从节点上不起作用

wordpress - 是否可以为外部 WordPress 网站设置 google CDN?

docker - 如何删除正在运行的Docker镜像中的文件,然后保存该镜像以供以后加载?

postgresql - docker 对港口的困惑

linux - 在 ubuntu live disk 中运行 docker

kubernetes - 在Kafka中,随着分区之间的整体滞后时间减少,您是否应该减少一组消费者的数量?

docker - skaffold 不会在 minikube 中重新加载 golang 代码

kubernetes - Minikube:尝试创建特权容器时,Restricted PodSecurityPolicy 不受限制

Minikube - 重启后文件消失

mysql - 从主机访问 Docker MySQL 服务器,无需容器的 IP 地址