Для установки локального хранилища Docker Registry:
Создайте пространство имён registryfmp на одном из рабочих узлов:
kubectl create ns registryfmp
Сгенерируйте сертификат шифрования для корректной работы рабочих узлов с локальным хранилищем:
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:
registry.crt. Сертификат шифрования;
registry.key. Ключ шифрования.
Создайте секрет для хранения сгенерированного сертификата шифрования:
kubectl create secret tls
registry-cert \
--cert=certs/registry.crt \
--key=certs/registry.key \
-n registryfmp
Создайте файл манифеста SC.yaml:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: registryfmp
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
Примените конфигурацию StorageClass с использованием файла SC.yaml:
kubectl apply -f SC.yaml
Создайте файл манифеста PV.yaml:
apiVersion: v1
kind: PersistentVolume
metadata:
name: registryfmp
labels:
type: local
spec:
storageClassName: registryfmp
capacity:
storage: <объём
памяти>
accessModes:
- ReadWriteOnce
hostPath:
path: "<путь
до локального хранилища>"
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- <наименование
рабочего узла>
В подстановках:
<объём памяти>. Укажите объём допустимого потребления памяти не меньше объёма, указанного в файле PVC.yaml в шаге 8. Например: 50Gi;
<путь до локального хранилища>. Укажите путь до локального хранилища, который создаётся вручную на каждом рабочем узле кластера. Например: /mnt/pvs/registry;
<наименование рабочего узла>. Задайте наименование рабочего узла, на котором будет содержаться Persistent Volume и POD локального хранилища. Например: worker1.k8s.internal.
Примените конфигурацию Persistent Volume с использованием файла PV.yaml:
kubectl apply -f PV.yaml
Создайте файл манифеста PVC.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: registryfmp
namespace: registryfmp
spec:
accessModes:
- ReadWriteOnce
storageClassName: registryfmp
resources:
requests:
storage: 50Gi
Примените конфигурацию Persistent Volume Claim с использованием файла PVC.yaml:
kubectl apply -f PVC.yaml
Создайте файл манифеста Deployment.yaml:
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
Примените конфигурацию Deployment с использованием файла Deployment.yaml:
kubectl apply -f Deployment.yaml
Создайте файл манифеста 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.
Примените конфигурацию Service с использованием файла Service.yaml:
kubectl apply -f Service.yaml
Проверьте выполнение запроса к локальному хранилищу:
curl --cacert certs/registry.crt https://<IP-адрес рабочего узла>/v2/_catalog
После выполнения запроса в ответе должно возвращаться содержимое каталога.
Скопируйте сертификат шифрования registry.crt на все рабочие узлы кластера в папку /usr/local/share/ca-certificates:
scp certs/registry.crt root@<IP-адрес рабочего узла>/usr/local/share/ca-certificates/registry.crt
Обновите хранилище сертификатов на каждом рабочем узле:
update-ca-certificates
Перезапустите сервис runtime на каждом рабочем узле:
docker:
systemctl restart docker
containerd:
systemctl restart containerd
После выполнения действий будет установлено локальное хранилище Docker Registry.
Далее перейдите к настройке Persistent Volume.
См. также:
Подготовка и развёртывание отказоустойчивого кластера на основе Deckhouse | Настройка Persistent Volume