در نسخه ۱.۲۶ کوبرنتیز، نحوه تنظیم رجیستریهای میرور تغییر کرده است. در این نسخه، هر ریپازیتوری دارای یک دایرکتوری جداگانه برای تنظیمات خود می باشد و این روش با نسخههای قبلی که تمامی رجیستریها در یک فایل کانفیگ قرار میگرفتند، متفاوت است. بنابراین، روشهای قدیمی برای نسخههای جدید کوبرنتیز کاربردی نخواهند داشت.
توجه
- اگر کلاستر شما از نسخههای قدیمی کوبرنتیز استفاده میکند، این روش را اجرا نکنید؛ زیرا ممکن است باعث مشکلاتی در رجیستریهای شما شود. این روش برای کوبرنتیز نسخه ۱.۲۶ و بالاتر طراحی شده است. برای نسخههای پایینتر کوبرنتیز، میتوانید از این مستند به عنوان راهنمای پیادهسازی استفاده کنید.
- در صورتی که نودپول را اسکیل کنید، تنظیمات روی نودهای جدید اعمال نخواهد شد. برای اطمینان از این که همه نودهای جدید نیز تنظیمات رجیستری میرور را دریافت کنند، پیشنهاد میشود یک نودپول جدید ایجاد کرده و از پنل مدیریتی تنظیمات را روی آن اعمال کنید.
در بسیاری از سناریوهای مدیریت کلاستر، نیاز به اعمال سریع تغییرات روی 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
را تغییر داده و موارد مورد نیاز را به لیست بالا اضافه یا کم کنید.