Установка локального хранилища Docker-образов

Перед установкой определите, на каком из рабочих узлов будет располагаться локальное хранилище Docker-образов.

Для установки локального хранилища Docker-образов выполните действия на первом главном узле из любой директории:

  1. Создайте пространство имён registryfmp:

kubectl create ns registryfmp

  1. Сгенерируйте сертификат шифрования для корректной работы рабочего узла с локальным хранилищем:

mkdir -p certs
openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout certs/registry.key \
-addext "subjectAltName = IP:<IP-адрес рабочего узла>" \
-x509 -days 3650 -out certs/registry.crt

В подстановке <IP-адрес рабочего узла> укажите IP-адрес, который будет использоваться в качестве адреса локального хранилища.

После выполнения действий будут получены файлы в папке certs:

  1. Создайте секрет для хранения сгенерированного сертификата шифрования:

kubectl create secret tls registry-cert \
--cert=certs/registry.crt \
--key=certs/registry.key \
-n registryfmp

  1. Создайте файл PV.yaml для описания тома постоянного хранения (Persistent Volume) с содержимым:

apiVersion: v1
kind: PersistentVolume
metadata:
 name: registryfmp
 labels:
   type: local
spec:
 storageClassName: longhorn
 capacity:
   storage: 50Gi
 accessModes:
   - ReadWriteOnce
 nodeAffinity:
   required:
     nodeSelectorTerms:
     - matchExpressions:
       - key: kubernetes.io/hostname
         operator: In
         values:
         - <наименование рабочего узла>
 csi:
   driver: driver.longhorn.io
   fsType: ext4
   volumeHandle: registryfmp
   volumeAttributes:
     dataLocality: disabled
     fromBackup: ''
     fsType: ext4
     numberOfReplicas: '3'
     staleReplicaTimeout: '30'
 persistentVolumeReclaimPolicy: Delete
 volumeMode: Filesystem

В подстановке <наименование рабочего узла> укажите наименование рабочего узла, на котором будет содержаться том и запускаться контейнер локального хранилища, например: k8s-worker1.

  1. Примените конфигурацию тома постоянного хранения с использованием файла PV.yaml:

kubectl apply -f PV.yaml

  1. Создайте файл PVC.yaml для описания заявки тома постоянного хранения (Persistent Volume Claim) с содержимым:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: registryfmp
 namespace: registryfmp
spec:
 accessModes:
   - ReadWriteOnce
 storageClassName: longhorn
 resources:
   requests:
     storage: 50Gi

  1. Примените конфигурацию заявки тома постоянного хранения с использованием файла PVC.yaml:

kubectl apply -f PVC.yaml

  1. Создайте файл Deployment.yaml для описания развёртывания хранилища (Deployment) с содержимым:

apiVersion: apps/v1
kind: Deployment
metadata:
 labels:
   run: registry
 name: registry
 namespace: registryfmp
spec:
 replicas: 1
 selector:
   matchLabels:
     run: registry
 template:
   metadata:
     labels:
       run: registry
   spec:
     containers:
     - name: registry
       image: registry:2
       ports:
       - containerPort: 5000
       env:
       - name: REGISTRY_HTTP_TLS_CERTIFICATE
         value: "/certs/tls.crt"
       - name: REGISTRY_HTTP_TLS_KEY
         value: "/certs/tls.key"
       volumeMounts:
       - name: registry-certs
         mountPath: "/certs"
         readOnly: true
       - name: registry-data
         mountPath: /var/lib/registry
         subPath: registry
     volumes:
     - name: registry-certs
       secret:
         secretName: registry-cert
     - name: registry-data
       persistentVolumeClaim:
         claimName: registryfmp
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: kubernetes.io/hostname
               operator: In
               values:
               - <наименование рабочего узла>

В подстановке <наименование рабочего узла> укажите наименование рабочего узла, используемого в шаге 4.

  1. Примените конфигурацию развёртывания хранилища с использованием файла Deployment.yaml:

kubectl apply -f Deployment.yaml

  1. Создайте файл Service.yaml для описания сетевого сервиса с содержимым:

apiVersion: v1
kind: Service
metadata:
 name: registryfmp-service
 namespace: registryfmp
spec:
 type: NodePort
 selector:
   run: registry
 ports:
   - name: registryfmp-tcp
     protocol: TCP
     port: 5000
     targetPort: 5000
 externalIPs:
   - <IP-адрес рабочего узла>

В подстановке <IP-адрес рабочего узла> укажите IP-адрес, используемый в шаге 2.

  1. Примените конфигурацию сетевого сервиса с использованием файла Service.yaml:

kubectl apply -f Service.yaml

  1. Проверьте доступ к локальному хранилищу:

curl --cacert certs/registry.crt https://<IP-адрес рабочего узла>:5000/v2/_catalog

После выполнения запроса в ответе должно возвращаться содержимое каталога, например:

{"repositories":[]}

После выполнения действий на рабочем узле будет установлено локальное хранилище Docker-образов.

На каждом узле кластера выполните действия:

  1. Растиражируйте сертификат шифрования registry.crt в папку /usr/local/share/ca-certificates:

scp certs/registry.crt root@<IP-адрес узла>/usr/local/share/ca-certificates/registry.crt

  1. Обновите хранилище сертификатов:

update-ca-certificates

  1. Перезапустите сервис контейнеров Deckhouse:

systemctl restart containerd.service

Далее перейдите к загрузке образов мобильной платформы в локальное хранилище.

См. также:

Подготовка и развёртывание отказоустойчивого кластера на основе Kubernetes | Загрузка образов мобильной платформы в локальное хранилище