Kubernetes
December 11, 2022

Интеграция Kubernetes с Container Registry

После того как создали кластер k8s можно настроить интеграцию с CR для хранения docker имиджей в этом ресурсе.

Для начала создадим репозиторий в CR.

export FOLDER=$(yc config get folder-id)
yc container registry create \
   --folder-id $FOLDER \
   --name cam-reg \
   --labels prod=cr \
   --async

Посмотреть информацию о реестре:

yc container registry list
yc container registry get cam-reg
yc container registry list-access-bindings cam-reg
yc container registry list-ip-permissions cam-reg
export REGISTRY=$(yc container registry get cam-reg --format=json | jq -r ".id")

Аутентификация с помощью Docker Credential helper.

yc container registry configure-docker

Создадим Dockerfile и отправим его в реджистри.

mkdir -p ~/docker/nginx && cd ~/docker/nginx
vi nginx.dockerfile
FROM nginx:latest
LABEL maintainer="cameda4@yandex.ru"
RUN apt update && apt -y install htop mc dstat
COPY index.html /usr/share/nginx/html/index.html
docker build . -f nginx.dockerfile -t cr.yandex/$REGISTRY/nginx:a1
docker push cr.yandex/${REGISTRY}/nginx:a1
yc container image list
+----------------------+---------------------+-----------------------------------+--------+-----------------+
|          ID          |       CREATED       |               NAME                |  TAGS  | COMPRESSED SIZE |
+----------------------+---------------------+-----------------------------------+--------+-----------------+
| crpj4725oa2pqefrk69q | 2022-11-30 16:29:00 | crpe6fbthgrqrd44cbio/ubuntu       | hello  | 29.0 MB         |
| crpusp769srnq5su3lo1 | 2021-12-25 10:22:37 | crpo4csb4geb92pb56d9/ubuntu-nginx | latest | 72.4 MB         |
+----------------------+---------------------+-----------------------------------+--------+-----------------+

Подключим имидж в кластере k8s:

kubectl get po
kubectl run --attach cam-test --image cr.yandex/${REGISTRY}/nginx:a1
kubectl get po

Если имидж не нужен, то его всегда можно удалить:

yc container image delete crpusp769srnq5su3lo1
yc container image delete crpj4725oa2pqefrk69q

POD spec:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: cam1-nginx
spec:
  containers:
  - image: cr.yandex/crpe6fbthgrqrd44cbio/nginx:a2
    name: nginx
    resources:
      requests:
        cpu: 300m
        memory: 100Mi
      limits:
        cpu: 300m
        memory: 150Mi
  restartPolicy: OnFailure
EOF
kubectl exec --stdin --tty cam-httpd -- /bin/bash

Также, можно создать Deployment с уже подготовленным имиджем.

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cameda-nginx
  labels: 
    app: nginx-prod 
    environment: prod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: 
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: cr.yandex/crpe6fbthgrqrd44cbio/nginx:a2
        ports: 
        - name: http
          containerPort: 80
        resources: 
          requests: 
            cpu: 300m
            memory: 300Mi 
          limits: 
            cpu: 800m 
            memory: 800Mi
      restartPolicy: Always
EOF