Можно ли запустить самозаверяющий реестр Docker в Кубернетесе, и чтобы другие службы использовали его в качестве реестра для получения своего образа? - PullRequest
1 голос
/ 17 апреля 2019

Постановка проблемы

  • Я хочу предоставить личный реестр, в который включены все изображения, необходимые для моего продукта (да, это будет жирное изображение, но я в порядке)
  • Я бы вручную каким-то образом загрузил это изображение
  • Я бы запустил личный реестр докеров в качестве службы в Kubernetes (вероятно, в некотором пространстве имен)
  • Когда другие службы / развертывания (в том же пространстве имен, что и реестр) в Kubernetes, они должны ссылаться на этот реестр, используя непротиворечивое имя

Ограничения

  • Мы хотим, чтобы реестр был открыт только для кластераа не снаружи
  • Мы хотим использовать самозаверяющий сертификат, не подписанный CA

Я следовал некоторым инструкциям из этих ссылок (не знаю, было ли это правильно делать)

Создать сертификат, подписанный через Kubernetes

  1. Создатьserver.key

  2. Создать csr.info

[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = US
ST = oh
L = cincinnati
O = engg
OU = prod
CN = prateek.svc.cluster.local

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = registry.prateek.svc.cluster.local

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names

Создание server.csr (openssl req -new -key server.key -out server.csr -config csr.conf)

Создание запроса CertificateSigningRequest в K8s

cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: registry.prateek
spec:
groups:
- system:authenticated
request: $(cat server.csr | base64 | tr -d '\n')
usages:
- digital signature
- key encipherment
- server auth
EOF
Проверяется, существует ли CSR
kubectl describe csr registry.prateek
Name: registry.prateek
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"certificates.k8s.io/v1beta1","kind":"CertificateSigningRequest","metadata":{"annotations":{},"name":"registry.prateek","namespace":""},"spec":{"groups":["system:authenticated"],"request":"LS0sdfsfsdsfd=","usages":["digital signature","key encipherment","server auth"]}}

CreationTimestamp: Thu, 11 Apr 2019 11:15:42 -0400
Requesting User: docker-for-desktop
Status: Pending
Subject:
Common Name: prateek.svc.cluster.local
Serial Number:
Organization: engg
Organizational Unit: prod
Country: US
Locality: cincinnati
Province: oh
Subject Alternative Names:
DNS Names: registry.prateek.svc.cluster.local
Events: <none>
Одобрен CSR: сертификат kubectl утвердить registry.prateek

Запустить внутреннюю службу реестра

Добавлен сертификат и ключ к виду: Secret registry-secret.yml
apiVersion: v1
kind: Secret
metadata:
  name: registry-credentials
data:
  certificate: <CERTIFICATE in base64>
  key: <KEY in base64>
Создание развертывания реестра и службы (с использованием этих секретов) registry-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: registry
  namespace: prateek
  labels:
      app: registry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: registry
  template:
    metadata:
      labels:
        app: registry
    spec:
      containers:
        - name: registry
          image: prateek/registry
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 443
          env:
            - name: REGISTRY_HTTP_ADDR
              value: "0.0.0.0:443"
            - name: REGISTRY_HTTP_TLS_CERTIFICATE
              value: "/certs/certificate"
            - name: REGISTRY_HTTP_TLS_KEY
              value: "/certs/key"
          volumeMounts:
            - name: cert-files
              mountPath: /certs
      volumes:
        - name: cert-files
          secret:
            secretName: registry-credentials

registry-service.yml

apiVersion: v1
kind: Service
metadata:
  name: registry
  namespace: prateek
spec:
  selector:
    app: registry
  ports:
  - protocol: TCP
    port: 443
    targetPort: 443
  type: LoadBalancer

Проверка службы реестра запущена

Попробовал к этому конечную точку реестра через тестовый модуль.Я загрузил изображение этого тестового модуля в докер.
curl https://registry.prateek.svc.cluster.local/v2/_catalog -k
{"repositories":["prateek/echo"]}

Развертывание с использованием образа из службы реестра

Пробное развертывание с образом: registry.prateek / prateek / echo: последний
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
  namespace: cequence
  labels:
      app: hello
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello
        image: registry.prateek/prateek/echo:latest
        imagePullPolicy: IfNotPresent
        ports:
         - containerPort: 5678
        args: ["-text=hello"]
развертывание выдает ошибку
Normal Pulling 10s (x2 over 25s) kubelet, docker-for-desktop pulling image "registry.prateek/prateek/echo:latest"
Warning Failed 10s (x2 over 25s) kubelet, docker-for-desktop Failed to pull image "registry.prateek/prateek/echo:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://registry.prateek/v2/: Service Unavailable 
Изменено развертывание, чтобы иметь образ: registry.prateek.svc.cluster.local / prateek / echo: последний
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
  namespace: cequence
  labels:
      app: hello
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello
        image: registry.prateek.svc.cluster.local/prateek/echo:latest
        imagePullPolicy: IfNotPresent
        ports:
         - containerPort: 5678
        args: ["-text=hello"]
получить аналогичную ошибку
Warning Failed 1s kubelet, docker-for-desktop Failed to pull image "registry.prateek.svc.cluster.local/prateek/echo:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://registry.prateek.svc.cluster.local/v2/: Service Unavailable

Я не думаю, что это даже возможно.Запустите реестр Docker как службу и укажите другую службу в пространстве имен, чтобы использовать это развертывание реестра в кластере.Любое предложение приветствуется

1 Ответ

4 голосов
/ 17 апреля 2019

Демон контейнера работает за пределами kubernetes.

Поэтому, если вы хотите получить образ, вам нужно убедиться, что реестр доступен с узла напрямую, без использования механизмов kubernetes, таких как служба. (Не так, как если бы вы тестировали его на шаге 9 через модуль, вы должны иметь возможность работать непосредственно на узле!)

Обычные опции - создать запись DNS или запись hosts.txt, указывающую на узел, где либо через hostPort (контейнер), либо nodePort (служба) реестр доступен, либо вы используете соответствующий вход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...