zoukankan      html  css  js  c++  java
  • Kubernetes从私有镜像仓库中拉取镜像

    当我们尝试从私有仓库中拉取镜像时,可能会收到这样提示:requested access to the resource is denied

    Error response from daemon: pull access denied for xxx repository does not exist or may require 'docker login': denied: requested access to the resource is denied 

    这是由于访问私有仓库时是需要凭证的。接下来,一起看下如何用Secret创建一个Pod来从一个私有的Docker Registry 或  Repository 中 Pull 镜像。

    1. 登录Docker

    为了拉取一个私有镜像,首先,需要进行身份认证

    docker login 

    这个登录过程会创建或更新一个config.json文件来维护一个授权token

    cat ~/.docker/config.json 

    输出可能是这样的:

    {
        "auths": {
            "https://index.docker.io/v1/": {
                "auth": "c3R...zE2"
            }
        }
    }
    

    如果你使用的是Docker凭证(凭据)存储,那么将不会看到那个认证条目,而是看到一个以该存储的名称作为值的credsStore条目。

    例如:

    2. 基于已经存在的Docker凭据创建一个Secret

    Kubernetes集群使用docker-registry类型的Secret来进行一个容器registry的认证,以获取一个私有镜像。 

    如果你已经执行了docker login,那么你可以把这个凭证复制到Kubernetes

     kubectl create secret generic regcred 
         --from-file=.dockerconfigjson=<path/to/.docker/config.json> 
         --type=kubernetes.io/dockerconfigjson
    

    3. 通过在命令行中提供凭据来创建一个Secret

    创建一个Secret,并将其命名为myregcred

    kubectl create secret docker-registry myregcred 
         --docker-server=<your-registry-server> 
         --docker-username=<your-name> 
         --docker-password=<your-password> 
         --docker-email=<your-email> 

    在这里:

    • <your-registry-server> is your Private Docker Registry FQDN. (https://index.docker.io/v1/ for DockerHub)
    • <your-name> is your Docker username.
    • <your-pword> is your Docker password.
    • <your-email> is your Docker email.

    不出意外的话,你已经成功的再集群中设置了你的Docker凭据作为一个Secret,名字叫myregcred

    4. 查看Secret

    kubectl get secret myregcred --output=yaml
    

    .dockerconfigjson 字段的值是一个经过base64编码后的你的Docker凭据

    为了更好地理解.dockerconfigjson 字段,我们将它格式化一下:

    kubectl get secret myregcred --output="jsonpath={.data..dockerconfigjson}" | base64 --decode 

    输出可能是这样的:

    {"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"Y2hlb...29tOmt"}}} 

    为了更好地理解上面输出的auth字段,我们可以这样:

    echo "Y2hlb...29tOmt" | base64 --decode 

    输出的字符串格式为 username:password,例如:

    janedoe:1234

    不难看出,Secret数据中包含的授权token字符串与~/.docker/config.json文件中的相似 

    5. 用你的Secret创建一个Pod

    下面是一个Pod的配置文件private-reg-pod.yaml ,这个Pod将要使用你的Docker凭据myregcred

     apiVersion: v1
     kind: Pod
     metadata:
       name: private-reg
     spec:
       containers:
       - name: private-reg-container
         image: <your-private-image>
       imagePullSecrets:
       - name: myregcred
    

    将文件my-private-reg-pod.yaml中的<your-private-image>替换成你自己的私有registry,例如:

     your.private.registry.example.com/janedoe/jdoe-private:v1

    为了从registry中拉取镜像,Kubernetes需要凭证。配置文件中的imagePullSecrets字段指明Kubernetes应该从名为myregcred的Secret中获取凭证。 

    用你的Secret创建一个Pod,并验证它

    kubectl apply -f my-private-reg-pod.yaml
    kubectl get pod private-reg
    

    6. 文档

    https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry

    https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ 

  • 相关阅读:
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xef in position 99: invalid continuation byte
    Java的内存机制
    sort
    ajax()函数传值中文乱码解决方法介绍
    三种实现Ajax的方式
    找到div下的第一个ul
    POI 单元格
    js对字符串进行编码方法总结
    相对路径和绝对路径的区别,java获取项目访问路径的方法
    sql存储过程几个简单例子
  • 原文地址:https://www.cnblogs.com/cjsblog/p/12115299.html
Copyright © 2011-2022 走看看