در نسخه ۱.۲۶ کوبرنتیز، نحوه تنظیم رجیستری‌های میرور تغییر کرده است. در این نسخه، هر ریپازیتوری دارای یک دایرکتوری جداگانه برای تنظیمات خود می باشد و این روش با نسخه‌های قبلی که تمامی رجیستری‌ها در یک فایل کانفیگ قرار می‌گرفتند، متفاوت است. بنابراین، روش‌های قدیمی برای نسخه‌های جدید کوبرنتیز کاربردی نخواهند داشت.

توجه

  • اگر کلاستر شما از نسخه‌های قدیمی کوبرنتیز استفاده می‌کند، این روش را اجرا نکنید؛ زیرا ممکن است باعث مشکلاتی در رجیستری‌های شما شود. این روش برای کوبرنتیز نسخه ۱.۲۶ و بالاتر طراحی شده است. برای نسخه‌های پایین‌تر کوبرنتیز، می‌توانید از این مستند به عنوان راهنمای پیاده‌سازی استفاده کنید.
  • در صورتی که نودپول را اسکیل کنید، تنظیمات روی نودهای جدید اعمال نخواهد شد. برای اطمینان از این که همه نودهای جدید نیز تنظیمات رجیستری میرور را دریافت کنند، پیشنهاد می‌شود یک نودپول جدید ایجاد کرده و از پنل مدیریتی تنظیمات را روی آن اعمال کنید.

در بسیاری از سناریوهای مدیریت کلاستر، نیاز به اعمال سریع تغییرات روی Worker Nodeهای کوبرنتیز وجود دارد. یکی از روش‌های مؤثر برای این کار، استفاده از یک DaemonSet است که وظیفه اجرای اسکریپت‌های Bash روی نودها را بر عهده دارد.

در این روش، یک ConfigMap حاوی اسکریپت‌های Bash ایجاد شده و درون DaemonSet مانت می‌شود تا تنظیمات لازم را روی نودها اعمال کند. با این حال، توجه داشته باشید که این DaemonSet به‌صورت پیش‌فرض روی تمامی نودها اجرا نمی‌شود،بلکه تنها روی نودهایی فعال خواهد شد که دارای لیبل مشخصی باشند.

مراحل پیاده‌سازی

۱. ایجاد یک Namespace برای منابع موقت

ابتدا یک Namespace موقت برای مدیریت ConfigMap و DaemonSet ایجاد کنید:

bashCopyEdit

kubectl --kubeconfig <cluster-kubeonfig-address> create ns temp-config

۲. ایجاد ConfigMap برای ذخیره اسکریپت Bash

یک ConfigMap شامل اسکریپت Bash موردنظر را تعریف و اعمال کنید:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ske-config
  namespace: temp-config
data:
  install.sh: |
    #!/bin/bash
 
    CERTS_DIR="/etc/containerd/certs.d"
    SKE_MIRROR_URL="https://mirror.registry.platform.ske.sotoon.ir"
 
    # Create the certs.d directory if it doesn't exist
    if [ ! -d "$CERTS_DIR" ]; then
      echo "Creating directory $CERTS_DIR"
      mkdir -p "$CERTS_DIR"
    fi
 
    create_mirror_cert_d_config() {
      REGISTRY=$1
      REGISTRY_DIR="$CERTS_DIR/$REGISTRY"
 
      # Check if directory for registry exists
      if [ -d "$REGISTRY_DIR" ]; then
        echo "Directory for $REGISTRY already exists. Skipping mirror configuration."
        return 0
      fi
 
      echo "Setting up cert.d mirror configuration for $REGISTRY"
 
      # Create directory for registry
      mkdir -p "$REGISTRY_DIR"
 
      # Write the mirror config in cert.d
      MIRROR_CONFIG="$REGISTRY_DIR/hosts.toml"
      cat > "$MIRROR_CONFIG" << EOF
    server = "$SKE_MIRROR_URL"
 
    [host."$SKE_MIRROR_URL"]
      capabilities = ["pull", "resolve"]
    EOF
 
      echo "Cert.d mirror configuration for $REGISTRY added at $MIRROR_CONFIG"
    }
 
    create_mirror_cert_d_config "docker.io"
    create_mirror_cert_d_config "gcr.io"
    create_mirror_cert_d_config "k8s.gcr.io"
    create_mirror_cert_d_config "ghcr.io"
    create_mirror_cert_d_config "quay.io"
    create_mirror_cert_d_config "k8s.io"
    create_mirror_cert_d_config "registry.k8s.io"
 
    echo "Reloading systemd daemon and restarting containerd.service"
 
    systemctl daemon-reload
    if [[ $? -ne 0 ]]; then
      echo "Error: Failed to reload systemd daemon"
      exit 1
    fi
 
    systemctl restart containerd.service
    if [[ $? -ne 0 ]]; then
      echo "Error: Failed to restart containerd.service"
      exit 1
    fi
 
    echo "containerd.service restarted successfully, Check the pods on the node to be healthy!"
 
    exit 0
kubectl --kubeconfig <cluster-kubeonfig-address> create -f configmap.yaml

نکته

مقدار SKE_MIRROR_URL در این تنظیمات به https://mirror.registry.platform.ske.sotoon.ir ست شده است. اگر نیاز به رجیستری دیگری دارید، مقدار آن را به آدرس موردنظر تغییر دهید.

همچنین، فقط رجیستری‌های زیر به‌عنوان میرور تنظیم شده‌اند:

  • docker.io
  • gcr.io
  • k8s.gcr.io
  • ghcr.io
  • quay.io
  • k8s.io
  • registry.k8s.io

در صورت نیاز به افزودن یا حذف رجیستری‌های دیگر، می توانید این لیست را تغییر دهید.

۳. ایجاد و اعمال DaemonSet

سپس، یک DaemonSet ایجاد می‌کنیم که این اسکریپت را از طریق ConfigMap روی نودهای مشخص اجرا کند.

apiVersion: apps/v1
kind: DaemonSet
metadata:
 annotations:
 name: ske-config
 namespace: temp-config
spec:
 selector:
   matchLabels:
     job: ske-config
 template:
   metadata:
     labels:
       job: ske-config
   spec:
     nodeSelector:
       ske.sotoon.ir/config: "enabled"
     containers:
       - image: registry.ske.sotoon.ir/tools/node-installer:1.3
         imagePullPolicy: IfNotPresent
         name: installer
         resources:
           limits:
             cpu: 10m
             memory: 100Mi
         securityContext:
           privileged: true
         terminationMessagePath: /dev/termination-log
         terminationMessagePolicy: File
         volumeMounts:
           - mountPath: /tmp
             name: script
           - mountPath: /host
             name: host-mount
     dnsPolicy: ClusterFirst
     hostPID: true
     restartPolicy: Always
     schedulerName: default-scheduler
     securityContext: {}
     terminationGracePeriodSeconds: 30
     volumes:
       - configMap:
           defaultMode: 420
           name: ske-config
         name: script
       - hostPath:
           path: /tmp/install
           type: ""
         name: host-mount
 updateStrategy:
   type: OnDelete
kubectl --kubeconfig <cluster-kubeonfig-address> create -f daemonset.yaml

۴. اجرای DaemonSet روی نود هدف

این DaemonSet تنها روی نودهایی اجرا می‌شود که دارای لیبل مشخصی باشند. برای اجرای آن روی یک نود خاص، لیبل زیر را به نود اضافه کنید:

kubectl --kubeconfig <cluster-kubeonfig-address> label node NODE_NAME ske.sotoon.ir/config=enabled

با انجام این مراحل، DaemonSet تنها روی نودهای دارای این لیبل اجرا شده و تغییرات موردنظر را اعمال خواهد کرد.

۵. حذف Namespace موقت پس از اعمال تغییرات

پس از اجرای تغییرات و اطمینان از عملکرد صحیح، می‌توانید Namespace موقت را حذف کنید تا منابع اضافی از کلاستر پاک شوند:

kubectl --kubeconfig <cluster-kubeonfig-address> delete ns temp-config

نکته

در این کانفیگ، رجیستری‌های زیر به عنوان میرور تنظیم شده‌اند:

  • create_mirror_cert_d_config "docker.io"

  • create_mirror_cert_d_config "gcr.io"

  • create_mirror_cert_d_config "k8s.gcr.io"

  • create_mirror_cert_d_config "ghcr.io"

  • create_mirror_cert_d_config "quay.io"

  • create_mirror_cert_d_config "k8s.io"

  • create_mirror_cert_d_config "registry.k8s.io"

در صورتی که نیاز به تنظیم رجیستری‌های دیگری دارید، می‌توانید مقدار SKE_MIRROR_URL را تغییر داده و موارد مورد نیاز را به لیست بالا اضافه یا کم کنید.