如何在Kubernetes中从DockerHub拉取镜像?

46

我计划在我的Kubernetes集群基础设施中部署一个应用程序。 我将镜像推送到DockerHub仓库。如何从DockerHub拉取镜像?


1
文档 很好地解释了如何将 Dockerhub 凭据添加到您的集群中。如果您的镜像在 Dockerhub 上是公开可访问的,则不需要凭据,只需在 Pod 定义中指定镜像即可。 - fishi0x01
谢谢@fishi - 我正在使用公共存储库。所以你的意思是我需要在yaml文件中设置公共存储库名称,然后它就可以为我工作了? - Snipper03
@fish出现了ImagePullBackOff错误。看起来是TLS握手超时 - 它无法找到dockerhub服务器,并且无法访问repo。 如果我使用公共repo,如何提供服务器FQDN? - Snipper03
1
k8s在底层使用Docker——就像您在本地计算机上一样。现在,镜像名称由[RepoHost]/[ProjectID]/[RrepoName]:[Tag]组成。如果省略[RepoHost],则Docker会将dockerhub(docker.io)作为默认值。关于TLS握手t/o,我不确定在您的情况下是什么原因导致了这个问题。 - fishi0x01
1
如果您想要有用的帮助,将您的k8s清单贴在这里会更好。此外,在出现“ImagePullBackOff”错误的Pod上运行kubectl -n <namespace> describe po <pod>命令输出可能会有所帮助。 - Konstantin Vustin
显示剩余2条评论
4个回答

34

创建Docker注册表secret的一行命令

kubectl create secret docker-registry regcred --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email> -n <your-namespace>

然后您可以在 spec 下使用它在部署文件中。

spec:
  containers:
  - name: private-reg-container-name
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred

更多详细信息: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-secret-in-the-cluster-that-holds-your-authorization-token


4
命名空间提到得很好,文档对此的说明过于简略。 - DevOops
有没有可能让kubectl在节点内运行Docker?这样我就可以手动尝试镜像拉取(我似乎无法通过SSH登录到我的节点)。 - ekkis
请将<your-private-image>替换为特定的Docker Hub路径,因为OP特别询问了Docker Hub。 - Karthick

25

Kubernetes在幕后运行docker pull pseudo/your-image:latest。Kubernetes资源中的image字段只是要运行的docker镜像。

spec:
  containers:
  - name: app
    image: pseudo/your-image:latest
[...]

由于Docker镜像名称中不包含特定的Docker注册表网址,因此默认为docker.io。实际上,您的镜像是docker.io/pseudo/your-image:latest

如果您的镜像托管在私有Docker hub仓库中,则需要在spec字段中指定镜像拉取密钥。

spec:
  containers:
  - name: app
    image: pseudo/your-image:latest
  imagePullSecrets:
  - name: dockerhub-credential

这里是创建包含您的Docker Hub登录信息的密钥的文档:https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/


我可以执行 kubectl run my-new-pod --image=<一个 DockerHub 镜像名称> 命令来构建 Pod。那么有没有类似于 docker pull 的命令呢? - ekkis

1
使用 docker pullkubectl set image 示例 YAML 部署
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

启动容器并使用 kubectl get deployments 命令显示部署状态。

结果

 NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           18s

现在使用set image在Kubernetes中更新图像

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1

并使用 rollout 显示状态更新图像

kubectl rollout status deployment/nginx-deployment

注意:ngnix是容器的名称->name
  containers:
      - name: nginx
        image: nginx:1.14.2

nginx:1.16.1 是 Docker Hub 中的镜像版本,建议更改版本以进行更新。

如果您决定删除更新并回滚到先前的版本,请使用 rollout undo 命令。

kubectl rollout undo deployment/nginx-deployment

欲了解更多信息,请使用文档


0
  1. 创建一个Docker注册表密钥:
#!/bin/bash

for ns in $(kubectl get namespaces |grep -v NAME|awk '{print $1}')
do
   kubectl create secret docker-registry docker.registry \
       --docker-username=<MyAccountName> \
       --docker-password='MyDockerHubPassword' -n $ns
done
  1. 使用步骤1中创建的密钥,修补所有命名空间中的动态服务账户。
for ns in $(kubectl get namespaces|grep -v NAME|awk '{print $1}')
do
        for sa in $(kubectl -n $ns get sa|grep -v SECRETS|awk '{print $1}')
        do
           kubectl patch serviceaccount $sa -p '{"imagePullSecrets": [{"name": "docker.registry"}]}' -n $ns
           if [ $? -eq 0 ]; then
                echo $ns $sa patched
           else
                echo Error patching $ns $sa
           fi
        done
done

如果您希望,可以仅修补特定的命名空间。

让我知道进展如何。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接