Pulumi - как вытащить docker образ из частного реестра? - PullRequest
2 голосов
/ 23 января 2020

Я объявил о развертывании в Kubernetes, в котором есть два контейнера. Один построен локально, другой нужно извлечь из частного реестра.

const appImage = new docker.Image("ledgerImage", {
    imageName: 'us.gcr.io/qwil-build/ledger',
    build: "../../",
});

const ledgerDeployment = new k8s.extensions.v1beta1.Deployment("ledger", {
  spec: {
    template: {
      metadata: {
        labels: {name: "ledger"},
        name: "ledger",
      },
      spec: {
        containers: [
          {
            name: "api",
            image: appImage.imageName,
          },
          {
            name: "ssl-proxy",
            image: "us.gcr.io/qwil-build/monolith-ssl-proxy:latest",
          }
        ],

      }
    }
  }
});

Когда я запускаю pulumi up, он зависает - это происходит из-за жалобы, что You don't have the needed permissions to perform this operation, and you may have invalid credentials. Я вижу эту жалобу, когда я бегу kubectl describe <name of pod>. Тем не менее, когда я запускаю docker pull us.gcr.io/qwil-build/monolith-ssl-proxy:latest, он работает просто отлично. Я перезапустил gcloud auth configure-docker, и это не помогло.

Я нашел https://github.com/pulumi/pulumi-cloud/issues/112, но, похоже, для docker.Image требуется аргумент build, который подсказывает мне, что он предназначен для локальных, а не удаленных изображений.

Как я могу извлечь изображение из частного реестра?

РЕДАКТИРОВАТЬ:

Оказывается, у меня есть локальный dockerfile для создания SSL-прокси, который мне нужен. Я объявил новый Image с

const sslImage = new docker.Image("sslImage", {
  imageName: 'us.gcr.io/qwil-build/ledger-ssl-proxy',
  build: {
    context: "../../",
    dockerfile: "../../Dockerfile.proxy"
  }
});

и правильно обновил ссылку на изображение в Deployment. Тем не менее, у меня все еще возникают проблемы с аутентификацией.

Ответы [ 4 ]

1 голос
/ 24 января 2020

Оказывается, работает pulumi destroy --yes && pulumi up --skip-preview --yes это то, что мне нужно. Я думаю, что я был в каком-то странном противоречивом состоянии, но это сейчас исправлено.

0 голосов
/ 06 мая 2020

У меня есть решение, использующее только код, который я использую для извлечения изображений из частного репозитория на Gitlab:

config.ts

import { Config } from "@pulumi/pulumi";

//
// Gitlab specific config.
//

const gitlabConfig = new Config("gitlab");

export const gitlab = {
    registry: "registry.gitlab.com",
    user: gitlabConfig.require("user"),
    email: gitlabConfig.require("email"),
    password: gitlabConfig.requireSecret("password"),
}

import * as config from "./config";
import { Base64 } from 'js-base64';
import * as kubernetes from "@pulumi/kubernetes";

[...]
const provider = new kubernetes.Provider("do-k8s", { kubeconfig })

const imagePullSecret = new kubernetes.core.v1.Secret(
  "gitlab-registry",
  {
    type: "kubernetes.io/dockerconfigjson",
    stringData: {
      ".dockerconfigjson": pulumi
        .all([config.gitlab.registry, config.gitlab.user, config.gitlab.password, config.gitlab.email])
        .apply(([server, username, password, email]) => {
          return JSON.stringify({
            auths: {
              [server]: {
                auth: Base64.encode(username + ":" + password),
                username: username,
                email: email,
                password: password
              }
            }
          })
        })
    }
  },
  {
    provider: provider
  }
);

// Then use the imagePullSecret in your deployment like this
deployment = new k8s.apps.v1.Deployment(name, {
            spec: {
                selector: { matchLabels: labels },
                template: {
                    metadata: { labels: labels },
                    spec: {
                        imagePullSecrets: [{ name: args.imagePullSecret.metadata.apply(m => m.name) }],
                        containers: [container]
                    },
                },
            },
        });

0 голосов
/ 24 января 2020

Вам необходимо предоставить кластеру учетные данные для вашего реестра Docker, чтобы он мог извлекать из него образы.

Процесс вручную будет выглядеть так:

docker login registry.gitlab.com 
cat ~/.docker/config.json | base64

Затем создайте Registry_secret.yaml с выводом сверху

apiVersion: v1
kind: Secret
metadata:
  name: regsec
data:
  .dockerconfigjson: ewJImF1dGhzIjogewoJCSJyZWdpc3RyeS5naXfRsYWsi7fQoJfSwKCSJIdHRwSGVhZGVycyI6IHsKCQkdiVXNlci1BZ2VudCI6ICJEb2NrZXItQ2xpZW50LzEaLjxzLxjUgKH9yIjogInN3YXJtIgp9
type: kubernetes.io/dockerconfigjson

и затем примените его к вашему кластеру с помощью

kubectl apply -f registry_secret.yaml && kubectl get secrets

. Вы можете заключить это в Pulumi, как он поддерживает файлы yaml, такие как

new k8s.yaml.ConfigGroup("docker-secret", {files: "registry_secret.yaml"});

Это работает, только если ваши учетные данные закодированы в .docker / config. json, и не должно работать, если вы используете хранилище учетных данных

Альтернативой может быть создание секрета напрямую путем предоставления учетных данных пользователя и извлечения токена

kubectl create secret docker-registry regsec \
--docker-server=registry.gitlab.com --docker-username=... \
--docker-email=... --docker-password=... \
--dry-run -o yaml | grep .dockerconfigjson: | sed -e 's/.dockerconfigjson://' | sed -e 's/^[ \t]*//'

Теперь этот токен можно сохранить как секрет pulumi с помощью

pulumi config set docker_token --secret <your_token>

и использовать вот так

import {Secret} from "@pulumi/kubernetes/core/v1";
import {Config} from "@pulumi/pulumi";

/**
 * Creates a docker registry secret to pull images from private registries
 */
export class DockerRegistry {

    constructor(provider: any) {

        const config = new Config();

        const dockerToken = config.require("docker_token");

        new Secret("docker-registry-secret", {
            metadata: {
                name: "docker-registry-secret"
            },
            data: {
                ".dockerconfigjson": dockerToken
            },
            type: "kubernetes.io/dockerconfigjson"
        }, {provider});
    }

}
0 голосов
/ 23 января 2020

D'Oh! Похоже, RemoteImage ответ: https://www.pulumi.com/docs/reference/pkg/nodejs/pulumi/docker/#RemoteImage

РЕДАКТИРОВАТЬ:

Я пытался

const sslImage = new docker.RemoteImage("sslImage", {
  name: 'us.gcr.io/qwil-build/monolith-ssl-proxy:latest',
})

И я все еще получаю аутентификацию ошибки, так что это не ответ, я думаю.

...