我可以在 CI 中使用 kubectl 将本地 (CI) docker 映像推送到集群吗?

Can I push a local (CI) docker image to cluster using kubectl in CI?

我正在使用 CI 并构建了一个 Docker 图像。我想将 CI 中构建的图像传递给 kubectl 以将其放置在我的 kubeconfig 指定的集群中。这与让集群连接到像 dockerhub 这样的注册表来检索图像相反。这可能吗?

到目前为止我无法让它工作,我想我将被迫在我的集群上创建一个秘密来只使用我的私人 docker 回购。我想用尽我的选择,不必使用任何注册表。另外,作为替代方案,我已经在我的 CI 上登录 docker,理想情况下只需要使用这些凭据一次。

我认为在我的部署中设置 ImagePullPolicy 可能会成功,但我认为它指的是集群上下文。这让我想知道是否有其他方法可以使用 kubectl create image 之类的东西将图像添加到我的集群。

也许我只是做了一些明显的错误?

这是我 CI

上的部署脚本
docker build -t <DOCKERID>/<PROJECT>:latest -t <DOCKERID>/<PROJECT>:$GIT_SHA -f ./<DIR>/Dockerfile ./<DIR>
docker push <DOCKERID>/<PROJECT>:latest
docker push <DOCKERID>/<PROJECT>:$GIT_SHA

kubectl --kubeconfig=$HOME/.kube/config apply -f k8s
kubectl --kubeconfig=$HOME/.kube/config set image deployment/<DEPLOYMENT NAME> <CONTAINER NAME>=<DOCKERID>/<PROJECT>:$SHA

还有这个 Docker 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <deployment name>
spec:
  replicas: 3
  selector:
    matchLabels:
      component: <CONTAINER NAME>
  template:
    metadata:
      labels:
        component: <CONTAINER NAME>
    spec:
      containers:
        - name: <CONTAINER NAME>
          image: <DOCKERID>/<PROJECT>
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: <PORT>

I want to pass the image [...] to kubectl to take and place it in the cluster [...] as opposed to having the cluster reach out to a registry like dockerhub to retrieve the image. Is this possible?

没有。通常,图像进入集群的唯一方式是通过节点拉取在 pod 规范中命名的图像。甚至“在集群中”也有点模糊;每个节点都有不同的图像集合,基于这些图像 pods 曾经 运行 那里以及历史上被清理过的内容。

面向开发人员的单节点环境存在有限的例外情况(您可以直接在 minikube VM 中 docker build 图像,然后使用 imagePullPolicy: Never 将 pod 设置为 运行 ) 但这不适用于典型的 CI 系统。

I would like to exhaust my options to not have to use any registry.

Kubernetes 本质上需要一个注册表。如果您使用的是来自 public-云提供商 (EKS/GKE/AKS/...) 的托管 Kubernetes,则可能有一个匹配的映像注册表提供您可以使用 (ECR/GCR/ACR/.. .).

k8s 设置中的首选方法是使用需要部署的图像及其 sha256 摘要更新 k8s 定义或 helm 图表值或 kustomize 值(无论您使用哪个)。

在生产中使用 sha256 摘要优于标签,因为 docker 图片标签是可变的。

接下来,与其使用 CI/CD 中的 kubectl,不如使用 GitOps 工具——k8s 端的 Argo 或 Flux 可以根据 [=21] 中的定义提取正确的图像=].

您需要某种系统来路由和管理图像 - 哪个应该去哪个环境。这是我的文章,其中包含如何实现的示例(这篇文章使用的是我的工具):https://itnext.io/building-kubernetes-cicd-pipeline-with-github-actions-argocd-and-reliza-hub-e7120b9be870