Kubernetes客户端C#:无法提取图像:rpc错误:代码=未知描述=来自守护程序的错误响应:拒绝提取访问

nqwrtyyt  于 2022-12-03  发布在  Kubernetes
关注(0)|答案(3)|浏览(144)

我尝试使用C#(https://github.com/kubernetes-client/csharp)中的Kubernetes客户端动态构建Kubernetes作业。当作业尝试从存储库中提取图像时,我收到错误。
我试图附加到作业的映像位于本地Docker存储库中。这工作得很好,但是在构建过程中,会在透镜中抛出一个错误(见图)。

建立工作的代码:

var job = new V1Job
        {
            ApiVersion = "batch/v1",
            Kind = "Job",
            Metadata = new V1ObjectMeta
            {
                Name = name,
                Labels = new Dictionary<string, string>(),
            },
            Spec = new V1JobSpec
            {
                BackoffLimit = backoffLimit,
                TtlSecondsAfterFinished = 0,
                Template = new V1PodTemplateSpec
                {
                    Spec = new V1PodSpec
                    {
                        Tolerations = new List<V1Toleration>(),
                        Volumes = new List<V1Volume>
                        {
                            new V1Volume
                            {
                                Name = "podinfo",
                                DownwardAPI = new V1DownwardAPIVolumeSource
                                { 
                                    Items = new V1DownwardAPIVolumeFile[]
                                    {
                                        new V1DownwardAPIVolumeFile { Path = "namespace", FieldRef = new V1ObjectFieldSelector("metadata.namespace") },
                                        new V1DownwardAPIVolumeFile { Path = "name", FieldRef = new V1ObjectFieldSelector("metadata.name") },
                                    },
                                },
                            },
                        },
                        Containers = new[]
                        {
                            new V1Container
                            {
                                Name = "tapereader-job-x-1",
                                Image = "tapereader_sample_calculation",
                                Resources = new V1ResourceRequirements
                                {
                                    Limits = new Dictionary<string, ResourceQuantity>
                                    {
                                        { "cpu", new ResourceQuantity("4") },
                                        { "memory", new ResourceQuantity("4G") },
                                    },
                                    Requests = new Dictionary<string, ResourceQuantity>
                                    {
                                        { "cpu", new ResourceQuantity("0.5") },
                                        { "memory", new ResourceQuantity("2G") },
                                    },
                                },
                                VolumeMounts = new List<V1VolumeMount>
                                {
                                    new V1VolumeMount { Name = "podinfo", MountPath = "/etc/podinfo", ReadOnlyProperty = true },
                                },
                                Env = new List<V1EnvVar>(),
                            },
                        },
                        RestartPolicy = "Never",
                    },
                },
            },
        };

        await Client.CreateNamespacedJobAsync(job, "local-tapereader");

容器是好的,它存在于Docker桌面(本地repo)中,我可以构建和运行它,没有任何问题-它也以它应该在Docker桌面中的方式执行。

k8s客户端成功创建pod & job,但我在透镜中收到以下错误:

所以基本上,它声明访问被拒绝了?我如何克服这个问题?
我已尝试添加凭据,但此操作无效


最新消息:
我实际上运行了以下代码,就像zero 0建议的那样:
创建密码一般注册--从文件=.dockerconfigjson=C:\用户\〈用户名〉.docker\配置.json --类型= kubernetes.io/dockerconfigjson

2eafrhcq

2eafrhcq1#

您是否为config.json指定了正确的路径?如果您运行了所提供的命令,则该命令无效。您必须为此确定正确的路径。
1.在Windows上,这将是C:\Users\<USER_NAME>\.docker\config.json
1.在Mac上,该值为/Users/<USER_NAME>/.docker/config.json
1.在Linux上,该值为/home/<USER_NAME>/.docker/config.json
然后您将执行:

kubectl create secret generic regcred --from-file=.dockerconfigjson=<PATH_HERE> --type=kubernetes.io/dockerconfigjson
bjg7j2ky

bjg7j2ky2#

已找到解决方案。映像驻留在Docker Desktop的本地存储库中。因此,不必提取映像。若要避免提取映像,Container对象的参数ImagePullPolicy应等于**“Never”**。

new V1Container
{
 ImagePullPolicy = "Never",
 Name = name,
 Image = image,
 ...
}
ar7v8xwq

ar7v8xwq3#

这里最好的解决方案是复制用户名和密码并将它们编码为base64到.dockerconfigjson中,然后复制整个.dockerconfigjson文件并将其转换为base64,然后复制编码文本并粘贴到YAML中并应用。

相关问题