این آموزش به شما نشان میدهد چگونه یک برنامه نمونه را روی کوبرنتیز با استفاده از minikube اجرا کنید.
این آموزش یک ایمیج کانتینری ارائه میدهد که از NGINX برای بازگرداندن تمامی درخواستها استفاده میکند.
Objectives
استقرار یک برنامه نمونه روی minikube
اجرای برنامه
مشاهده لاگهای برنامه
Before you begin
این آموزش فرض میکند که شما قبلا minikube را راهاندازی کردهاید.
برای دستورالعمل نصب، مرحله ۱ در صفحه minikube start را ببینید.
Note:
فقط دستورهای مرحله ۱، نصب را اجرا کنید. مراحل دیگر در همین صفحه توضیح داده شدهاند.
همچنین باید kubectl را نصب کنید.
برای دستورالعمل نصب، صفحه Install tools را ببینید.
ساخت یک کلاستر minikube
minikube start
باز کردن داشبورد
داشبورد کوبرنتیز را باز کنید. دو روش برای انجام این کار وجود دارد:
یک ترمینال جدید باز کنید و دستور زیر را اجرا کنید:
# Start a new terminal, and leave this running.minikube dashboard
اکنون به ترمینالی که minikube start را اجرا کرده بودید برگردید.
Note:
دستور dashboard افزونه داشبورد را فعال میکند و یک پراکسی باز کرده و داشبورد را در مرورگر پیشفرض شما نمایش میدهد.
در داشبورد میتوانید منابعی مثل Deployment و Service ایجاد کنید.
برای اینکه بدون باز شدن خودکار مرورگر و فقط آدرس داشبورد را دریافت کنید، تب "URL copy and paste" را ببینید.
به طور پیشفرض، داشبورد فقط از داخل شبکه داخلی کوبرنتیز قابل دسترسی است.
دستور dashboard یک پراکسی موقت برای دسترسی از بیرون ایجاد میکند.
برای متوقف کردن پراکسی، کلید Ctrl+C را بزنید.
پس از خروج، داشبورد همچنان روی کلاستر اجرا میشود و فقط پراکسی قطع میشود.
در صورت نیاز میتوانید دوباره دستور dashboard را اجرا کنید.
اگر نمیخواهید minikube مرورگر را باز کند، زیر دستور dashboard از فلگ --url استفاده کنید.
minikube یک آدرس URL نمایش میدهد که شما میتوانید در مرورگر دلخواه باز کنید.
یک ترمینال جدید باز کنید و اجرا کنید:
# Start a new terminal, and leave this running.minikube dashboard --url
حالا میتوانید از این URL استفاده کنید و به ترمینالی که minikube start را اجرا کرده بودید برگردید.
ساخت Deployment
یک Pod گروهی از یک یا چند کانتینر است که برای مدیریت و شبکهسازی به هم مرتبط هستند.
پاد این آموزش فقط یک کانتینر دارد.
Deployment وضعیت سلامت پاد را بررسی کرده و اگر خراب شود، آن را مجدداً اجرا میکند.
Deployment روش پیشنهادی برای ساخت و مقیاسدهی پادهاست.
ایجاد Deployment:
# Run a test container image that includes a webserverkubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080
مشاهده Deployment:
kubectl get deployments
خروجی مشابه موارد زیر است:
NAME READY UP-TO-DATE AVAILABLE AGE
hello-node 1/1 1 1 1m
(ممکن است کمی زمان ببرد تا پاد آماده شود. اگر 0/1 دیدید، چند ثانیه بعد دوباره امتحان کنید.)
مشاهده Pod:
kubectl get pods
خروجی مشابه موارد زیر است:
NAME READY STATUS RESTARTS AGE
hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m
مشاهده رویدادهای کلاستر:
kubectl get events
مشاهده کانفیگ kubectl:
kubectl config view
مشاهده لاگ کانتینر داخل پاد (نام پاد را جایگزین کنید):
Note:
نام hello-node-5f76cf6ccf-br9b5 را با خروجی دستور kubectl get pods جایگزین کنید.
kubectl logs hello-node-5f76cf6ccf-br9b5
خروجی مشابه موارد زیر است:
I0911 09:19:26.677397 1 log.go:195] Started HTTP server on port 8080
I0911 09:19:26.677586 1 log.go:195] Started UDP server on port 8081
Note:
برای اطلاعات بیشتر در مورد دستورهای kubectl، صفحه kubectl overview را ببینید.
ساخت Service
به طور پیشفرض پاد فقط از داخل شبکه داخلی کوبرنتیز قابل دسترسی است.
برای اینکه کانتینر hello-node از بیرون قابل دسترسی باشد، باید آن را بهعنوان یک Service اکسپوز کنید.
Warning:
کانتینر agnhost یک مسیر /shell دارد که برای دیباگ مفید است اما برای اینترنت عمومی خطرناک است.
هرگز این را روی کلاستر عمومی یا تولیدی اجرا نکنید.
اگر پیام بالا را مشاهده کردید، صبر کنید و دوباره امتحان کنید:
غیرفعال کردن افزونه:
minikube addons disable metrics-server
پاکسازی
اکنون میتوانید منابعی را که در کلاستر خود ایجاد کردهاید، پاک کنید:
kubectl delete service hello-node
kubectl delete deployment hello-node
توقف کلاستر minikube:
minikube stop
در صورت تمایل، ماشین مجازی Minikube را حذف کنید:
# Optionalminikube delete
اگر میخواهید دوباره از minikube برای کسب اطلاعات بیشتر در مورد کوبرنتیز استفاده کنید، نیازی به حذف آن ندارید.
نتیجهگیری
در این صفحه یاد گرفتید چگونه یک کلاستر minikube راهاندازی کنید و برنامه اجرا کنید.
What's next
آموزش استقرار اولین برنامه روی کوبرنتیز با kubectl
یادگیری بیشتر درباره Deployment
یادگیری بیشتر درباره اجرای برنامهها
یادگیری بیشتر درباره Service
2 - مستندات کوبرنتیز
کوبرنتیز یک موتور orchestration کانتینر متنباز برای خودکارسازی استقرار، مقیاسپذیری و مدیریت برنامههای کانتینری است. این پروژه متنباز توسط Cloud Native Computing Foundation میزبانی میشود.
2.1 - مستندات نسخههای موجود
این وبگاه(website) شامل مستندات نسخه فعلی کوبرنتیز و چهار نسخه قبلی آن است.
وجود مستندات برای یک نسخه کوبرنتیز لزوماً به معنای پشتیبانی فعلی از آن انتشار نیست. برای آگاهی از اینکه کدام نسخههای کوبرنتیز بهطور رسمی پشتیبانی میشوند و این پشتیبانی چه مدت ادامه دارد، دوره پشتیبانی را مطالعه کنید.
3 - شروع کنید
این بخش روشهای مختلف راهاندازی و اجرای کوبرنتیز را فهرست میکند.
هنگام نصب کوبرنتیز، نوع نصب را بر اساس موارد زیر انتخاب کنید: سهولت نگهداری، امنیت، کنترل، منابع موجود و تخصص مورد نیاز برای راهاندازی و مدیریت یک خوشه (cluster).
میتوانید با دانلود کوبرنتیز یک خوشه کوبرنتیز را روی ماشین محلی، در فضای ابری یا در مرکز داده خودتان مستقر کنید.
توصیه میشود هرجا امکانپذیر است، مؤلفههای کوبرنتیز را بهشکل ایمیجهای کانتینری اجرا کرده و مدیریت آنها را به خود کوبرنتیز بسپارید.
مؤلفههایی که کانتینرها را اجرا میکنند—بهویژه kubelet—در این دسته قرار نمیگیرند.
اگر نمیخواهید خودتان یک خوشه کوبرنتیز را مدیریت کنید، میتوانید یک سرویس مدیریتشده، از جمله بسترهای تأییدشده را انتخاب کنید.
همچنین راهکارهای استاندارد و سفارشی دیگری در طیف گستردهای از محیطهای ابری و سرورهای فیزیکی (bare metal) وجود دارد.
محیط یادگیری
اگر در حال یادگیری کوبرنتیز هستید، از ابزارهای پشتیبانی شده توسط جامعه کوبرنتیز یا ابزارهای موجود در بومسازگان برای راهاندازی یک خوشه کوبرنتیز روی یک دستگاه محلی استفاده کنید. به نصب ابزارها مراجعه کنید.
محیط عملیاتی
هنگام ارزیابی یک راهکار برای یک
محیط عملیاتی، در نظر بگیرید کدام جنبههای
عملیاتی یک خوشه کوبرنتیز را میخواهید خودتان مدیریت کنید و
کدامها را ترجیح میدهید به یک ارائهدهنده بسپارید.
برای خوشهای که خودتان مدیریت میکنید، ابزار رسمیِ پشتیبانیشده برای استقرار
کوبرنتیز، kubeadm است.
کوبرنتیز طوری طراحی شده است که Control Plane آن روی لینوکس اجرا شود. درون خوشه خود میتوانید برنامهها را روی لینوکس یا سیستم عامل های دیگر، از جمله ویندوز، اجرا کنید.
این صفحه نحوه نصب جعبه ابزار kubeadm را نشان میدهد.
برای کسب اطلاعات در مورد نحوه ایجاد یک خوشه(cluster) با kubeadm پس از انجام این فرآیند نصب، به صفحه ایجاد یک خوشه با kubeadm مراجعه کنید.
This راهنمای نصب is for Kubernetes v1.33. If you want to use a different Kubernetes version, please refer to the following pages instead:
یک میزبان لینوکس سازگار. پروژه کوبرنتیز دستورالعملهای عمومی برای توزیعهای لینوکس مبتنی بر Debian و Red Hat و توزیعهای بدون مدیر بسته ارائه میدهد.
۲ گیگابایت یا بیشتر رم برای هر دستگاه (هر چه کمتر باشد، فضای کمی برای برنامههای شما باقی میماند).
۲ پردازنده مرکزی یا بیشتر برای ماشینهای کنترلی.
اتصال کامل شبکه بین تمام ماشینهای موجود در خوشه (شبکه عمومی یا خصوصی اشکالی ندارد).
نام میزبان، نشانی(آدرس) MAC و شناسه محصول منحصر به فرد برای هر گره(node). برای جزئیات بیشتر به اینجا مراجعه کنید.
پورتهای خاصی روی دستگاههای شما باز هستند. برای جزئیات بیشتر به اینجا مراجعه کنید.
Note:
نصب kubeadm از طریق پرونده(فایل) های دودویی(باینری) انجام میشود که از پیوند(لینک) پویا استفاده میکنند و فرض میکنند که سیستم هدف شما glibc را ارائه میدهد.
این یک فرض منطقی در بسیاری از توزیعهای لینوکس (از جمله دبیان، اوبونتو، فدورا، CentOS و غیره) است.
اما همیشه در مورد توزیعهای سفارشی و سبک که به طور پیشفرض glibc را شامل نمیشوند، مانند Alpine Linux، صدق نمیکند.
انتظار میرود که توزیع یا شامل glibc یا یک لایه سازگاری باشد که نمادهای مورد انتظار را ارائه میدهد.
نسخه سیستم عامل خود را بررسی کنید
Note: This section links to third party projects that provide functionality required by Kubernetes. The Kubernetes project authors aren't responsible for these projects, which are listed alphabetically. To add a project to this list, read the content guide before submitting a change. More information.
یک خوشه کوبرنتیز که توسط kubeadm ایجاد میشود، به نرمافزاری بستگی دارد که از ویژگیهای هسته(kernel) استفاده میکند.
این نرمافزار شامل، اما نه محدود به
container runtime،
kubelet، و یک افزونه Container Network Interface میشود.
برای کمک به شما در جلوگیری از خطاهای غیرمنتظره ناشی از عدم پشتیبانی از نسخه هسته، kubeadm بررسی پیش از اجرای SystemVerification را اجرا میکند. اگر نسخه هسته(kernel) پشتیبانی نشود، این بررسی با شکست مواجه میشود.
اگر میدانید که هسته(kernel) شما ویژگیهای مورد نیاز را ارائه میدهد، حتی اگر kubeadm از نسخه آن پشتیبانی نکند، میتوانید از بررسی صرف نظر کنید.
بررسی کنید که نشانی(آدرس) MAC و product_uuid برای هر گره(node) منحصر به فرد باشند
شما میتوانید نشانی(آدرس) MAC رابطهای شبکه را با استفاده از دستور ip link یا ifconfig -a دریافت کنید.
شناسه محصول (product_uuid) را میتوان با استفاده از دستور sudo cat /sys/class/dmi/id/product_uuid بررسی کرد.
بسیار محتمل است که دستگاههای سختافزاری نشانی(آدرس) های منحصر به فردی داشته باشند، اگرچه برخی از ماشینهای مجازی ممکن است مقادیر یکسانی داشته باشند. کوبرنتیز از این مقادیر برای شناسایی منحصر به فرد گرهها در خوشه استفاده میکند. اگر این مقادیر برای هر گره(node) منحصر به فرد نباشند، فرآیند نصب ممکن است با شکست مواجه شود.
بررسی آداپتورهای شبکه
اگر بیش از یک adapters شبکه دارید و اجزای کوبرنتیز شما از طریق مسیر پیشفرض قابل دسترسی نیستند، توصیه میکنیم مسیر(های) IP را اضافه کنید تا نشانی(آدرس) های خوشه کوبرنتیز از طریق adapters مناسب عبور کنند.
بررسی پورتهای مورد نیاز
این پورتهای مورد نیاز
برای اینکه اجزای Kubernetes بتوانند با یکدیگر ارتباط برقرار کنند، باید باز باشند.
میتوانید از ابزارهایی مانند netcat برای بررسی باز بودن یک پورت استفاده کنید. به عنوان مثال:
nc 127.0.0.1 6443 -zv -w 2
افزونه شبکه پاد که استفاده میکنید ممکن است نیاز به باز بودن پورتهای خاصی داشته باشد. از آنجایی که این موضوع در هر افزونه شبکه پاد متفاوت است، لطفاً برای اطلاع از پورت(های) مورد نیاز افزونهها، به مستندات آنها مراجعه کنید.
پیکربندی Swap
رفتار پیشفرض یک kubelet این است که در صورت شناسایی حافظه swap در یک گره، شروع به کار نکند. این بدان معناست که swap باید یا غیرفعال شود یا توسط kubelet تحمل شود.
برای تحمل swap، failSwapOn: false را به پیکربندی kubelet یا به عنوان یک آرگومان خط فرمان اضافه کنید.
توجه: حتی اگر failSwapOn: false ارائه شود، بارهای کاری به طور پیشفرض به swap دسترسی نخواهند داشت.
این را میتوان با تنظیم swapBehavior، دوباره در پرونده(فایل) پیکربندی kubelet، تغییر داد. برای استفاده از swap، swapBehavior را به غیر از تنظیم پیشفرض NoSwap تنظیم کنید.
برای جزئیات بیشتر به مدیریت حافظه swap مراجعه کنید.
برای غیرفعال کردن swap، میتوان از دستور sudo swapoff -a برای غیرفعال کردن موقت swap استفاده کرد.
برای اینکه این تغییر در راهاندازیهای مجدد پایدار بماند، مطمئن شوید که swap در پروندههای پیکربندی مانند /etc/fstab، systemd.swap غیرفعال شده است، بسته به اینکه چگونه روی سیستم شما پیکربندی شده است.
نصب یک مجری کانتینر
برای اجرای کانتینرها در پادها، کوبرنتیز از یک container runtime استفاده میکند.
به طور پیشفرض، کوبرنتیز از Container Runtime Interface (CRI)
برای ارتباط با مجری کانتینر انتخابی شما استفاده میکند.
اگر مجری کانتینر را مشخص نکنید، kubeadm به طور خودکار سعی میکند با اسکن لیستی از نقاط پایانی شناخته شده، مجری کانتینر نصب شده را تشخیص دهد.
اگر چندین مجری کانتینر شناسایی شود یا هیچ مجری کانتینری شناسایی نشود، kubeadm خطایی ایجاد میکند و از شما میخواهد که مشخص کنید میخواهید از کدام یک استفاده کنید.
موتور Docker، CRI را پیادهسازی نمیکند که برای مجری کانتینر جهت کار با کوبرنتیز الزامی است. به همین دلیل، یک سرویس اضافی cri-dockerd باید نصب شود. cri-dockerd پروژهای مبتنی بر پشتیبانی داخلی قدیمی موتور داکر است که در نسخه ۱.۲۴ از kubelet حذف شد.
جداول زیر شامل نقاط پایانی شناخته شده برای سیستم عاملهای پشتیبانی شده است:
شما این بستهها را روی تمام دستگاههای خود نصب خواهید کرد:
kubeadm: دستور راه اندازی خوشه.
kubelet: مؤلفهای که روی تمام ماشینهای موجود در خوشه شما اجرا میشود و کارهایی مانند راهاندازی پادها و کانتینرها را انجام میدهد.
kubectl: ابزار خط فرمان برای ارتباط با خوشه شما.
‘kubelet’ , kubeadm یا kubectl را برای شما نصب یا مدیریت نخواهد کرد، بنابراین باید مطمئن شوید که آنها با نسخه control plane کوبرنتیز که میخواهید kubeadm برای شما نصب کند، مطابقت دارند. اگر این کار را نکنید، خطر بروز انحراف نسخه وجود دارد که میتواند منجر به رفتار غیرمنتظره و باگدار شود. با این حال، انحراف یک نسخه جزئی بین kubelet و control plane پشتیبانی میشود، اما نسخه kubelet هرگز نمیتواند از نسخه سرور API فراتر رود. به عنوان مثال، kubelet که نسخه ۱.۷.۰ را اجرا میکند باید کاملاً با یک سرور API نسخه ۱.۸.۰ سازگار باشد، اما برعکس آن امکانپذیر نیست.
این دستورالعملها تمام بستههای کوبرنتیز را از هرگونه ارتقاء سیستم مستثنی میکنند.
دلیل این امر این است که kubeadm و کوبرنتیز نیاز به فرایند ویژه ارتقاء دارند.
برای اطلاعات بیشتر در مورد انحراف نسخه، به موارد زیر مراجعه کنید:
Note: The legacy package repositories (apt.kubernetes.io and yum.kubernetes.io) have been
deprecated and frozen starting from September 13, 2023.
Using the new package repositories hosted at pkgs.k8s.io
is strongly recommended and required in order to install Kubernetes versions released after September 13, 2023.
The deprecated legacy repositories, and their contents, might be removed at any time in the future and without
a further notice period. The new package repositories provide downloads for Kubernetes versions starting with v1.24.0.
Note:
برای هر نسخه فرعی کوبرنتیز یک مخزن بسته اختصاصی وجود دارد. اگر میخواهید نسخه فرعی دیگری غیر از v1.33 نصب کنید، لطفاً به راهنمای نصب نسخه فرعی مورد نظر خود مراجعه کنید.
فهرست بستههای apt را بهروزرسانی کنید و بستههای مورد نیاز برای استفاده از مخزن کوبرنتیز apt را نصب کنید:
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that packagesudo apt-get install -y apt-transport-https ca-certificates curl gpg
کلید امضای عمومی مخازن بسته کوبرنتیز را دانلود کنید.
کلید امضای یکسانی برای همه مخازن استفاده میشود، بنابراین میتوانید نسخه موجود در URL را نادیده بگیرید:
# اگر پوشه(folder) `/etc/apt/keyrings` وجود ندارد، باید قبل از دستور curl ایجاد شود، نکته زیر را بخوانید.# sudo mkdir -p -m 755 /etc/apt/keyringscurl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
Note:
در نسخههای قدیمیتر از دبیان ۱۲ و اوبونتو ۲۲.۰۴، پوشه /etc/apt/keyrings به طور پیشفرض وجود ندارد و باید قبل از دستور curl ایجاد شود.
مخزن کوبرنتیز apt مناسب را اضافه کنید. لطفاً توجه داشته باشید که این مخزن فقط بستههایی برای کوبرنتیز 1.33 دارد؛ برای سایر نسخههای فرعی کوبرنتیز، باید نسخه فرعی کوبرنتیز را در URL تغییر دهید تا با نسخه فرعی مورد نظر شما مطابقت داشته باشد. (همچنین باید بررسی کنید که مستندات مربوط به نسخه کوبرنتیز که قصد نصب آن را دارید، مطالعه میکنید.)
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.listecho'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
فهرست بستههای apt را بهروزرسانی کنید، kubelet، kubeadm و kubectl را نصب کنید و نسخه آنها را پین کنید:
(اختیاری) سرویس kubelet را قبل از اجرای kubeadm فعال کنید:
sudo systemctl enable --now kubelet
SELinux را روی حالت «مجاز» تنظیم کنید:
این دستورالعملها برای کوبرنتیز 1.33 هستند.
# Set SELinux in permissive mode (effectively disabling it)sudo setenforce 0sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
Caution:
تنظیم SELinux در حالت مجاز با اجرای setenforce 0 و sed ...
عملاً آن را غیرفعال میکند. این کار برای دسترسی کانتینرها به فایل سیستم میزبان لازم است؛ برای مثال، برخی از افزونههای شبکه خوشهای به آن نیاز دارند. شما باید این کار را تا زمانی که پشتیبانی SELinux در kubelet بهبود یابد، انجام دهید.
اگر نحوه پیکربندی SELinux را میدانید، میتوانید آن را فعال نگه دارید، اما ممکن است به تنظیماتی نیاز داشته باشد که توسط kubeadm پشتیبانی نمیشوند.
مخزن کوبرنتیز yum را اضافه کنید. پارامتر exclude در تعریف مخزن تضمین میکند که بستههای مربوط به کوبرنتیز با اجرای yum update ارتقا پیدا نکنند، زیرا برای ارتقاء کوبرنتیز باید رویه خاصی دنبال شود. لطفاً توجه داشته باشید که این مخزن فقط بستههایی برای کوبرنتیز دارد 1.33؛ برای سایر نسخههای فرعی کوبرنتیز، باید نسخه فرعی کوبرنتیز را در URL تغییر دهید تا با نسخه فرعی مورد نظر شما مطابقت داشته باشد (همچنین باید بررسی کنید که مستندات مربوط به نسخه کوبرنتیز که قصد نصب آن را دارید، مطالعه میکنید).
# This overwrites any existing configuration in /etc/yum.repos.d/kubernetes.repocat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
در صورت تمایل، crictl را نصب کنید (برای تعامل با رابط مجری کانتینر (CRI) مورد نیاز است، و برای kubeadm اختیاری است):
CRICTL_VERSION="v1.31.0"ARCH="amd64"curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz
kubeadm، kubelet را نصب کنید و یک سرویس systemd kubelet اضافه کنید:
RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"ARCH="amd64"cd$DOWNLOAD_DIRsudo curl -L --remote-name-all https://dl.k8s.io/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet}sudo chmod +x {kubeadm,kubelet}RELEASE_VERSION="v0.16.2"curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubelet/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service
sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
Note:
لطفاً برای توزیعهای لینوکس که به طور پیشفرض شامل glibc نیستند، به یادداشت موجود در بخش پیش نیازها مراجعه کنید.
با دنبال کردن دستورالعملهای موجود در صفحه نصب ابزارها، kubectl را نصب کنید.
در صورت تمایل، قبل از اجرای kubeadm، سرویس kubelet را فعال کنید:
sudo systemctl enable --now kubelet
Note:
توزیع لینوکس Flatcar Container پوشه /usr را به عنوان یک پرونده سیستم فقط خواندنی mount میکند.
قبل از راه اندازی خوشه خود، باید مراحل بیشتری را برای پیکربندی یک پوشه قابل نوشتن انجام دهید.
برای یادگیری نحوه راهاندازی یک پوشه قابل نوشتن، به راهنمای عیبیابی Kubeadm مراجعه کنید.
Kubelet حالا هر چند ثانیه یک بار ریاستارت میشود، چون در یک حلقهی توقف منتظر میماند تا kubeadm به آن بگوید چه کاری انجام دهد.
پیکربندی درایور cgroup
پیکربندی درایور cgroup هم مجری کانتینر و هم kubelet دارای یک ویژگی به نام "cgroup driver" هستند که برای مدیریت cgroupها در دستگاههای لینوکس مهم است.
Warning:
تطبیق مجری کانتینر و درایورهای cgroup kubelet مورد نیاز است یا در غیر این صورت فرآیند kubelet با شکست مواجه خواهد شد.
مانند هر برنامه دیگری، ممکن است در نصب یا اجرای kubeadm با خطایی مواجه شوید.
این صفحه برخی از سناریوهای رایج خرابی را فهرست کرده و مراحلی را ارائه داده است که میتواند به شما در درک و رفع مشکل کمک کند.
اگر مشکل شما در لیست زیر نیست، لطفاً مراحل زیر را دنبال کنید:
اگر مشکلی وجود ندارد، لطفاً یکی را باز کنید و الگوی مشکل را دنبال کنید.
اگر در مورد نحوهی کار kubeadm مطمئن نیستید، میتوانید در Slack در #kubeadm سوال خود را بپرسید، یا در StackOverflow سوالی مطرح کنید. لطفاً برچسبهای مرتبط مانند #kubernetes و #kubeadm را وارد کنید تا دیگران بتوانند به شما کمک کنند.
به دلیل عدم وجود RBAC، امکان اتصال یک گره(node) نسخه ۱.۱۸ به یک خوشه(cluster) نسخه ۱.۱۷ وجود ندارد.
در نسخه ۱.۱۸ kubeadm، در صورتی که گرهای با نام مشابه از قبل وجود داشته باشد، امکان جلوگیری از پیوستن آن به یک گره(node) در خوشه(cluster) اضافه شد. این امر مستلزم اضافه کردن RBAC برای کاربر bootstrap-token بود تا بتواند یک شیء گره(node) را دریافت کند.
با این حال، این مسئله باعث میشود که kubeadm join از نسخه ۱.۱۸ نتواند به خوشه(cluster) که توسط kubeadm نسخه ۱.۱۷ ایجاد شده است، بپیوندد.
برای حل مشکل، دو گزینه دارید:
دستور kubeadm init phase bootstrap-token را روی یک گره(node) control-plane با استفاده از kubeadm نسخه ۱.۱۸ اجرا کنید.
توجه داشته باشید که این دستور بقیه مجوزهای bootstrap-token را نیز فعال میکند.
یا
RBAC زیر را به صورت دستی با استفاده از kubectl apply -f ... اعمال کنید:
پرونده(فایل) اجرایی ebtables یا پرونده(فایل) اجرایی مشابه آن در حین نصب پیدا نشد.
اگر هنگام اجرای kubeadm init هشدارهای زیر را مشاهده کردید
[preflight] WARNING: ebtables not found in system path
[preflight] WARNING: ethtool not found in system path
پس ممکن است ebtables، ethtool یا یک پرونده(فایل) اجرایی مشابه را روی گره(node) خود نداشته باشید. میتوانید آنها را با دستورات زیر نصب کنید:
برای کاربران اوبونتو/دبیان، دستور apt install ebtables ethtool را اجرا کنید.
برای کاربران CentOS/Fedora، دستور yum install ebtables ethtool را اجرا کنید.
kubeadm در هنگام نصب در انتظار control plane میماند
اگر متوجه شدید که kubeadm init پس از چاپ خط زیر هنگ میکند:
[apiclient] Created API client, waiting for the control plane to become ready
این ممکن است ناشی از تعدادی از مشکلات باشد. رایجترین آنها عبارتند از:
مشکلات اتصال شبکه. قبل از ادامه، بررسی کنید که دستگاه شما اتصال کامل به شبکه دارد.
درایور cgroup مربوط به مجری کانتینر با درایور kubelet متفاوت است. برای درک نحوه پیکربندی صحیح آن، به پیکربندی درایور cgroup مراجعه کنید.
کانتینرهای control plane دچار crash loop یا هنگ شدهاند. میتوانید این مورد را با اجرای docker ps و بررسی هر کانتینر با اجرای docker logs بررسی کنید. برای سایر کانتینرهای زمان اجرا، به اشکالزدایی گرههای Kubernetes با crictl مراجعه کنید.
kubeadm هنگام حذف کانتینرهای مدیریتشده، مسدود میشود
اگر مجری کانتینر متوقف شود و هیچ کانتینری که توسط کوبرنتیز مدیریت میشود را حذف نکند، موارد زیر ممکن است رخ دهد:
sudo kubeadm reset
[preflight] Running pre-flight checks
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Removing kubernetes-managed containers
(block)
یک راه حل ممکن، راه اندازی مجدد مجری کانتینر و سپس اجرای مجدد kubeadm reset است. همچنین میتوانید از crictl برای اشکال زدایی وضعیت مجری کانتینر استفاده کنید. به اشکال زدایی گرههای کوبرنتیز با crictl مراجعه کنید.
پادها در وضعیتهای RunContainerError، CrashLoopBackOff یا Error
درست پس از kubeadm init نباید هیچ پادی در این حالتها وجود داشته باشد.
اگر پادها درست بعد از kubeadm init در یکی از این حالتها هستند، لطفاً یک مشکل را در مخزن kubeadm باز کنید. coredns (یا kube-dns) باید تا زمانی که افزونه شبکه را مستقر نکردهاید، در حالت Pending باشد.
اگر پس از نصب افزونه شبکه، Pods را در حالتهای RunContainerError، CrashLoopBackOff یا Error مشاهده کردید و هیچ اتفاقی برای coredns (یا kube-dns) نیفتاد، به احتمال زیاد افزونه Pod Network که نصب کردهاید به نحوی خراب است. ممکن است مجبور شوید امتیازات RBAC بیشتری به آن اعطا کنید یا از نسخه جدیدتری استفاده کنید. لطفاً مشکل را در ردیاب مشکلات ارائه دهندگان Pod Network ثبت کنید و مشکل را در آنجا بررسی کنید.
«coredns» در حالت Pending گیر کرده است
این انتظار میرود و بخشی از طراحی است. kubeadm مستقل از ارائهدهنده شبکه است، بنابراین مدیر باید افزونه شبکه pod را نصب کند. شما باید قبل از اینکه CoreDNS به طور کامل مستقر شود، یک افزونه Pod Network نصب کنید. از این رو، قبل از راهاندازی شبکه، در حالت «در انتظار» قرار دارد.
سرویسهای HostPort کار نمیکنند
قابلیتهای «HostPort» و «HostIP» بسته به ارائهدهندهی شبکهی پاد شما در دسترس هستند. لطفاً برای اطلاع از در دسترس بودن قابلیتهای «HostPort» و «HostIP» با نویسندهی افزونهی Pod Network تماس بگیرید.
ارائه دهندگان CNI مربوط به Calico، Canal و Flannel تأیید شدهاند که از HostPort پشتیبانی میکنند.
اگر ارائه دهنده شبکه شما از افزونه portmap CNI پشتیبانی نمیکند، ممکن است لازم باشد از ویژگی NodePort سرویسها استفاده کنید یا از HostNetwork=true استفاده کنید.
پادها از طریق سرویس IP خود قابل دسترسی نیستند
بسیاری از افزونههای شبکه هنوز hairpin mode را فعال نمیکنند که به پادها اجازه میدهد از طریق Service IP خود به خودشان دسترسی داشته باشند. این مشکلی مربوط به CNI است. لطفاً برای دریافت آخرین وضعیت پشتیبانی از حالت hairpin با ارائهدهنده افزونه شبکه تماس بگیرید.
اگر از VirtualBox (مستقیماً یا از طریق Vagrant) استفاده میکنید، باید مطمئن شوید که hostname -i یک نشانی(آدرس) IP قابل مسیریابی را برمیگرداند. به طور پیشفرض، اولین رابط به یک شبکه فقط میزبان غیرقابل مسیریابی متصل است. یک راه حل، تغییر /etc/hosts است، برای مثال به این Vagrantfile مراجعه کنید.
خطاهای گواهی TLS
خطای زیر نشاندهندهی عدم تطابق احتمالی گواهی است.
# kubectl get pods
Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
تأیید کنید که پرونده(فایل) $HOME/.kube/config حاوی یک گواهی معتبر است و در صورت لزوم یک گواهی را بازسازی کنید. گواهیهای موجود در پرونده(فایل) kubeconfig با کد base64 کدگذاری شدهاند. دستور base64 --decode میتواند برای رمزگشایی گواهی و دستور openssl x509 -text -noout میتواند برای مشاهده اطلاعات گواهی استفاده شود.
متغیر محیطی KUBECONFIG را با استفاده از دستور زیر غیرفعال کنید:
unset KUBECONFIG
یا آن را روی مکان پیشفرض KUBECONFIG تنظیم کنید:
exportKUBECONFIG=/etc/kubernetes/admin.conf
یک راه حل دیگر، بازنویسی kubeconfig موجود برای کاربر "admin" است:
به طور پیشفرض، kubeadm با استفاده از پیوند نمادین /var/lib/kubelet/pki/kubelet-client-current.pem که در /etc/kubernetes/kubelet.conf مشخص شده است، یک kubelet با چرخش خودکار گواهینامههای کلاینت پیکربندی میکند.
اگر این فرآیند چرخش با شکست مواجه شود، ممکن است خطاهایی مانند x509: certificate has expired or is not yet valid در لاگهای kube-apiserver مشاهده کنید. برای رفع مشکل، باید این مراحل را دنبال کنید:
از پروندههای /etc/kubernetes/kubelet.conf و /var/lib/kubelet/pki/kubelet-client* پشتیبان تهیه کرده و آنها را از گرهی خراب حذف کنید.
از یک گره control plane فعال در خوشه(cluster) ای که /etc/kubernetes/pki/ca.key دارد، دستور kubeadm kubeconfig user --org system:nodes --client-name system:node:$NODE > kubelet.conf را اجرا کنید. $NODE باید روی نام گره(node) خراب موجود در خوشه(cluster) تنظیم شود. kubelet.conf حاصل را به صورت دستی تغییر دهید تا نام خوشه(cluster) و نقطه پایانی سرور تنظیم شود، یا kubeconfig user --config را به آن بدهید (به ایجاد پروندههای kubeconfig برای کاربران اضافی مراجعه کنید). اگر خوشه(cluster) شما ca.key را ندارد، باید گواهیهای تعبیه شده در kubelet.conf را به صورت خارجی امضا کنید.
پرونده(فایل) kubelet.conf حاصل را در /etc/kubernetes/kubelet.conf روی گرهی خرابشده کپی کنید.
Kubelet (systemctl restart kubelet) را روی گره(node) خرابشده مجدداً راهاندازی کنید و منتظر بمانید تا /var/lib/kubelet/pki/kubelet-client-current.pem دوباره ایجاد شود.
پرونده(فایل) kubelet.conf را به صورت دستی ویرایش کنید تا به گواهیهای کلاینت kubelet چرخانده شده اشاره کند، برای این کار client-certificate-data و client-key-data را با موارد زیر جایگزین کنید:
مطمئن شوید که گره(node) به حالت «آماده» (Ready) درآمده است.
کارت شبکه پیشفرض هنگام استفاده از flannel به عنوان شبکه پاد در Vagrant
خطای زیر ممکن است نشان دهد که مشکلی در شبکه پاد وجود دارد:
Error from server (NotFound): the server could not find the requested resource
اگر از flannel به عنوان شبکه pod در Vagrant استفاده میکنید، باید نام رابط پیشفرض flannel را مشخص کنید.
Vagrant معمولاً دو رابط به همه ماشینهای مجازی اختصاص میدهد. رابط اول که به همه میزبانها نشانی IP 10.0.2.15 اختصاص داده شده است، برای ترافیک خارجی است که NAT میشود.
این ممکن است منجر به مشکلاتی در flannel شود، که به طور پیشفرض روی اولین رابط روی یک میزبان قرار میگیرد.
این امر باعث میشود همه میزبانها فکر کنند که نشانی IP عمومی یکسانی دارند. برای جلوگیری از این،
پرچم --face eth1 را به flannel ارسال کنید تا رابط دوم انتخاب شود.
IP غیر عمومی مورد استفاده برای کانتینرها
در برخی شرایط، دستورات kubectl logs و kubectl run ممکن است در یک خوشه(cluster) با عملکرد عادی، خطاهای زیر را نشان دهند:
Error from server: Get https://10.19.0.41:10250/containerLogs/default/mysql-ddc65b868-glc5m/mysql: dial tcp 10.19.0.41:10250: getsockopt: no route to host
این ممکن است به دلیل استفاده کوبرنتیز از یک IP باشد که نمیتواند با IP های دیگر در زیرشبکه به ظاهر یکسان ارتباط برقرار کند، احتمالاً به دلیل سیاست ارائه دهنده دستگاه.
DigitalOcean یک IP عمومی به eth0 و همچنین یک IP خصوصی برای استفاده داخلی به عنوان لنگر برای ویژگی IP شناور خود اختصاص میدهد، اما kubelet دومی را به جای IP عمومی به عنوان IP داخلی گره(node) انتخاب میکند.
برای بررسی این سناریو به جای ifconfig از ip addr show استفاده کنید زیرا ifconfig نشانی(آدرس) IP مستعار متخلف را نمایش نمیدهد. به عنوان یک جایگزین، یک نقطه پایانی API مخصوص DigitalOcean امکان جستجوی IP لنگر را از سرور مجازی فراهم میکند:
راه حل این است که با استفاده از --node-ip به kubelet بگویید از کدام IP استفاده کند. هنگام استفاده از DigitalOcean، در صورت تمایل به استفاده از شبکه خصوصی اختیاری، میتواند IP عمومی (اختصاص داده شده به eth0) یا IP خصوصی (اختصاص داده شده به eth1) باشد. برای این کار میتوان از بخش kubeletExtraArgs از ساختار kubeadmNodeRegistrationOptions استفاده کرد.
سپس kubelet را مجدداً راه اندازی کنید:
systemctl daemon-reload
systemctl restart kubelet
پادهای coredns دارای وضعیت CrashLoopBackOff یا Error هستند
اگر گرههایی دارید که SELinux را با نسخه قدیمیتر Docker اجرا میکنند، ممکن است با سناریویی مواجه شوید که در آن پادهای coredns شروع به کار نمیکنند. برای حل این مشکل، میتوانید یکی از گزینههای زیر را امتحان کنید:
پرونده استقرار coredns را تغییر دهید تا allowPrivilegeEscalation بر روی true تنظیم شود:
kubectl -n kube-system get deployment coredns -o yaml | \
sed 's/allowPrivilegeEscalation: false/allowPrivilegeEscalation: true/g' | \
kubectl apply -f -
یکی دیگر از دلایل بروز خطای «CrashLoopBackOff» در CoreDNS زمانی است که یک CoreDNS Pod مستقر در کوبرنتیز یک حلقه را تشخیص دهد. چندین راه حل برای جلوگیری از تلاش کوبرنتیز برای راهاندازی مجدد CoreDNS Pod هر بار که CoreDNS حلقه را تشخیص داده و خارج میشود، در دسترس هستند.
Caution:
غیرفعال کردن SELinux یا تنظیم allowPrivilegeEscalation روی true میتواند امنیت خوشه(cluster) شما را به خطر بیندازد.
پادهای etcd مرتباً مجدداً راهاندازی میشوند
اگر با خطای زیر مواجه شدید:
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "process_linux.go:110: decoding init error from pipe caused \"read parent: connection reset by peer\""
این مشکل در صورتی ظاهر میشود که CentOS 7 را با Docker 1.13.1.84 اجرا کنید.
این نسخه از Docker میتواند از اجرای kubelet در کانتینر etcd جلوگیری کند.
ارسال لیستی از مقادیر جدا شده با ویرگول به مولفه های داخل پرچم --component-extra-args امکانپذیر نیست.
پرچمهای kubeadm init مانند --component-extra-args به شما امکان میدهند مولفههای سفارشی را به یک جزء control plane مانند kube-apiserver ارسال کنید. با این حال، این مکانیسم به دلیل نوع دادهای که برای تجزیه مقادیر استفاده میشود (mapStringString) محدود است.
اگر تصمیم دارید مولفه ای را ارسال کنید که از چندین مقدار جدا شده با ویرگول مانند
--apiserver-extra-args "enable-admission-plugins=LimitRanger,NamespaceExists" پشتیبانی میکند، این پرچم با
flag: malformed pair, expect string=string با شکست مواجه خواهد شد. این اتفاق میافتد زیرا لیست مولفهها برای
--apiserver-extra-args انتظار جفتهای key=value را دارد و در این حالت NamespacesExists به عنوان کلیدی در نظر گرفته میشود که مقداری از آن کم است.
به عنوان یک روش جایگزین، میتوانید جفتهای key=value را به این صورت از هم جدا کنید:
--apiserver-extra-args "enable-admission-plugins=LimitRanger,enable-admission-plugins=NamespaceExists"
اما این باعث میشود که کلید enable-admission-plugins فقط مقدار NamespaceExists را داشته باشد.
kube-proxy قبل از مقداردهی اولیه گره(node) توسط cloud-controller-manager برنامهریزی شده است
در سناریوهای ارائه دهنده ابر، kube-proxy میتواند قبل از اینکه cloud-controller-manager نشانیهای گره(node) را مقداردهی اولیه کند، روی گرههای کارگر جدید برنامهریزی شود. این باعث میشود kube-proxy نتواند نشانی(آدرس) IP گره(node) را به درستی دریافت کند و تأثیرات جانبی بر عملکرد پروکسی که متعادلکنندههای بار را مدیریت میکند، داشته باشد.
خطای زیر در kube-proxy Pods قابل مشاهده است:
server.go:610] Failed to retrieve node IP: host IP unknown; known addresses: []
proxier.go:340] invalid nodeIP, initializing kube-proxy with 127.0.0.1 as nodeIP
یک راه حل شناخته شده، وصله کردن kube-proxy DaemonSet است تا امکان زمانبندی آن روی گرههای control plane صرف نظر از شرایط آنها فراهم شود و تا زمانی که شرایط محافظت اولیه آنها کاهش یابد، از گرههای دیگر دور نگه داشته شود:
در توزیعهای لینوکس مانند Fedora CoreOS یا Flatcar Container Linux، پوشه(folder) /usr به عنوان یک فایل سیستم فقط خواندنی نصب میشود. برای پشتیبانی از flex-volume، اجزای کوبرنتیز مانند kubelet و kube-controller-manager از مسیر پیشفرض /usr/libexec/kubernetes/kubelet-plugins/volume/exec/ استفاده میکنند، با این حال پوشه(folder) flex-volume باید قابل نوشتن باشد تا این ویژگی کار کند.
Note:
FlexVolume در نسخه کوبرنتیز v1.23 منسوخ شد.
برای حل این مشکل، میتوانید پوشه(folder) flex-volume را با استفاده از kubeadm پیکربندی کنید. پرونده(فایل) پیکربندی.
در گره(node) کنترل اصلی (که با استفاده از kubeadm init ایجاد شده است)، پرونده(فایل) زیر را با استفاده از --config ارسال کنید:
به عنوان یک روش جایگزین، میتوانید /etc/fstab را تغییر دهید تا mount /usr قابل نوشتن شود، اما لطفاً توجه داشته باشید که این کار، یک اصل طراحی توزیع لینوکس را تغییر میدهد.
برنامه ارتقاء kubeadm پیام خطای « context deadline exceeded» را چاپ میکند.
این پیام خطا هنگام ارتقاء یک خوشه(cluster) کوبرنتیز با kubeadm در صورت اجرای یک etcd خارجی نشان داده میشود. این یک اشکال بحرانی نیست و به این دلیل اتفاق میافتد که نسخههای قدیمیتر kubeadm بررسی نسخه را روی خوشه(cluster) etcd خارجی انجام میدهند. میتوانید با kubeadm upgrade apply ... ادامه دهید.
این مشکل از نسخه ۱.۱۹ برطرف شده است.
kubeadm reset «/var/lib/kubelet» را از حالت وصل خارج میکند
اگر /var/lib/kubelet در حالت متصل باشد، انجام kubeadm reset عملاً آن را از حالت متصل خارج میکند.
برای حل این مشکل، پس از انجام عملیات kubeadm reset، پوشه(folder) /var/lib/kubelet را دوباره متصل کنید.
این یک پسرفت است که در kubeadm نسخه ۱.۱۵ معرفی شد. این مشکل در نسخه ۱.۲۰ برطرف شده است.
نمیتوان از سرور متریک به صورت امن در خوشه(cluster) kubeadm استفاده کرد.
در یک خوشه(cluster) kubeadm، میتوان با ارسال --kubelet-insecure-tls به metrics-server به صورت ناامن از آن استفاده کرد. این روش برای خوشه(cluster) های عملیاتی توصیه نمیشود.
اگر میخواهید از TLS بین سرور metrics و kubelet استفاده کنید، مشکلی وجود دارد، زیرا kubeadm یک گواهی سرویس خودامضا برای kubelet مستقر میکند. این میتواند باعث خطاهای زیر در سمت سرور metrics شود:
x509: certificate signed by unknown authority
x509: certificate is valid for IP-foo not IP-bar
به دلیل تغییر نکردن هش etcd، ارتقا با شکست مواجه میشود
فقط برای ارتقاء یک گره control plane با پرونده(فایل) دودویی(باینری) kubeadm نسخه ۱.۲۸.۳ یا بالاتر، که در حال حاضر توسط نسخههای kubeadm نسخههای ۱.۲۸.۰، ۱.۲۸.۱ یا ۱.۲۸.۲ مدیریت میشود، قابل اجرا است.
در اینجا پیام خطایی که ممکن است با آن مواجه شوید آمده است:
[upgrade/etcd] Failed to upgrade etcd: couldn't upgrade control plane. kubeadm has tried to recover everything into the earlier state. Errors faced: static Pod hash for component etcd on Node kinder-upgrade-control-plane-1 did not change after 5m0s: timed out waiting for the condition
[upgrade/etcd] Waiting for previous etcd to become available
I0907 10:10:09.109104 3704 etcd.go:588] [etcd] attempting to see if all cluster endpoints ([https://172.17.0.6:2379/ https://172.17.0.4:2379/ https://172.17.0.3:2379/]) are available 1/10
[upgrade/etcd] Etcd was rolled back and is now available
static Pod hash for component etcd on Node kinder-upgrade-control-plane-1 did not change after 5m0s: timed out waiting for the condition
couldn't upgrade control plane. kubeadm has tried to recover everything into the earlier state. Errors faced
k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade.rollbackOldManifests
cmd/kubeadm/app/phases/upgrade/staticpods.go:525
k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade.upgradeComponent
cmd/kubeadm/app/phases/upgrade/staticpods.go:254
k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade.performEtcdStaticPodUpgrade
cmd/kubeadm/app/phases/upgrade/staticpods.go:338
...
پیام خطایی که ممکن است با آن مواجه شوید این است: دلیل این خطا این است که نسخههای آسیبدیده یک پرونده(فایل) تنظیمات etcd با پیشفرضهای ناخواسته در PodSpec تولید میکنند. این منجر به ایجاد تفاوت در مقایسه تنظیمات میشود و kubeadm انتظار تغییر در هش Pod را دارد، اما kubelet هرگز هش را بهروزرسانی نمیکند.
اگر این مشکل را در خوشه(cluster) خود مشاهده کردید، دو راه برای حل آن وجود دارد:
ارتقاء etcd را میتوان با استفاده از دستور زیر بین نسخههای آسیبدیده و نسخه ۱.۲۸.۳ (یا بالاتر) نادیده گرفت:
اطلاعات بیشتر در مورد این اشکال را میتوانید در ردیابی مشکل بیابید.
3.3 - راهاندازی خوشه etcd با قابلیت دسترسی بالا با kubeadm
به طور پیشفرض، kubeadm یک نمونه etcd محلی را روی هر گره(node) control plane اجرا میکند.
همچنین میتوان با خوشه(cluster) etcd به عنوان خارجی رفتار کرد و نمونههای etcd را روی میزبانهای جداگانه آمادهسازی کرد. تفاوتهای بین این دو رویکرد در صفحه گزینههایی برای توپولوژی با دسترسی بالا پوشش داده شده است.
این وظیفه، فرآیند ایجاد یک خوشه خارجی etcd با دسترسی بالا از سه عضو را بررسی میکند که میتوانند توسط kubeadm در طول ایجاد خوشه مورد استفاده قرار گیرند.
Before you begin
سه میزبان که میتوانند از طریق پورتهای TCP 2379 و 2380 با یکدیگر ارتباط برقرار کنند. این سند این پورتهای پیشفرض را در نظر گرفته است. با این حال، آنها از طریق پرونده(فایل) پیکربندی kubeadm قابل تنظیم هستند.
هر میزبان باید systemd و یک پوسته سازگار با bash نصب شده داشته باشد.
هر میزبان باید به رجیستری container image کوبرنتیز (registry.k8s.io) دسترسی داشته باشد یا پرونده image از etcd مورد نیاز را با استفاده از kubeadm config images list/pull فهرست/دریافت کند. این راهنما نمونههای etcd را به عنوان پادهای استاتیک که توسط یک kubelet مدیریت میشود، تنظیم میکند.
برخی زیرساختها برای کپی کردن پروندهها بین میزبانها. به عنوان مثال ssh و scp میتوانند این نیاز را برآورده کنند.
راهاندازی خوشه
رویکرد کلی این است که تمام گواهینامهها روی یک گره(node) تولید شوند و فقط پروندههای لازم بین گرههای دیگر توزیع شوند.
Note:
kubeadm شامل تمام ابزارهای رمزنگاری لازم برای تولید گواهیهای شرح داده شده در زیر است؛ برای این مثال به هیچ ابزار رمزنگاری دیگری نیاز نیست.
Note:
مثالهای زیر از نشانیهای IPv4 استفاده میکنند، اما میتوانید kubeadm، kubelet و etcd را نیز برای استفاده از نشانیهای IPv6 پیکربندی کنید. Dual-stack توسط برخی از گزینههای Kubernetes پشتیبانی میشود، اما توسط etcd پشتیبانی نمیشود. برای جزئیات بیشتر در مورد پشتیبانی از Dual-stack در Kubernetes، به پشتیبانی Dual-stack با kubeadm مراجعه کنید.
kubelet را طوری پیکربندی کنید که به عنوان مدیر سرویس برای etcd عمل کند.
Note:
شما باید این کار را روی هر میزبانی که etcd باید در آن اجرا شود، انجام دهید.
از آنجایی که etcd ابتدا ایجاد شده است، شما باید با ایجاد یک پرونده واحد جدید که اولویت بالاتری نسبت به پرونده واحد kubelet ارائه شده توسط kubeadm دارد، اولویت سرویس را لغو کنید.
cat << EOF > /etc/systemd/system/kubelet.service.d/kubelet.conf
# Replace "systemd" with the cgroup driver of your container runtime. The default value in the kubelet is "cgroupfs".
# Replace the value of "containerRuntimeEndpoint" for a different container runtime if needed.
#
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authentication:
anonymous:
enabled: false
webhook:
enabled: false
authorization:
mode: AlwaysAllow
cgroupDriver: systemd
address: 127.0.0.1
containerRuntimeEndpoint: unix:///var/run/containerd/containerd.sock
staticPodPath: /etc/kubernetes/manifests
EOFcat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf
[Service]
ExecStart=
ExecStart=/usr/bin/kubelet --config=/etc/systemd/system/kubelet.service.d/kubelet.conf
Restart=always
EOFsystemctl daemon-reload
systemctl restart kubelet
وضعیت kubelet را بررسی کنید تا مطمئن شوید که در حال اجرا است.
systemctl status kubelet
ایجاد پروندههای پیکربندی برای kubeadm.
با استفاده از اسکریپت زیر، یک پرونده پیکربندی kubeadm برای هر میزبانی که قرار است یک عضو etcd روی آن اجرا شود، ایجاد کنید.
# Update HOST0, HOST1 and HOST2 with the IPs of your hostsexportHOST0=10.0.0.6
exportHOST1=10.0.0.7
exportHOST2=10.0.0.8
# Update NAME0, NAME1 and NAME2 with the hostnames of your hostsexportNAME0="infra0"exportNAME1="infra1"exportNAME2="infra2"# Create temp directories to store files that will end up on other hostsmkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/
HOSTS=(${HOST0}${HOST1}${HOST2})NAMES=(${NAME0}${NAME1}${NAME2})for i in "${!HOSTS[@]}"; doHOST=${HOSTS[$i]}NAME=${NAMES[$i]}cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml
---
apiVersion: "kubeadm.k8s.io/v1beta4"
kind: InitConfiguration
nodeRegistration:
name: ${NAME}
localAPIEndpoint:
advertiseAddress: ${HOST}
---
apiVersion: "kubeadm.k8s.io/v1beta4"
kind: ClusterConfiguration
etcd:
local:
serverCertSANs:
- "${HOST}"
peerCertSANs:
- "${HOST}"
extraArgs:
- name: initial-cluster
value: ${NAMES[0]}=https://${HOSTS[0]}:2380,${NAMES[1]}=https://${HOSTS[1]}:2380,${NAMES[2]}=https://${HOSTS[2]}:2380
- name: initial-cluster-state
value: new
- name: name
value: ${NAME}
- name: listen-peer-urls
value: https://${HOST}:2380
- name: listen-client-urls
value: https://${HOST}:2379
- name: advertise-client-urls
value: https://${HOST}:2379
- name: initial-advertise-peer-urls
value: https://${HOST}:2380
EOFdone
مرجع صدور گواهی را ایجاد کنید.
اگر از قبل یک CA دارید، تنها کاری که باید انجام دهید کپی کردن پروندههای crt و key مربوط به CA در /etc/kubernetes/pki/etcd/ca.crt و /etc/kubernetes/pki/etcd/ca.key است. پس از کپی کردن این پروندهها، به مرحله بعدی، "ایجاد گواهینامه برای هر عضو" بروید.
اگر از قبل CA ندارید، این دستور را روی $HOST0 (جایی که پروندههای پیکربندی kubeadm را ایجاد کردهاید) اجرا کنید.
kubeadm init phase certs etcd-ca
این دو پرونده را ایجاد میکند:
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key
ایجاد گواهی برای هر عضو
kubeadm init phase certs etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST2}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST2}/kubeadmcfg.yaml
cp -R /etc/kubernetes/pki /tmp/${HOST2}/
# cleanup non-reusable certificatesfind /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete
kubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
cp -R /etc/kubernetes/pki /tmp/${HOST1}/
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete
kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
# No need to move the certs because they are for HOST0# clean up certs that should not be copied off this hostfind /tmp/${HOST2} -name ca.key -type f -delete
find /tmp/${HOST1} -name ca.key -type f -delete
کپی گواهینامهها و پیکربندیهای kubeadm.
گواهینامهها ایجاد شدهاند و اکنون باید به میزبانهای مربوطه منتقل شوند.
حالا که گواهینامهها و پیکربندیها آماده شدهاند، وقت آن رسیده که تنظیمات را ایجاد کنیم. روی هر میزبان، دستور kubeadm را اجرا کنید تا یک تنظیمات ثابت برای etcd ایجاد شود.
root@HOST0 $ kubeadm init phase etcd local --config=/tmp/${HOST0}/kubeadmcfg.yaml
root@HOST1 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml
root@HOST2 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml
اختیاری: سلامت خوشه را بررسی کنید.
اگر etcdctl در دسترس نباشد، میتوانید این ابزار را درون یک container image اجرا کنید. شما میتوانید این کار را مستقیماً با مجری کانتینر خود با استفاده از ابزاری مانند crictl run انجام دهید و نه از طریق کوبرنتیز.
مقدار ${HOST0} را برابر با نشانی(آدرس) IP میزبانی که در حال آزمایش آن هستید، قرار دهید.
What's next
زمانی که یک خوشه etcd با ۳ عضو فعال داشتید، میتوانید با استفاده از روش etcd خارجی با kubeadm به راهاندازی یک control plane با دسترسیپذیری بالا ادامه دهید.
3.4 - پیکربندی هر kubelet در خوشه(cluster) شما با استفاده از kubeadm
Note: Dockershim has been removed from the Kubernetes project as of release 1.24. Read the Dockershim Removal FAQ for further details.
FEATURE STATE:Kubernetes v1.11 [stable]
چرخه حیات ابزار رابط خط فرمان kubeadm از kubelet که یک سرویس (daemon) است که روی هر گره(node) در خوشه(cluster) کوبرنتیز اجرا میشود، جدا شده است. ابزار رابط خط فرمان kubeadm هنگام راهاندازی یا ارتقاء کوبرنتیز توسط کاربر اجرا میشود، در حالی که kubelet همیشه در پسزمینه در حال اجرا است.
از آنجایی که kubelet یک سرویس (daemon) است، باید توسط نوعی سیستم init یا مدیر سرویس نگهداری شود. وقتی kubelet با استفاده از DEBها یا RPMها نصب میشود، systemd برای مدیریت kubelet پیکربندی میشود. میتوانید به جای آن از یک مدیر سرویس متفاوت استفاده کنید، اما باید آن را به صورت دستی پیکربندی کنید.
برخی از جزئیات پیکربندی kubelet باید در تمام kubelet های موجود در خوشه(cluster) یکسان باشد، در حالی که سایر جنبههای پیکربندی باید بر اساس هر kubelet تنظیم شوند تا با ویژگیهای مختلف یک ماشین خاص (مانند سیستم عامل، فضای ذخیرهسازی و شبکه) سازگار شوند. شما میتوانید پیکربندی kubelet های خود را به صورت دستی مدیریت کنید، اما kubeadm اکنون یک نوع API از نوع KubeletConfiguration را برای مدیریت پیکربندیهای kubelet خود به صورت مرکزی ارائه میدهد.
الگوهای پیکربندی Kubelet
بخشهای زیر الگوهایی را برای پیکربندی kubelet شرح میدهند که با استفاده از kubeadm ساده شدهاند، نه اینکه پیکربندی kubelet را برای هر گره(node) به صورت دستی مدیریت کنند.
انتشار پیکربندی سطح خوشه به هر kubelet
شما میتوانید مقادیر پیشفرض را برای استفاده توسط دستورات kubeadm init و kubeadm join به kubelet ارائه دهید. مثالهای جالب شامل استفاده از یک مجری کانتینر متفاوت یا تنظیم زیرشبکه پیشفرض مورد استفاده توسط سرویسها است.
اگر میخواهید سرویسهای شما از زیرشبکه 10.96.0.0/12 به عنوان پیشفرض برای سرویسها استفاده کنند، میتوانید پارامتر --service-cidr را به kubeadm ارسال کنید:
kubeadm init --service-cidr 10.96.0.0/12
اکنون IPهای مجازی برای سرویسها از این زیرشبکه اختصاص داده میشوند. همچنین باید نشانی(آدرس) DNS مورد استفاده توسط kubelet را با استفاده از پرچم --cluster-dns تنظیم کنید. این تنظیم باید برای هر kubelet روی هر مدیر و گره(node) در خوشه(cluster) یکسان باشد. kubelet یک شیء API نسخهبندی شده و ساختار یافته ارائه میدهد که میتواند اکثر پارامترها را در kubelet پیکربندی کند و این پیکربندی را به هر kubelet در حال اجرا در خوشه(cluster) ارسال کند. این شیء KubeletConfiguration نامیده میشود. KubeletConfiguration به کاربر اجازه میدهد پرچمهایی مانند نشانی(آدرس)های IP DNS خوشه(cluster) را که به صورت لیستی از مقادیر با کلید camelCased بیان میشوند، مشخص کند، که با مثال زیر نشان داده شده است:
برای جزئیات بیشتر در مورد KubeletConfiguration، به این بخش نگاهی بیندازید.
ارائه جزئیات پیکربندی مختص به هر نمونه
برخی از میزبانها به دلیل تفاوت در سختافزار، سیستم عامل، شبکه یا سایر پارامترهای خاص میزبان، به پیکربندیهای خاصی برای kubelet نیاز دارند. لیست زیر چند نمونه را ارائه میدهد.
مسیر پرونده DNS resolution، همانطور که توسط پرچم پیکربندی --resolv-conf در kubelet مشخص شده است، ممکن است در بین سیستم عاملها یا بسته به اینکه آیا از systemd-resolved استفاده میکنید یا خیر، متفاوت باشد. اگر این مسیر اشتباه باشد، DNS resolution در گرهای که kubelet آن به طور نادرست پیکربندی شده است، با شکست مواجه خواهد شد.
شیء گره(node) API با نام .metadata.name به طور پیشفرض روی نام میزبان دستگاه تنظیم شده است، مگر اینکه از یک ارائهدهنده ابری استفاده کنید. در صورت نیاز به تعیین نام گرهای متفاوت از نام میزبان دستگاه، میتوانید از پرچم --hostname-override برای لغو رفتار پیشفرض استفاده کنید.
در حال حاضر، kubelet نمیتواند به طور خودکار درایور cgroup مورد استفاده توسط مجری کانتینر را تشخیص دهد، اما مقدار --cgroup-driver باید با درایور cgroup مورد استفاده توسط مجری کانتینر مطابقت داشته باشد تا سلامت kubelet تضمین شود.
برای مشخص کردن مجری کانتینر، باید نقطه پایانی آن را با پرچم --container-runtime-endpoint=<path> تنظیم کنید.
میتوان kubelet را طوری پیکربندی کرد که kubeadm آن را اجرا کند اگر یک شیء API سفارشی KubeletConfiguration با یک پرونده(فایل) پیکربندی مانند kubeadm ... --config some-config-file.yaml ارسال شود.
با فراخوانی kubeadm config print init-defaults --component-configs KubeletConfiguration میتوانید تمام مقادیر پیشفرض این ساختار را مشاهده کنید.
همچنین میتوان وصلههای مخصوص هر نمونه را روی «KubeletConfiguration» پایه اعمال کرد. برای جزئیات بیشتر، نگاهی به سفارشیسازی kubelet بیندازید.
گردش کار هنگام استفاده از kubeadm init
وقتی kubeadm init را فراخوانی میکنید، پیکربندی kubelet در مسیر /var/lib/kubelet/config.yaml روی دیسک ذخیره میشود و همچنین در یک نقشه پیکربندی kubelet-config در فضای نام kube-system خوشه(cluster) آپلود میشود. یک پرونده(فایل) پیکربندی kubelet همچنین در مسیر /etc/kubernetes/kubelet.conf با پیکربندی پایه در سطح خوشه(cluster) برای همه kubelet های خوشه(cluster) نوشته میشود. این پرونده(فایل) پیکربندی به گواهیهای کلاینت اشاره میکند که به kubelet اجازه میدهد با سرور API ارتباط برقرار کند. این امر نیاز به انتشار پیکربندی سطح خوشه(cluster) به هر kubelet را برطرف میکند.
برای پرداختن به الگوی دومِ ارائه جزئیات پیکربندی مختص به نمونه، kubeadm یک پرونده(فایل) محیطی را در /var/lib/kubelet/kubeadm-flags.env مینویسد که شامل فهرستی از پرچمهایی است که باید هنگام شروع به kubelet منتقل شوند. پرچمها در پرونده(فایل) به این شکل ارائه میشوند:
علاوه بر پرچمهای مورد استفاده هنگام شروع kubelet، این پرونده(فایل) همچنین شامل پارامترهای پویا مانند درایور cgroup و اینکه آیا از یک سوکت مجری کانتینر متفاوت (--cri-socket) استفاده شود یا خیر، میباشد.
پس از مرتبسازی این دو پرونده(فایل) روی دیسک، kubeadm تلاش میکند دو دستور زیر را اجرا کند، البته اگر از systemd استفاده میکنید:
اگر بارگذاری مجدد و راهاندازی مجدد موفقیتآمیز باشد، گردش کار عادی kubeadm init ادامه مییابد.
گردش کار هنگام استفاده از kubeadm join
وقتی kubeadm join را اجرا میکنید، kubeadm از اعتبارنامهی Bootstrap Token برای انجام یک راه انداز TLS استفاده میکند که اعتبارنامهی مورد نیاز برای دانلود نقشهی پیکربندی kubelet-config را دریافت کرده و آن را در /var/lib/kubelet/config.yaml مینویسد. پرونده(فایل) محیط پویا دقیقاً به همان روشی که kubeadm init تولید میشود، تولید میشود.
در مرحله بعد، kubeadm دو دستور زیر را برای بارگذاری پیکربندی جدید در kubelet اجرا میکند:
پس از اینکه kubelet پیکربندی جدید را بارگذاری کرد، kubeadm پرونده(فایل) KubeConfig را مینویسد که شامل یک گواهی CA و راه انداز Token است. این پروندهها توسط kubelet برای انجام TLS راه انداز و دریافت یک اعتبارنامه منحصر به فرد استفاده میشوند که در /etc/kubernetes/kubelet.conf ذخیره میشود.
وقتی پرونده(فایل) /etc/kubernetes/kubelet.conf نوشته میشود، kubelet اجرای TLS راه انداز را به پایان رسانده است. Kubeadm پس از تکمیل TLS راه انداز ، پرونده(فایل) /etc/kubernetes/bootstrap-kubelet.conf را حذف میکند.
پرونده نصبی kubelet برای systemd
kubeadm به همراه پیکربندی نحوهی اجرای kubelet توسط systemd ارائه میشود.
توجه داشته باشید که دستور kubeadm CLI (فایل)هرگز به این پرونده drop-in دست نمیزند.
این پرونده پیکربندی که توسط بسته kubeadm نصب شده است، در مسیر /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf نوشته شده و توسط systemd استفاده میشود. این پرونده، بسته اصلی kubelet.service را تکمیل میکند.
اگر میخواهید این مورد را بیشتر تغییر دهید، میتوانید یک پوشه به نشانی(آدرس) /etc/systemd/system/kubelet.service.d/ (نه /usr/lib/systemd/system/kubelet.service.d/) ایجاد کنید و تنظیمات شخصیسازی خود را در یک پرونده(فایل) در آنجا قرار دهید. برای مثال، میتوانید یک پرونده(فایل) محلی جدید به نشانی(آدرس) /etc/systemd/system/kubelet.service.d/local-overrides.conf اضافه کنید تا تنظیمات واحد پیکربندی شده توسط kubeadm را تغییر دهید.
این چیزی است که احتمالاً در /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf خواهید یافت:
Note:
مطالب زیر فقط یک مثال هستند. اگر نمیخواهید از مدیر بسته استفاده کنید، راهنمای ذکر شده در بخش (بدون مدیر بسته) را دنبال کنید.
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generate at runtime, populating
# the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably,
# the user should use the .NodeRegistration.KubeletExtraArgs object in the configuration files instead.
# KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
این پرونده(فایل) مکانهای پیشفرض برای تمام پرونده(فایل) های مدیریتشده توسط kubeadm در kubelet را مشخص میکند.
پرونده(فایل) KubeConfig مورد استفاده برای TLS (فایل)راه انداز، پرونده /etc/kubernetes/bootstrap-kubelet.conf است، اما فقط در صورتی استفاده میشود که /etc/kubernetes/kubelet.conf وجود نداشته باشد.
پرونده(فایل) KubeConfig با هویت منحصر به فرد kubelet در مسیر /etc/kubernetes/kubelet.conf قرار دارد.
پرونده(فایل) حاوی ComponentConfig مربوط به kubelet در مسیر /var/lib/kubelet/config.yaml قرار دارد.
پرونده(فایل) محیط پویا که شامل KUBELET_KUBEADM_ARGS است، از /var/lib/kubelet/kubeadm-flags.env گرفته شده است.
پرونده(فایل) ای که میتواند شامل لغو پرچمهای مشخصشده توسط کاربر با KUBELET_EXTRA_ARGS باشد، از /etc/default/kubelet (برای DEBها) یا /etc/sysconfig/kubelet (برای RPMها) گرفته شده است. KUBELET_EXTRA_ARGS
آخرین پرونده(فایل) در زنجیره پرچمها است و در صورت وجود تنظیمات متناقض، بالاترین اولویت را دارد.
پرونده(فایل) های دودویی(باینری) و محتویات بستههای کوبرنتیز
بستههای DEB و RPM که با نسخههای کوبرنتیز ارائه میشوند عبارتند از:
Package name
Description
kubeadm
ابزار خط فرمان /usr/bin/kubeadm و پرونده نصبی kubelet را برای kubelet نصب میکند.
kubelet
(باینری)پرونده(فایل) دودویی /usr/bin/kubelet را نصب میکند.
kubectl
(باینری)پرونده(فایل) دودویی /usr/bin/kubectl را نصب میکند.
cri-tools
(باینری)پرونده(فایل) دودویی /usr/bin/crictl را از مخزن گیت cri-tools نصب میکند.
kubernetes-cni
(باینری)پرونده(فایل)های دودویی /opt/cni/bin را از مخزن plugins git نصب میکند.
4 - (cluster)مدیریت خوشه
4.1 - اجرای kubelet در حالت مستقل
این آموزش به شما نشان میدهد که چگونه یک نمونه مستقل از kubelet را اجرا کنید
شما ممکن است انگیزههای مختلفی برای اجرای یک kubelet مستقل داشته باشید
این آموزش با هدف آشنایی شما با کوبرنتیز تهیه شده است، حتی اگر تجربه زیادی با آن نداشته باشید. میتوانید این آموزش را دنبال کنید و در مورد راهاندازی گره، پادهای پایه (استاتیک) و نحوه مدیریت کانتینرها توسط کوبرنتیزاطلاعات کسب کنید
پس از دنبال کردن این آموزش، میتوانید از خوشه ای که دارای control plane برای مدیریت پادها و گرهها و انواع دیگر اشیاء است، استفاده کنید. به عنوان مثال،
Hello, minikube
همچنین میتوانید kubelet را در حالت مستقل اجرا کنید تا برای موارد استفاده در محیط عملیاتی مناسب باشد، مانند اجرای control plane برای یک خوشه (cluster) با قابلیت دسترسی بالا و استقرار انعطافپذیر. این آموزش جزئیات مورد نیاز برای اجرای یک control plane انعطافپذیر را پوشش نمیدهد
Objectives
cri-o و kubelet را روی یک سیستم لینوکس نصب کنید و آنها را به عنوان سرویسهای systemd اجرا کنید.
یک پاد (Pod) با اجرای nginx راهاندازی کنید که به درخواستهای روی پورت TCP 80 روی نشانی IP پاد گوش دهد.
یاد بگیرید که چگونه اجزای مختلف راهحل با یکدیگر تعامل دارند.
Caution:
پیکربندی kubelet که برای این آموزش استفاده شده است، از نظر طراحی ناامن است و نباید در محیط عملیاتی استفاده شود
Before you begin
دسترسی ادمین (root) به یک سیستم لینوکس که از systemd و iptables (یا nftables با شبیهسازی iptables) استفاده میکند
دسترسی به اینترنت برای دانلود اجزای مورد نیاز برای آموزش، مانند:
دسترسی به اینترنت برای دانلود اجزای مورد نیاز برای آموزش، مانند:
به طور پیشفرض، اگر حافظه swap روی یک گره شناسایی شود، kubelet شروع به کار نمیکند. این بدان معناست که swap باید غیرفعال شود یا توسط kubelet تحمل شود.
Note:
اگر kubelet را طوری پیکربندی کنید که swap را تحمل کند، kubelet همچنان Podها (و کانتینرهای موجود در آن Podها) را طوری پیکربندی میکند که از فضای swap استفاده نکنند. برای اینکه بفهمید Podها چگونه میتوانند از swap موجود استفاده کنند، میتوانید درباره مدیریت حافظه swap در گرههای لینوکس بیشتر بخوانید
اگر حافظه swap را فعال کردهاید، آن را غیرفعال کنید یا عبارت failSwapOn: false را به پرونده پیکربندی kubelet اضافه کنید
برای بررسی فعال بودن swap:
sudo swapon --show
اگر هیچ خروجی از دستور وجود نداشته باشد، حافظه swap از قبل غیرفعال شده است
برای غیرفعال کردن موقت swap:
sudo swapoff -a
برای اینکه این تغییر در طول راهاندازیهای مجدد پایدار بماند:
مطمئن شوید که swap بسته به نحوه پیکربندی آن در سیستم شما، در /etc/fstab یا systemd.swap غیرفعال باشد
فعال کردن ارسال بسته IPv4
برای بررسی اینکه آیا ارسال بسته IPv4 فعال است:
cat /proc/sys/net/ipv4/ip_forward
اگر خروجی «۱» باشد، از قبل فعال شده است. اگر خروجی «۰» باشد، مراحل بعدی را دنبال کنید
برای فعال کردن ارسال بسته IPv4، یک پرونده پیکربندی ایجاد کنید که پارامتر net.ipv4.ip_forward را روی 1 تنظیم کند:
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
EOF
Note: This section links to third party projects that provide functionality required by Kubernetes. The Kubernetes project authors aren't responsible for these projects, which are listed alphabetically. To add a project to this list, read the content guide before submitting a change. More information.
یک مجری کانتینر اجرا نصب کنید
آخرین نسخههای موجود از بستههای مورد نیاز را دانلود کنید (توصیه میشود).
بسته به توزیع لینوکس خاص شما، چندین [روش] برای نصب [https://github.com/cri o/cri o/blob/main/install.md] کانتینر CRI O در زمان اجرا وجود دارد. اگرچه CRI O استفاده از بستههای deb یا rpm را توصیه میکند، اما این آموزش از اسکریپت _static binary bundle_ پروژه CRI O Packaging (https://github.com/crio/packaging/blob/main/README.md) استفاده میکند، که هم برای سادهسازی فرآیند کلی و هم برای عدم وابستگی به توزیع مورد نظر است
این اسکریپت نرمافزارهای مورد نیاز اضافی، مانند cni-plugins برای شبکهسازی کانتینر، و crun و runc برای اجرای کانتینرها را نصب و پیکربندی میکند
این اسکریپت به طور خودکار معماری پردازنده سیستم شما (amd64 یا arm64) را تشخیص داده و آخرین نسخههای بستههای نرمافزاری را انتخاب و نصب میکند
مطمئن شوید که محدوده پیشفرض «زیرشبکه» (۱۰.۸۵.۰.۰/۱۶) با هیچ یک از شبکههای فعال شما همپوشانی ندارد. در صورت وجود همپوشانی، میتوانید پرونده را ویرایش کرده و آن را مطابق با آن تغییر دهید. پس از تغییر، سرویس را مجدداً راهاندازی کنید
دانلود و نصب kubelet
آخرین نسخه پایدار آخرین نسخه از kubelet را دریافت کنید
sudo tee /etc/kubernetes/kubelet.yaml <<EOF
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authentication:
webhook:
enabled: false # Do NOT use in production clusters!
authorization:
mode: AlwaysAllow # Do NOT use in production clusters!
enableServer: false
logging:
format: text
address: 127.0.0.1 # Restrict access to localhost
readOnlyPort: 10255 # Do NOT use in production clusters!
staticPodPath: /etc/kubernetes/manifests
containerRuntimeEndpoint: unix:///var/run/crio/crio.sock
EOF
Note:
از آنجا که شما در حال راهاندازی یک خوشه (cluster) عملیاتی نیستید، از HTTP ساده (readOnlyPort: 10255) برای کوئریهای احراز هویت نشده به API kubelet استفاده میکنید
برای اهداف این آموزش، وبهوک احراز هویت غیرفعال است و حالت مجوز روی «همیشه مجاز» تنظیم شده است. میتوانید برای پیکربندی صحیح kubelet در حالت مستقل در محیط خود، اطلاعات بیشتری در مورد حالتهای مجوز و احراز هویت وبهوک کسب کنید.
برای آشنایی با پورتهایی که اجزای کوبرنتیز از آنها استفاده میکنند، به درگاه ها و پروتکل ها مراجعه کنید.
پارامتر خط فرمان --kubeconfig عمداً در پرونده پیکربندی سرویس حذف شده است. این پارامتر مسیر پرونده [kubeconfig](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) را تعیین میکند که نحوه اتصال به سرور API را مشخص میکند و حالت سرور API را فعال میکند. حذف آن، حالت مستقل را فعال میکند.
در حالت مستقل، میتوانید پادها را با استفاده از تنظیمات پاد اجرا کنید. تنظیمات میتوانند یا در سیستم پرونده محلی باشند یا از طریق HTTP از یک منبع پیکربندی دریافت شوند.
ایجاد یک تنظیمات برای یک Pod:
cat <<EOF > static-web.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-web
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
EOF
پرونده تنظیمات static-web.yaml را در پوشه /etc/kubernetes/manifests رونوشت کنید.
این صفحه جنبههای اساسی استقرار یک kubelet در حالت مستقل را پوشش داد. اکنون آماده استقرار پادها و آزمایش قابلیتهای اضافی هستید.
توجه داشته باشید که در حالت مستقل، kubelet از دریافت پیکربندیهای پاد از control plane پشتیبانی نمیکند (زیرا هیچ اتصالی به control plane وجود ندارد).
همچنین نمیتوانید از ConfigMap یا Secret برای پیکربندی کانتینرها در یک پاد استاتیک استفاده کنید.
What's next
برای یادگیری نحوهی اجرای کوبرنتیز با یک control plane، Hello, minikube را دنبال کنید. ابزار minikube به شما کمک میکند تا یک خوشه ی تمرینی روی رایانهی خود راهاندازی کنید.
(cluster)سازوکاری برای ضمیمه کردن مجوز و سیاست به یک زیربخش از خوشه.
استفاده از چندین فضای نام اختیاری است.
این مثال نحوه استفاده از فضاهای نام کوبرنتیز برای تقسیمبندی خوشه (cluster) شما را نشان میدهد.
Before you begin
شما باید یک خوشه(Cluster) کوبرنتیز داشته باشید و ابزار خطِّ فرمان kubectl نیز برای برقراری ارتباط با خوشه شما پیکربندی شده باشد. توصیه میشود این آموزش را روی خوشهای با دستکم دو گره(Node) که بهعنوان میزبانهای control plane عمل نمیکنند اجرا کنید.
اگر هنوز خوشه ندارید، میتوانید با استفاده از
minikube
یکی بسازید یا از یکی از محیطهای آزمایشی کوبرنتیز زیر بهره ببرید:
به طور پیشفرض، یک خوشه (cluster) کوبرنتیز هنگام آمادهسازی خوشه (cluster)، یک فضای نام پیشفرض را نمونهسازی میکند تا مجموعه پیشفرض پادها، سرویسهاواستقرارها مورد استفاده توسط خوشه را در خود جای دهد.
با فرض اینکه یک خوشه (cluster) جدید دارید، میتوانید با انجام موارد زیر، فضاهای نام موجود را بررسی کنید:
kubectl get namespaces
NAME STATUS AGE
default Active 13m
ایجاد فضاهای نام جدید
برای این تمرین، دو فضای نام کوبرنتیز اضافی برای نگهداری محتوای خودایجاد خواهیم کرد.
بیایید سناریویی را تصور کنیم که در آن یک سازمان از یک خوشه (cluster) مشترک کوبرنتیز برای موارد استفاده توسعه و تولید استفاده میکند.
تیم توسعه میخواهد فضایی را در خوشه (cluster) حفظ کند که در آن بتوانند فهرست پادها، سرویسهاواستقرارهایی را که برای ساخت و اجرای برنامه خود استفاده میکنند، مشاهده کنند. در این فضا، منابع کوبرنتیز میآیند و میروند و محدودیتهای مربوط به اینکه چه کسی میتواند یا نمیتواند منابع را تغییر دهد، کاهش مییابد تا توسعه چابک امکانپذیر شود.
تیم عملیات مایل است فضایی را در خوشه (cluster) حفظ کند که در آن بتواند رویههای سختگیرانهای را در مورد اینکه چه کسی میتواند یا نمیتواند مجموعه پادها، سرویسها و استقرارهایی را که وبگاه عملیاتی را اداره میکنند، دستکاری کند، اعمال کند.
یکی از الگوهایی که این سازمان میتواند دنبال کند، تقسیمبندی خوشه (cluster) کوبرنتیز به دو فضای نام است: «توسعه» و «تولید».
بیایید دو فضای نام جدید برای نگهداری کارمان ایجاد کنیم.
از پرونده namespace-dev.yaml که یک فضای نام development را توصیف میکند، استفاده کنید:
بهطور پیشفرض، دستورات بالا دو context را اضافه میکنند که در پرونده «.kube/config» ذخیره میشوند. اکنون میتوانید contextها را مشاهده کنید و بسته به فضای نامی که میخواهید با آن کار کنید، متناوب با دو context درخواستی جدید جایگزین کنید.
ما یک استقرار با اندازه رونوشت ۲ عدد پاد ایجاد کردهایم که پادی به نام snowflake را با یک کانتینر پایه که نام میزبان را ارائه میدهد، اجرا میکند.
kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
snowflake 2/2 2 2 2m
kubectl get pods -l app=snowflake
NAME READY STATUS RESTARTS AGE
snowflake-3968820950-9dgr8 1/1 Running 0 2m
snowflake-3968820950-vgc4n 1/1 Running 0 2m
و این عالی است، توسعهدهندگان میتوانند هر کاری که میخواهند انجام دهند و لازم نیست نگران تأثیرگذاری بر محتوا در فضای نام «تولید» باشند.
بیایید به فضای نام production برویم و نشان دهیم که چگونه منابع موجود در یک فضای نام از فضای نام دیگر پنهان میشوند.
kubectl config use-context prod
فضای نام production باید خالی باشد و دستورات زیر نباید چیزی را برگردانند.
kubectl get deployment
kubectl get pods
بخش تولید دوست دارد گاوها را اداره کند، پس بیایید چند گاوداری ایجاد کنیم.
kubectl create deployment cattle --image=registry.k8s.io/serve_hostname --replicas=5kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
cattle 5/5 5 5 10s
kubectl get pods -l app=cattle
NAME READY STATUS RESTARTS AGE
cattle-2263376956-41xy6 1/1 Running 0 34s
cattle-2263376956-kw466 1/1 Running 0 34s
cattle-2263376956-n4v97 1/1 Running 0 34s
cattle-2263376956-p5p3i 1/1 Running 0 34s
cattle-2263376956-sxpth 1/1 Running 0 34s
در این مرحله، باید مشخص شده باشد که منابعی که کاربران در یک فضای نام ایجاد میکنند، از فضای نام دیگر پنهان هستند.
با تکامل پشتیبانی از سیاست در کوبرنتیز، این سناریو را گسترش خواهیم داد تا نشان دهیم چگونه میتوانید قوانین مجوز متفاوتی را برای هر فضای نام ارائه دهید.
5 - مرجع
این بخش از مستندات کوبرنتیز شامل ارجاعات است.
مرجع API
واژهنامه - فهرستی جامع و استاندارد از اصطلاحات کوبرنتیز
kubeadm - ابزار خط فرمانی برای راهاندازی آسان یک خوشه ایمن کوبرنتیز.
اجزا
kubelet - عامل اصلیای که روی هر گره اجرا میشود. kubelet مجموعهای از PodSpecها را میگیرد و اطمینان حاصل میکند کانتینرهای توصیفشده در حال اجرا و سالم هستند.
kube-apiserver - یک REST API که دادههای اشیای API مانند پادها، سرویسها و replication controllerها را اعتبارسنجی و پیکربندی میکند.
kube-controller-manager - یک Daemon ای که حلقههای کنترل اصلی همراه کوبرنتیز را در خود جای داده است.
kube-proxy - میتواند ارسال ساده جریان TCP/UDP یا ارسال TCP/UDP بهصورت round-robin را بین مجموعهای از بکاندها انجام دهد.
kube-scheduler - زمانبندیکنندهای که دسترسپذیری، عملکرد و ظرفیت را مدیریت میکند.
فهرست ports and protocols که باید روی گرههای Control Plain و Worker باز باشند
پیکربندی APIها
این بخش میزبان مستندات APIهای «منتشر نشده» است که برای پیکربندی اجزا یا ابزارهای کوبرنتیز استفاده میشوند. اکثر این APIها توسط سرور API به روش RESTful در معرض نمایش قرار نمیگیرند، اگرچه برای کاربر یا اپراتور جهت استفاده یا مدیریت یک خوشه ضروری هستند.
راههای زیادی برای مشارکت در کوبرنتیز وجود دارد. میتوانید روی طراحی قابلیتهای جدید کار کنید،
کد موجود را مستند کنید یا برای وب نوشتهای ما بنویسید.
بیش از اینها: میتوانید آن قابلیتهای جدید را پیادهسازی کرده یا باگها را رفع کنید.
میتوانید به افراد برای پیوستن به جامعه مشارکتکنندگان کمک کنید یا از مشارکتکنندگان فعلی پشتیبانی کنید.
با وجود این همه روش برای تأثیرگذاری بر پروژه، ما – کوبرنتیز – یک تارنما اختصاصی ساختهایم:
https://k8s.dev. میتوانید به آنجا بروید تا بیشتر درباره
مشارکت در کوبرنتیز بدانید.
اگر به طور خاص میخواهید درباره مشارکت در مستندات یا بخشهای دیگر این تارنما یاد بگیرید،
مشارکت در مستندات کوبرنتیز را مطالعه کنید.
اگر به طور خاص میخواهید در وب نوشتهای رسمی کوبرنتیز کمک کنید،
مشارکت در وب نوشتهای کوبرنتیز را بخوانید.
همچنین میتوانید صفحه
مشارکتکنندگانCNCF
درباره مشارکت در کوبرنتیز را مطالعه کنید.
6.1 - مشارکت در مستندات کوبرنتیز
این وبسایت توسط SIG Docs کوبرنتیز نگهداری میشود.
پروژه کوبرنتیز از کمک همه مشارکتکنندگان، چه تازهکار و چه باتجربه، استقبال میکند!
مشارکتکنندگان مستندات کوبرنتیز:
بهبود محتوای موجود
ایجاد محتوای جدید
ترجمه مستندات
مدیریت و انتشار بخشهای مستندات در چرخه انتشار کوبرنتیز
تیم وب نوشت، که بخشی از SIG Docs است، به مدیریت وب نوشتهای رسمی کمک میکند. برای کسب اطلاعات بیشتر، مشارکت در وب نوشتهای کوبرنتیز را بخوانید.
Note:
برای کسب اطلاعات بیشتر درباره مشارکت در کوبرنتیز بهطور کلی، به وبسایت
مستندات مشارکتکنندگان مراجعه کنید.
شروع کنید
هر کسی میتواند برای مستندات یک issue باز کند یا تغییری را با یک
PR به
مخزن GitHub kubernetes/website ارائه کند.
برای کار مؤثر در جامعه کوبرنتیز لازم است با
git و
GitHub
آشنایی کافی داشته باشید.
flowchart TB
subgraph third[باز کردن PR]
direction TB
U[ ] -.-
Q[بهبود محتوا] --- N[ایجاد محتوا]
N --- O[ترجمه مستندات]
O --- P[مدیریت و انتشار بخش های مستندات در چرخه انتشار کوبرنتیز]
end
subgraph second[بازبینی]
direction TB
T[ ] -.-
D[مرور مخزن kubernetes/website] --- E[بررسی مولد سایت ایستای Hugo]
E --- F[درک دستورات پایه GitHub]
F --- G[بازبینی PRهای باز و فرایندهای بازبینی تغییرات]
end
subgraph first[ثبت نام]
direction TB
S[ ] -.-
B[توافق نامه مجوز مشارکت کنندگان CNCF را امضا کنید] --- C[به کانال Slack sig-docs بپیوندید]
C --- V[به فهرست پستی kubernetes-sig-docs بپیوندید]
V --- M[در تماس های هفتگی sig-docs یا جلسات Slack شرکت کنید]
end
A([fa:fa-user مشارکت کننده جدید]) --> first
A --> second
A --> third
A --> H[سوال بپرسید!!!]
classDef grey fill:#dddddd,stroke:#ffffff,stroke-width:px,color:#000000, font-size:15px;
classDef white fill:#ffffff,stroke:#000,stroke-width:px,color:#000,font-weight:bold
classDef spacewhite fill:#ffffff,stroke:#fff,stroke-width:0px,color:#000
class A,B,C,D,E,F,G,H,M,Q,N,O,P,V grey
class S,T,U spacewhite
class first,second,third white
شکل ۱. شروع به کار برای یک مشارکتکننده جدید.
قدم ۱ یک نقشه راه برای مشارکتکنندگان تازهوارد ترسیم میکند. میتوانید برخی یا همه مراحل «ثبتنام» (Sign up) و «بازبینی» (Review) را دنبال کنید. اکنون آمادهاید تا PRهایی را باز کنید که اهداف مشارکت شما را برآورده سازند؛ برخی از این اهداف در بخش «ایجاد PR» (Open PR) فهرست شدهاند. باز هم، سوالات همیشه مورد استقبال هستند!
برخی کارها به اعتماد و دسترسی بیشتری در سازمان کوبرنتیز نیاز دارند. برای جزئیات بیشتر درباره نقشها و سطح دسترسی، مشارکت در SIG Docs را ببینید.
اولین مشارکت شما
شما میتوانید با مرور چندین مرحله از قبل، برای اولین مشارکت خود آماده شوید.
شکل ۲ مراحل و جزئیات بعدی را شرح میدهد.
flowchart LR
subgraph second[اولین مشارکت]
direction TB
S[ ] -.-
G[بازبینی PRهای اعضای دیگر K8s] -->
A[بررسی فهرست Issues در kubernetes/website برای PRهای good first] --> B[باز کردن یک PR!!]
end
subgraph first[آماده سازی پیشنهادی]
direction TB
T[ ] -.-
D[مرور نمای کلی مشارکت] -->E[خواندن راهنماهای محتوا و سبک K8s]
E --> F[یادگیری انواع محتوای صفحه در Hugo و شورت کدها]
end
first ----> second
classDef grey fill:#dddddd,stroke:#ffffff,stroke-width:px,color:#000000, font-size:15px;
classDef white fill:#ffffff,stroke:#000,stroke-width:px,color:#000,font-weight:bold
classDef spacewhite fill:#ffffff,stroke:#fff,stroke-width:0px,color:#000
class A,B,D,E,F,G grey
class S,T spacewhite
class first,second white
گام ۲. آمادهسازی برای نخستین مشارکت شما.
برای آشنایی با روشهای گوناگون مشارکت، نمای کلی مشارکت را بخوانید.
فهرست issueها kubernetes/website را بررسی کنید تا سرنخهای مناسبی برای شروع بیابید.
ارائه نخستین مشارکت میتواند دلهرهآور باشد. سفیران مشارکتکنندگان جدید
برای همراهی شما در انجام چند مشارکت اول حضور دارند. میتوانید از طریق Slack کوبرنتیز و ترجیحاً در کانال #sig-docs با آنها ارتباط بگیرید.
همچنین تماس برای آشنایی و خوشامدگویی به مشارکتکنندگان جدید
در اولین سهشنبه هر ماه برگزار میشود. در آنجا میتوانید با سفیران مشارکتکنندگان جدید تعامل کرده
و پرسشهای خود را مطرح کنید.
SIG Docs گروهی از مشارکتکنندگان است که مستندات کوبرنتیز و وبسایت آن را منتشر و نگهداری میکنند. مشارکت با SIG Docs راهی عالی برای مشارکتکنندگان کوبرنتیز (چه توسعهدهندگان قابلیتها و چه سایر افراد) است تا تأثیر بزرگی بر پروژه کوبرنتیز بگذارند.
در هفتههایی که جلسه حضوری Zoom برگزار نمیشود، در استندآپ غیرهمزمان (Async Stand-up) SIG Docs در Slack شرکت کنید. این جلسات نیز همیشه در #sig-docs اعلام میشوند. تا ۲۴ ساعت پس از اعلام جلسه میتوانید در یکی از رشتهها مشارکت کنید.
راههای دیگر برای مشارکت کردن
به وبسایت جامعه کوبرنتیز سر بزنید. در توییتر یا Stack Overflow مشارکت کنید،
درباره گردهماییها و رویدادهای محلی کوبرنتیز و موارد دیگر مطلع شوید.
دو وب نوشت رسمی کوبرنتیز وجود دارد و CNCF نیز وب نوشت اختصاصی خودش را دارد که میتوانید در آن نیز درباره کوبرنتیز بنویسید.
برای وب نوشت اصلی کوبرنتیز ما (پروژه کوبرنتیز) علاقه داریم مقالاتی با دیدگاههای گوناگون و تمرکزهای ویژه منتشر کنیم که بهنوعی با کوبرنتیز در ارتباط باشند.
بهجز چند استثنای خاص، ما فقط محتوایی را منتشر میکنیم که پیشتر در هیچ جای دیگری ارسال یا منتشر نشده باشد.
برای اطلاعات بیشتر در این باره، راهنمای وب نوشت را مطالعه کنید.
وب نوشتهای رسمی کوبرنتیز
وب نوشت اصلی
وب نوشت اصلی کوبرنتیزتوسط پروژه برای اطلاعرسانی درباره قابلیتهای جدید، گزارشهای جامعه و هر خبر مرتبط با جامعه کوبرنتیز استفاده میشود. این جامعه شامل کاربران نهایی و توسعهدهندگان است. بیشتر محتوای وب نوشت درباره رویدادهایی است که در هسته پروژه رخ میدهد؛ با این حال، پروژه کوبرنتیز شما را تشویق میکند که درباره اتفاقات دیگر در بنسازه نیز مطلب ارسال کنید!
هر کسی میتواند یک مطلب وب نوشتی بنویسد و آن را برای انتشار ارسال کند. بهجز چند استثنای خاص، ما فقط محتوایی را منتشر میکنیم که پیشتر در هیچ جای دیگری ارسال یا منتشر نشده باشد.
وب نوشت مشارکتکنندگان
وب نوشت مشارکتکنندگان کوبرنتیز برای مخاطبانی است که بیشتر بر روی کوبرنتیز کار میکنند تا افرادی که با کوبرنتیز کار میکنند.
پروژه کوبرنتیز عمداً برخی مقالات را در هر دو وبلاگ منتشر میکند.
هر کسی میتواند یک مطلب وب نوشتی بنویسد و آن را برای بازبینی ارسال کند.
بهروزرسانی و نگهداری مقاله
پروژه کوبرنتیز مقالات قدیمی وب نوشتهای خود را نگهداری نمیکند. این بدان معناست که هر
مقاله منتشرشدهای که بیش از یک سال از انتشارش گذشته باشد، معمولاً برای دریافت مسئله
یا درخواست ادغام جهت اعمال تغییرات واجد شرایط نیست. برای جلوگیری از ایجاد رویه، حتی
درخواست ادغامهای فنی و درست هم به احتمال زیاد رد میشوند.
بااینحال، استثناهایی وجود دارند؛ مانند:
(بهروزرسانیهای) مقالاتی که بهعنوان همیشهسبز علامت خوردهاند
حذف یا اصلاح مقالاتی که اکنون توصیههای نادرست و خطرناک ارائه میدهند
رفع خطاها برای اطمینان از اینکه یک مقاله موجود هنوز بهدرستی نمایش داده میشود
برای هر مقالهای که بیش از یک سال از انتشارش گذشته و بهعنوان evergreen علامت نخورده
است، تارنما بهطور خودکار پیامی را نمایش میدهد مبنی بر اینکه محتوا ممکن است قدیمی باشد.
مقالات همیشه سبز
میتوانید با قرار دادن evergreen: true در مقدمه، یک مقاله را بهعنوان همیشهسبز علامتگذاری کنید.
ما فقط زمانی مقالات وب نوشت را بهعنوان نگهداریشده (evergreen: true در مقدمه) علامت میزنیم که پروژه کوبرنتیز بتواند متعهد شود آنها را برای همیشه نگهداری کند. برخی مقالات وب نوشت بدون تردید شایسته این هستند؛ برای نمونه، تیم ارتباطات انتشار همواره اعلانهای رسمی را بهعنوان همیشهسبز علامت میزند.
هرکسی میتواند یک Pull Request مربوط به مستندات را بازبینی (review) کند. برای دیدن Pull Requestهای باز، به بخش
pull requests در مخزن وبسایت کوبرنتیز بروید.
بازبینی Pull Requestهای مستندات راه بسیار خوبی برای معرفی خود به جامعه کوبرنتیز است؛
به شما کمک میکند با پایگاه کد آشنا شوید و اعتماد سایر مشارکتکنندگان را جلب کنید.
علاوه بر تغییرات، بر جنبههای مثبت PRها نیز نظر بگذارید.
همدل باشید و در نظر داشته باشید بازبینی شما چگونه دریافت میشود.
نیت خوب را فرض کنید و پرسشهای روشنکننده بپرسید.
مشارکتکنندگان باتجربه، با مشارکتکنندگان تازهای که کارشان نیاز به تغییرات گسترده دارد جفت شوید.
فرایند بازبینی
بهطور کلی، Pull Requestها را از نظر محتوا و سبک به زبان انگلیسی بازبینی کنید.
شکل ۱ گامهای فرایند بازبینی را نشان میدهد؛ جزئیات هر گام در ادامه آمده است.
flowchart LR
subgraph fourth[Start review]
direction TB
S[ ] -.-
M[add comments] --> N[review changes]
N --> O[new contributors should choose Comment]
end
subgraph third[Select PR]
direction TB
T[ ] -.-
J[read description and comments]--> K[preview changes in Netlify preview build]
end
A[Review open PR list]--> B[Filter open PRs by label]
B --> third --> fourth
classDef grey fill:#dddddd,stroke:#ffffff,stroke-width:px,color:#000000, font-size:15px;
classDef white fill:#ffffff,stroke:#000,stroke-width:px,color:#000,font-weight:bold
classDef spacewhite fill:#ffffff,stroke:#fff,stroke-width:0px,color:#000
class A,B,J,K,M,N,O grey
class S,T spacewhite
class third,fourth white
Pull Requestهای باز را با استفاده از یک یا همه برچسبهای زیر فیلتر کنید:
cncf-cla: yes (پیشنهاد میشود): PRهایی که نویسنده آنها CLA را امضا نکرده است نمیتوانند ادغام شوند.
برای اطلاعات بیشتر بخش، CLA امضا را ببینید.
language/en (پیشنهاد میشود): فقط PRهای زبان انگلیسی را فیلتر میکند.
size/<size>: PRها را بر اساس اندازه فیلتر میکند. اگر تازهکار هستید، با PRهای کوچکتر شروع کنید.
همچنین مطمئن شوید PR با برچسب work in progress علامتگذاری نشده باشد؛
چنین PRهایی هنوز آماده بازبینی نیستند.
پس از انتخاب یک PR برای بازبینی، تغییرات را با انجام کارهای زیر درک کنید:
توضیحات PR را بخوانید تا تغییرات انجامشده را بفهمید و هر Issue پیوندشده را بررسی کنید.
نظرهای سایر بازبینها را بخوانید.
روی تب Files changed کلیک کنید تا فایل (پرونده)ها و خطوط تغییریافته را ببینید.
پیشنمایش تغییرات را در ساخت پیشنمایش Netlify مشاهده کنید. برای این کار، در تب Conversation به بخش بررسی ساخت Netlify که در پایین صفحه قرار دارد بروید.
(این تصویر مربوط به نسخه دسکتاپ GitHub است؛ اگر در تبلت یا تلفن همراه بازبینی میکنید، رابط کاربری GitHub کمی متفاوت است):
برای باز کردن پیشنمایش، روی پیوند Details در خط deploy/netlify در فهرست بررسیها کلیک کنید.
به تب Files changed بروید تا بازبینی را آغاز کنید.
روی نماد + کنار خطی که میخواهید نظر بدهید کلیک کنید.
نظر خود را درباره آن خط بنویسید و روی Add single comment (اگر تنها یک نظر دارید) یا
Start a review (اگر چند نظر دارید) کلیک کنید.
پس از پایان، در بالای صفحه روی Review changes کلیک کنید. اینجا میتوانید
خلاصهای از بازبینی خود (و چند نظر مثبت برای مشارکتکننده!) بنویسید. لطفاً همیشه از دکمه "Comment" استفاده کنید.
هنگام پایان بازبینی، از کلیک روی دکمه "Request changes" پرهیز کنید.
اگر میخواهید پیش از اعمال تغییرات بیشتر مانع ادغام PR شوید، میتوانید کامنت /hold بگذارید.
دلیل hold را ذکر کنید و در صورت تمایل شرایط برداشتن آن را مشخص کنید.
هنگام پایان بازبینی، از کلیک روی دکمه "Approve" پرهیز کنید.
بیشتر مواقع گذاشتن کامنت /approve توصیه میشود.
چکلیست بازبینی
هنگام بازبینی، از موارد زیر بهعنوان نقطه شروع استفاده کنید.
زبان و دستور زبان
آیا خطاهای آشکاری در زبان یا دستور زبان وجود دارد؟ آیا راه بهتری برای بیان یک جمله هست؟
روی زبان و دستور زبان بخشهایی از صفحه که نویسنده تغییر داده تمرکز کنید.
مگر اینکه نویسنده آشکارا قصد بهروزرسانی کل صفحه را داشته باشد، او الزام ندارد
همه اشکالات صفحه را برطرف کند.
وقتی یک PR صفحهای موجود را بهروزرسانی میکند، روی بخشهای تغییر یافته صفحه بازبینی کنید.
آن محتوا باید از نظر فنی و ویرایشی درست باشد. اگر خطاهایی پیدا کردید که مستقیماً به هدف نویسنده مرتبط نیست،
آن را در یک Issue جداگانه مطرح کنید (البته ابتدا مطمئن شوید Issue مشابهی وجود ندارد).
مراقب Pull Requestهایی باشید که محتوا را جابهجا میکنند. اگر نویسنده صفحهای را
تغییر نام میدهد یا دو صفحه را ادغام میکند، ما (SIG Docs کوبرنتیز) معمولاً از او نمیخواهیم
همه ایرادهای املایی یا دستور زبانی موجود در محتوای جابهجا شده را برطرف کند.
آیا واژههای پیچیده یا کهنهای هست که بتوان آنها را با واژهای سادهتر جایگزین کرد؟
آیا واژه، اصطلاح یا عبارتی هست که بتوان آن را با جایگزینی غیرتبعیضآمیز عوض کرد؟
آیا انتخاب واژه و حروف بزرگ/کوچک کردن آن با راهنمای سبک هماهنگ است؟
آیا جملههای طولانی وجود دارد که میتواند کوتاهتر یا سادهتر شود؟
آیا پاراگرافهای طولانی وجود دارد که شاید بهصورت فهرست یا جدول بهتر باشند؟
محتوا
آیا محتوای مشابهی در جای دیگری از سایت کوبرنتیز وجود دارد؟
آیا محتوا بیش از حد به مستندات خارج از وبسایت، مستندات متعلق به یک فروشنده ی خاص یا مستندات غیرمتنباز پیوند میدهد؟
مستندات
چند بررسی که باید در نظر گرفت:
آیا این PR عنوان، slug/alias یا پیوند لنگری (anchor link) صفحهای را تغییر داده یا حذف کرده است؟ اگر بله، آیا در نتیجه این PR پیوندهای شکستهای ایجاد شده است؟ آیا گزینه دیگری مثل تغییر عنوان صفحه بدون تغییر slug وجود دارد؟
آیا PR صفحهای جدید اضافه میکند؟ اگر بله:
آیا صفحه از نوع محتوای صفحه مناسب و شورتکدهای مرتبط Hugo استفاده میکند؟
آیا صفحه در ناوبری جانبی آن بخش بهدرستی نمایش داده میشود (یا اصلاً نمایش داده میشود)؟
آیا تغییرات در پیشنمایش Netlify نمایش داده میشوند؟ درباره فهرستها، بلاکهای کد، جدولها،
نکتهها و تصاویر دقیق باشید.
وبنوشت (blog)
بازخورد زودهنگام درباره پستهای وبنوشت (blog) از طریق Google Doc یا HackMD استقبال میشود.
لطفاً درخواست خود را از کانال Slack #sig-docs-blog زودتر ارسال کنید.
همچنین درباره مقالات evergreen و نحوه تصمیمگیری درباره evergreen بودن مقاله اطلاعات داشته باشید.
مقالات وبنوشت (blog) ممکن است شامل نقلقول مستقیم و
گفتار غیرمستقیم باشند.
برای متنی که به فردی نسبت داده شده یا بخشی از گفتوگویی واقعی است، پیشنهاد بازنویسی ندهید—حتی اگر
دستور زبان گوینده اصلی درست نباشد. در این موارد همچنین سعی کنید علامات نگارشی پیشنهادی نویسنده را حفظ کنید مگر اینکه واضحاً اشتباه باشد.
بهعنوان پروژه، فقط زمانی مقالات وبنوشت (blog) را با برچسب نگهداری (evergreen: true در front matter) علامت میکنیم
که پروژه Kubernetes متعهد باشد آنها را بهطور نامحدود نگهداری کند.
برخی مقالات قطعاً ارزش این کار را دارند و ما همیشه اطلاعیههای انتشار را evergreen علامت میکنیم.
اگر درباره نحوه بازبینی این مورد مطمئن نیستید، با سایر مشارکتکنندگان مشورت کنید.
راهنمای محتوا بدون قید و شرط بر مقالات وبنوشت (blog)
و PRهایی که آنها را اضافه میکنند اعمال میشود. به یاد داشته باشید برخی محدودیتها فقط
به مستندات مربوطاند و برای مقالات وبنوشت (blog) صدق نمیکنند.
بررسی کنید که منبع Markdown از نوع مناسب محتوای صفحه
و / یا layout مناسب استفاده میکند.
سایر
مراقب ویرایشهای جزئی (Trivial Edits) باشید؛
اگر تغییری را ویرایش جزئی تشخیص میدهید، این سیاست را یادآور شوید
(اگر واقعاً بهبود است، قبول تغییر اشکالی ندارد).
نویسندگانی را که در حال انجام اصلاحات مربوط به فاصلهگذاری (whitespace) هستند تشویق کنید که این کار را در اولین commit PR خود انجام دهند و سپس تغییرات دیگر را روی آن اضافه کنند. این کار هم ادغام (merge) و هم بازبینیها را سادهتر میکند. بهویژه مراقب تغییرات جزئی باشید که همراه با مقدار زیادی اصلاح فاصلهگذاری در یک commit واحد انجام شدهاند (و اگر چنین موردی دیدید، نویسنده را تشویق کنید تا آن را اصلاح کند).
بهعنوان بازبین، اگر مسائل کوچکی در PR یافتید که برای معنا حیاتی نیستند، مثل غلطهای املایی
یا فاصله نادرست، نظر خود را با پیشوند nit: بنویسید.
این به نویسنده نشان میدهد این بخش از بازخورد شما غیر بحرانی است.
اگر در حال بررسی تأیید یک Pull Request هستید و تمام بازخوردهای باقیمانده با nit
علامتگذاری شدهاند، میتوانید PR را ادغام کنید. در این حالت، توصیه میشود برای
موارد nit باقیمانده یک issue جدید باز کنید. همچنین در نظر بگیرید که آیا میتوانید
آن issue جدید را بهعنوان Good First Issue علامتگذاری کنید یا خیر؛
اگر امکانپذیر باشد، این ها منابع خوبی (برای مشارکتکنندگان تازهوارد) خواهند بود.
6.3.2 - بازبینی برای تأییدکنندگان و بازبینها
بازبینها (Reviewers) و
تأییدکنندگان (Approvers) در SIG Docs
هنگام بازبینی یک تغییر چند کار اضافه نیز انجام میدهند.
هر هفته یکی از تأییدکنندگان مستندات (docs approver) داوطلب میشود تا Pull Requestها را تریاژ (triage) و بازبینی کند.
این فرد در آن هفته "PR Wrangler" است. برای اطلاعات بیشتر، به
زمانبندی PR Wrangler مراجعه کنید.
برای تبدیل شدن به PR Wrangler، در نشست هفتگی SIG Docs شرکت کنید و داوطلب شوید.
حتی اگر در برنامهٔ همین هفته نام شما نیست، هنوز هم میتوانید Pull Requestهایی (PRها) را که در حال حاضر تحت بازبینی فعال نیستند، بررسی کنید.
علاوه بر چرخشی بودن، یک بات بازبینها و تأییدکنندگان PR را بر اساس مالکیت فایل (پرونده)های تحت تأثیر تعیین میکند.
هر آنچه در بازبینی یک Pull Request آمده است صدق میکند،
اما بازبینها و تأییدکنندگان باید کارهای زیر را نیز انجام دهند:
استفاده از دستور Prow /assign برای اختصاص دادن یک بازبین مشخص به یک Pull Request در صورت نیاز. این کار بهویژه زمانی اهمیت بیشتری دارد که نیاز به درخواست بازبینی فنی از مشارکتکنندگان کد باشد.
Note:
به فیلد reviewers در front-matter بالای فایل (پرونده) Markdown نگاه کنید تا ببینید چه کسی میتواند بازبینی فنی انجام دهد.
اطمینان از اینکه PR مطابق با راهنمای محتوا و راهنمای سبک است؛
اگر اینطور نیست، نویسنده را به بخش مربوطه در راهنما(ها) ارجاع دهید.
استفاده از گزینه Request Changes در GitHub در صورت لزوم برای پیشنهاد تغییر به نویسنده PR.
تغییر وضعیت بازبینی خود در GitHub با استفاده از دستورات Prow /approve یا /lgtm
اگر پیشنهادهای شما اعمال شدهاند.
commit در PR شخص دیگر
گذاشتن نظر در PR مفید است، اما گاهی ممکن است لازم باشد در Pull Request شخص دیگری commit کنید.
هرگز کار شخص دیگری را «بهدست نگیرید» مگر اینکه خود او صراحتاً درخواست کرده باشد
یا قصد داشته باشید یک PR قدیمی و رهاشده را احیا کنید.
گرچه این کار ممکن است در کوتاهمدت سریعتر باشد، اما فرصت مشارکت را از آن فرد میگیرد.
روش کار بستگی دارد به اینکه آیا نیاز دارید فایلی (پروندهای) را ویرایش کنید که در دامنهٔ PR است
یا فایلی (پروندهای) را که هنوز در آن PR تغییری نکرده است.
شما نمیتوانید در PR شخص دیگر commit کنید اگر یکی از شرایط زیر برقرار باشد:
اگر نویسنده PR شاخه (branch) خود را مستقیماً به مخزن
https://github.com/kubernetes/website/
پوش کرده باشد. تنها بازبینیکنندهای با دسترسی push میتواند در PR کاربر دیگر commit کند.
Note:
نویسنده را تشویق کنید دفعه بعد شاخه خود را در fork شخصی بسازد و سپس PR باز کند.
نویسنده PR بهصراحت ویرایش توسط تأییدکنندگان را غیرفعال کرده باشد.
دستورات Prow برای بازبینی
Prow
سیستم CI/CD مبتنی بر کوبرنتیز است که روی Pull Requestها اجرا میشود.
Prow امکان استفاده از دستورات شبیه به چتبات را فراهم میکند تا کارهای GitHub مانند افزودن یا حذف برچسبها، بستن Issueها و تعیین تاییدکنندگان را مدیریت کند.
دستورات Prow بهصورت کامنت در GitHub و با فرمت /<command-name> نوشته میشوند.
رایجترین دستورات Prow برای بازبینها و تأییدکنندگان عبارتند از:
دستورات Prow برای بازبینی
دستور Prow
محدودیت نقش
توضیحات
/lgtm
اعضای سازمان
نشان میدهد بازبینی شما تمام شده و از تغییرات راضی هستید.
/approve
تایید کنندگان
PR را برای ادغام تأیید میکند.
/assign
همه
شخصی را برای بازبینی یا تأیید PR تعیین میکند.
/close
اعضای سازمان
یک Issue یا PR را میبندد.
/hold
همه
برچسب do-not-merge/hold را اضافه میکند و مانع ادغام خودکار PR میشود.
/hold cancel
همه
برچسب do-not-merge/hold را حذف میکند.
برای دیدن لیست کامل دستورات قابل استفاده در PR، به
Prow مرجع دستورات مراجعه کنید.
دستهبندی و اولویتبندی Issueها
بهطور کلی، SIG Docs از فرآیند
تریاژ Issueها در کوبرنتیز
پیروی میکند و از همان برچسبها استفاده میکند.
این فیلتر
در GitHub، فهرستی از issueها را پیدا میکند که ممکن است به تریاژ نیاز داشته باشند.
Triage یک Issue
اعتبارسنجی Issue
مطمئن شوید که Issue مربوط به مستندات وبسایت است. برخی Issueها با پاسخ سریع یا ارجاع بسته میشوند.
(به بخش درخواستهای پشتیبانی یا گزارش باگ کد مراجعه کنید.)
بررسی کنید که Issue ارزش پیگیری دارد یا نه.
اگر Issue جزئیات کافی ندارد یا قالب بهدرستی پر نشده، برچسب triage/needs-information اضافه کنید.
اگر Issue هم lifecycle/stale و هم triage/needs-information دارد، آن را ببندید.
قابل تعویق نامحدود؛ هر زمان منابع در دسترس بود انجام دهید.
priority/awaiting-more-evidence
نگهدارنده یک Issue بالقوه خوب تا گم نشود.
help یا good first issue
مناسب برای کسی با تجربه بسیار کم در کوبرنتیز یا SIG Docs. برای اطلاعات بیشتر، Help Wanted و Good First Issue را ببینید.
در صورت صلاحدید، مالکیت یک Issue را بر عهده بگیرید و برای آن PR ارسال کنید
(بهویژه اگر سریع انجام میشود یا مرتبط با کاری است که همین حالا انجام میدهید).
در هر دو حالت، برچسب باید از قبل وجود داشته باشد. اگر تلاش کنید برچسبی که وجود ندارد را اضافه کنید، فرمان بدون پیام نادیده گرفته میشود.
لیست همه برچسبها در بخش برچسبهای مخزن وبسایت موجود است.
همه برچسبها توسط SIG Docs استفاده نمیشوند.
برچسبهای چرخه عمر Issue
Issueها معمولاً بهسرعت باز و بسته میشوند. بااینحال، گاهی یک Issue پس از باز شدن غیرفعال میشود و گاهی لازم است بیش از ۹۰ روز باز بماند.
برچسبهای چرخه عمر Issue
برچسب
توضیحات
lifecycle/stale
پس از ۹۰ روز بدون فعالیت، Issue بهطور خودکار با این برچسب علامتگذاری میشود. اگر چرخه عمر بهصورت دستی با فرمان /remove-lifecycle stale برگردانده نشود، Issue خودکار بسته خواهد شد.
lifecycle/frozen
Issue دارای این برچسب پس از ۹۰ روز غیرفعال شدن منقضی نمیشود. کاربر این برچسب را دستی برای Issueهایی اضافه میکند که باید مدتزمان بسیار طولانیتری باز بمانند، مانند آنهایی که برچسب priority/important-longterm دارند.
مدیریت انواع خاص Issueها
SIG Docs بهاندازهای با انواع زیر از Issue مواجه میشود که لازم است شیوه رسیدگی به آنها مستند شود.
Issueهای تکراری
اگر یک مشکل واحد بیش از یک Issue باز دارد، آنها را در یک Issue ادغام کنید.
تصمیم بگیرید کدام Issue باز بماند (یا یک Issue جدید باز کنید)، سپس تمام اطلاعات مرتبط را منتقل کرده و Issueهای مرتبط را پیوند کنید.
در نهایت، به همه Issueهای دیگر که همان مشکل را توصیف میکنند برچسب triage/duplicate بزنید و آنها را ببندید. داشتن یک Issue منفرد، سردرگمی را کاهش میدهد و از دوبارهکاری جلوگیری میکند.
Issueهای مربوط به پیوندهای خراب
اگر Issue پیوند مرده در مستندات API یا kubectl است، تا زمانی که مشکل کاملاً درک شود به آن برچسب /priority critical-urgent بدهید.
به تمام Issueهای پیوند مرده دیگر برچسب /priority important-longterm بدهید، چون باید بهصورت دستی رفع شوند.
Issueهای وبنوشت (blog)
انتظار میرود مطالب وبنوشت (blog) کوبرنتیز با گذر زمان قدیمی شوند؛ بنابراین فقط مطالب کمتر از یکسال را نگهداری میکنیم.
اگر Issue مربوط به مطلبی قدیمیتر از یک سال است، معمولاً باید Issue را بدون رفع ببندید.
در صورت وجود توجیه مناسب، ایجاد استثنا اشکالی ندارد.
درخواست های پشتیبانی یا گزارش باگ کد
برخی از Issueهای مربوط به مستندات در واقع به کد اصلی مربوط میشوند یا درخواست کمک هستند،
برای مثال زمانی که یک آموزش (tutorial) درست کار نمیکند.
برای Issueهایی که به مستندات مربوط نیستند، آنها را با برچسب kind/support ببندید
و در یک کامنت، درخواستکننده را به کانالهای پشتیبانی دیگر (مانند Slack یا Stack Overflow) راهنمایی کنید.
اگر Issue مربوط به باگ در یک قابلیت باشد، درخواستکننده را به مخزن مرتبط هدایت کنید
(مخزن kubernetes/kubernetes نقطهٔ شروع مناسبی است).
نمونه پاسخ به درخواست پشتیبانی:
This issue sounds more like a request for support and less
like an issue specifically for docs. I encourage you to bring
your question to the `#kubernetes-users` channel in
[Kubernetes slack](https://slack.k8s.io/). You can also search
resources like
[Stack Overflow](https://stackoverflow.com/questions/tagged/kubernetes)
for answers to similar questions.
You can also open issues for Kubernetes functionality in
https://github.com/kubernetes/kubernetes.
If this is a documentation issue, please re-open this issue.
نمونه پاسخ به گزارش باگ کد:
This sounds more like an issue with the code than an issue with
the documentation. Please open an issue at
https://github.com/kubernetes/kubernetes/issues.
If this is a documentation issue, please re-open this issue.
squash کردن (Squashing)
بهعنوان یک تأییدکننده، هنگام بازبینی Pull Requestها (PRها) ممکن است در شرایط مختلف یکی از کارهای زیر را انجام دهید:
به مشارکتکننده توصیه کنید commitهایش را squash کند.
commitها را بهجای مشارکتکننده squash کنید.
به مشارکتکننده توصیه کنید هنوز squash نکند.
مانع از squash شدن شوید.
توصیه به مشارکتکنندگان برای squash: یک مشارکتکننده تازهوارد ممکن است نداند که باید commitهایش را در PR squash کند. در این صورت، او را راهنمایی کنید، پیوندهای مفید در اختیارش بگذارید و در صورت نیاز پیشنهاد کمک بدهید. چند پیوند مفید:
squash commit برای مشارکتکنندگان: اگر مشارکتکننده ممکن است در squash کردن مشکل داشته باشد یا فشار زمانی برای ادغام PR وجود دارد، میتوانید squash را برای او انجام دهید:
در یک PR، اگر مشارکتکننده اجازهٔ مدیریت PR را به نگهدارندگان (maintainers) بدهد،
میتوانید commitهای او را squash کنید و fork او را با نتیجهٔ نهایی بهروزرسانی نمایید.
پیش از انجام squash، به او توصیه کنید آخرین تغییرات خود را ذخیره کرده و به PR پوش کند.
پس از squash نیز به او بگویید commit squash شده را به کلون محلی خود pull کند.
همچنین میتوانید با استفاده از یک برچسب (label) کاری کنید که GitHub commitها را squash کند،
بهطوری که Tide / GitHub این کار را انجام دهند؛
یا هنگام ادغام PR روی دکمهٔ Squash commits کلیک کنید.
توصیه برای پرهیز از squash
اگر یک commit تغییرات خرابکننده یا نادرستی انجام داده باشد و commit آخر برای بازگرداندن (revert) آن خطا باشد،
در این حالت commitها را squash نکنید.
حتی اگر در تب "Files changed" در PR در GitHub و در پیشنمایش Netlify همهچیز درست بهنظر برسد،
ادغام چنین PRی میتواند برای دیگر مشارکتکنندگان باعث ایجاد conflict در rebase یا merge شود.
در چنین شرایطی، متناسب با صلاحدید خود مداخله کنید تا از ایجاد مشکل برای دیگر مشارکتکنندگان جلوگیری شود.
هرگز squash نکنید
اگر در حال راهاندازی یک بومیسازی (localization) یا انتشار مستندات برای یک نسخهٔ جدید هستید،
در این حالت شاخهای را ادغام میکنید که از fork یک کاربر نیست؛
در چنین شرایطی هرگز commitها را squash نکنید.
عدم squash در اینجا ضروری است زیرا باید تاریخچهٔ کامل commitها برای آن فایل (پرونده)ها حفظ شود.
6.4 - بومیسازی مستندات کوبرنتیز
این صفحه به شما نشان میدهد که چگونه مستندات را برای زبانهای مختلف بومیسازی کنید.
برای جزئیات بیشتر در مورد نحوه مشارکت در یک بومیسازی خاص، به دنبال نسخه بومیسازیشده این صفحه باشید.
کد دو حرفی زبان خود را پیدا کنید
ابتدا، برای یافتن کد دو حرفی زبان محلیسازی خود، به استاندارد ISO 639-1 مراجعه کنید. برای مثال، کد دو حرفی زبان کرهای «ko» است.
برخی از زبانها از نسخه کوچک کد کشور که توسط ISO-3166 تعریف شده است، همراه با کدهای زبان خود استفاده میکنند. برای مثال، کد زبان پرتغالی برزیلی «pt-br» است.
git clone https://github.com/<username>/website
cd website
پوشه محتوای تارنما شامل زیرپوشه هایی برای هر زبان است. محلیسازی که میخواهید به آن کمک کنید، درون content/<two-letter-code> قرار دارد.
پیشنهاد تغییرات
صفحه بومیسازیشدهی انتخابی خود را بر اساس نسخه انگلیسی آن ایجاد یا بهروزرسانی کنید. برای جزئیات بیشتر به بومیسازی محتوا مراجعه کنید.
اگر متوجه یک بیدقتی فنی یا مشکل دیگری در مستندات بالادستی (انگلیسی) شدید، ابتدا باید مستندات بالادستی را اصلاح کنید و سپس با بهروزرسانی بومیسازی که روی آن کار میکنید، اصلاح معادل را تکرار کنید.
تغییرات در یک درخواست ادغام را به یک محلیسازی واحد محدود کنید. بررسی درخواستهای ادغام که محتوا را در چندین محلیسازی تغییر میدهند، مشکلساز است.
برای پیشنهاد تغییرات در آن بومیسازی، از پیشنهاد بهبود محتوا پیروی کنید. این فرآیند مشابه پیشنهاد تغییرات در محتوای بالادستی (انگلیسی) است.
شروع یک محلیسازی جدید
اگر میخواهید مستندات کوبرنتیز به یک زبان جدید بومیسازی شود، مراحل زیر را باید انجام دهید.
از آنجا که مشارکتکنندگان نمیتوانند درخواستهای ادغام خود را تأیید کنند، برای شروع بومیسازی حداقل به دو مشارکتکننده نیاز دارید.
همه تیمهای محلیسازی باید خودکفا باشند. تارنما کوبرنتیز خوشحال است که میزبان کار شما باشد، اما ترجمه آن و بهروز نگه داشتن محتوای محلیسازی شده موجود به عهده شماست.
شما باید کد دو حرفی زبان خود را بدانید. برای یافتن کد دو حرفی زبان محلی خود، به استاندارد ISO 639-1 مراجعه کنید. برای مثال، کد دو حرفی زبان کرهای «ko» است.
اگر زبانی که میخواهید بومیسازی آن را شروع کنید، در مکانهای مختلفی صحبت میشود و تفاوتهای قابل توجهی بین گونههای مختلف آن وجود دارد، ممکن است منطقی باشد که کد کشور ISO-3166 با حروف کوچک را با کد دو حرفی آن زبان ترکیب کنید. به عنوان مثال، پرتغالی برزیلی به صورت «pt-br» بومیسازی شده است.
وقتی محلیسازی جدیدی را شروع میکنید، باید قبل از اینکه پروژه کوبرنتیز بتواند تغییرات شما را در تارنما زنده منتشر کند، تمام حداقل محتوای مورد نیاز را محلیسازی کنید.
اسناد SIG میتوانند به شما کمک کنند تا روی یک شاخه جداگانه کار کنید تا بتوانید به تدریج به سمت آن هدف حرکت کنید.
پیدا کردن جامعه
به کوبرنتیز SIG اسناد اطلاع دهید که به ایجاد محلیسازی علاقهمند هستید! به کانال SIG Docs در Slack و کانال SIG Docs Localizations در Slack بپیوندید. سایر تیمهای محلیسازی خوشحال میشوند که در شروع کار به شما کمک کنند و به سوالات شما پاسخ دهند.
لطفاً شرکت در جلسه زیرگروه محلیسازی اسناد SIG را نیز در نظر بگیرید. ماموریت زیرگروه محلیسازی اسناد SIG، همکاری در تیمهای محلیسازی اسناد SIG برای همکاری در تعریف و مستندسازی فرآیندهای ایجاد راهنماهای مشارکتی محلیسازی شده است. علاوه بر این، زیرگروه محلیسازی اسناد SIG به دنبال فرصتهایی برای ایجاد و اشتراکگذاری ابزارهای مشترک در بین تیمهای محلیسازی و شناسایی الزامات جدید برای تیم رهبری اسناد SIG است. اگر در مورد این جلسه سؤالی دارید، لطفاً در کانال محلیسازی اسناد SIG سوال کنید.
همچنین میتوانید یک کانال Slack برای محلیسازی خود در مخزن kubernetes/community ایجاد کنید. برای مثالی از اضافه کردن یک کانال Slack،به درخواست ادغام مربوط به اضافه کردن یک کانال برای زبان فارسی مراجعه کنید.
به سازمان گیت هاب کوبرنتیز بپیوندید
وقتی یک درخواست ادغام محلیسازی باز کردید، میتوانید عضو سازمان گیت هاب کوبرنتیز شوید. هر فرد در تیم باید درخواست عضویت سازمان خود را (https://github.com/kubernetes/org/issues/new/choose) در مخزن kubernetes/org ایجاد کند.
تیم محلیسازی خود را در گیتهاب اضافه کنید
در مرحله بعد، تیم محلیسازی کوبرنتیز خود را به sig-docs/teams.yaml اضافه کنید. برای مثالی از اضافه کردن یک تیم محلیسازی، به درخواست ادغام برای اضافه کردن تیم محلیسازی اسپانیایی مراجعه کنید.
اعضای «@kubernetes/sig-docs--owners» میتوانند درخواست ادغام هایی را تأیید کنند که محتوا را در پوشه محلیسازی شما (و فقط در داخل) تغییر میدهد: «/content//». برای هر محلیسازی، تیم @Kubernetes/sig-docs-**-reviews تکالیف بررسی درخواست های ادغام جدید را خودکار میکند. اعضای @kubernetes/website-maintainers میتوانند شاخههای محلیسازی جدیدی برای هماهنگی تلاشهای ترجمه ایجاد کنند. اعضای @kubernetes/website-milestone-maintainers میتوانند از /milestoneدستور Prow برای اختصاص یک نقطه عطف به مسائل یا درخواست های ادغام استفاده کنند.
پیکربندی گردش کار
در مرحله بعد، یک برچسب GitHub برای محلیسازی خود در مخزن kubernetes/test-infra اضافه کنید. یک برچسب به شما امکان میدهد مشکلات را فیلتر کرده و درخواستها را برای زبان خاص خود دریافت کنید.
تارنمای کوبرنتیز از Hugo به عنوان قالب وب خود استفاده میکند. پیکربندی Hugo این تارنما در پرونده hugo.toml قرار دارد. برای پشتیبانی از محلیسازی جدید، باید hugo.toml را تغییر دهید.
یک بلوک پیکربندی برای زبان جدید به hugo.toml زیر بلوک [languages] موجود اضافه کنید. برای مثال، بلوک زبان آلمانی به شکل زیر خواهد بود:
نوار انتخاب زبان، مقدار مربوط به languageName را فهرست میکند. "نام زبان به خط بومی و زبان (نام زبان انگلیسی به خط لاتین)" را به languageName اختصاص دهید. برای مثال، languageName = "한국어 (کرهای)" یا languageName = "Deutsch (آلمانی)".
میتوان از languageNameLatinScript برای دسترسی به نام زبان به خط لاتین و استفاده از آن در قالب استفاده کرد. "نام زبان به خط لاتین" را به languageNameLatinScript اختصاص دهید. برای مثال، languageNameLatinScript ="Korean" یا languageNameLatinScript ="Deutsch".
پارامتر «وزن» ترتیب زبانها را در نوار انتخاب زبان تعیین میکند. وزن کمتر اولویت دارد و در نتیجه زبان اول ظاهر میشود. هنگام اختصاص پارامتر «وزن»، بررسی بلوک زبانهای موجود و تنظیم وزن آنها برای اطمینان از اینکه نسبت به همه زبانها، از جمله هر زبان جدید اضافه شده، به ترتیب مرتب شدهاند، مهم است.
برای اطلاعات بیشتر در مورد پشتیبانی چند زبانه Hugo، به "حالت چند زبانه" مراجعه کنید.
یک پوشه محلیسازی جدید اضافه کنید
یک زیرشاخه مختص به زبان مورد نظر را به پوشه content در مخزن اضافه کنید. برای مثال، کد دو حرفی برای زبان آلمانی de است:
mkdir content/de
شما همچنین باید یک پوشه در داخل «i18n» برای ایجاد کنید
رشته های محلی شده; برای مثال به محلی سازی های موجود نگاه کنید.
برای مثال، برای زبان آلمانی، رشتهها در i18n/de/de.toml قرار دارند.
بومیسازی ضوابط رفتاری جامعه
برای اضافه کردن اصول اخلاقی به زبان خودتان، یک درخواست ادغام در مخزن cncf/foundation باز کنید.
پروندههای مالکان را تنظیم کنید
برای تنظیم نقشهای هر کاربر که در بومیسازی مشارکت دارند، یک پرونده OWNERS در زیرشاخهی زبان مربوطه با کد زیر ایجاد کنید:
بازبینها: فهرستی از تیمهای کوبرنتیز با نقشهای بازبین، در این مورد،
برچسبها: فهرستی از برچسبهای گیتهاب که بهطور خودکار به یک درخواست ادغام اعمال میشوند، در این مورد، برچسب زبانی که در Configure the workflow ایجاد شده است.
اطلاعات بیشتر در مورد پرونده OWNERS را میتوانید در go.k8s.io/owners بیابید.
# برای مشاهده اسناد مربوط به مالکین به نشانی https://go.k8s.io/owners مراجعه کنید.# این پروژه محلیسازی زبان اسپانیایی است.# تیمها و اعضا در نشانی https://github.com/orgs/kubernetes/teams قابل مشاهده هستند.reviewers:- sig-docs-es-reviewsapprovers:- sig-docs-es-ownerslabels:- area/localization- language/es
پس از افزودن پرونده OWNERS مختص زبان، پرونده rootOWNERS_ALIASES را با تیمهای جدید کوبرنتیز برای محلیسازی، sig-docs-**-owners و sig-docs-**-reviews بهروزرسانی کنید.
برای مثالی از افزودن یک محلیسازی جدید، به درخواست ادغام برای فعالسازی مستندات به زبان فرانسوی مراجعه کنید.
یک پرونده README محلی اضافه کنید
برای راهنمایی سایر مشارکتکنندگان محلیسازی، یک پرونده جدید README-**.md به بالاترین سطح kubernetes/website اضافه کنید، که در آن ** کد دو حرفی زبان است. برای مثال، یک پرونده README آلمانی به صورت README-de.md خواهد بود.
مشارکت کنندگان بومی سازی را در پرونده «README-**.md» بومی سازی شده راهنمایی کنید. همان اطلاعات موجود در «README.md» و همچنین شامل موارد زیر باشد:
نقطه تماس برای پروژه بومیسازی
هرگونه اطلاعات خاص مربوط به محلیسازی
پس از ایجاد پرونده README محلی، پیوندی از پرونده اصلی انگلیسی README.md به پرونده اضافه کنید و اطلاعات تماس را به زبان انگلیسی در آن قرار دهید. میتوانید شناسه گیتهاب، نشانی رایانامه، کانال Slack یا روش دیگری برای تماس ارائه دهید. همچنین باید پیوندی به آییننامه رفتار انجمن محلی خود ارائه دهید.
محلیسازی جدید خود را راهاندازی کنید
وقتی محلیسازی الزامات گردش کار و حداقل خروجی را برآورده میکند، SIG اسناد موارد زیر را انجام میدهد:
اسناد ترجمه شده باید در زیرشاخه content/**/ خود قرار گیرند، اما در غیر این صورت، همان مسیر URL منبع انگلیسی را دنبال کنند. به عنوان مثال، برای تهیه آموزش Kubernetes Basics برای ترجمه به آلمانی، یک زیرشاخه در زیر شاخه content/de/ ایجاد کنید و منبع یا پوشه انگلیسی را رونوشت کنید:
ابزارهای ترجمه میتوانند فرآیند ترجمه را سرعت بخشند. برای مثال، برخی از ویراستاران افزونههایی را برای ترجمه سریع متن ارائه میدهند.
Caution:
ترجمه ماشینی به خودی خود کافی نیست. بومیسازی نیازمند بررسی گسترده انسانی است تا حداقل استانداردهای کیفیت را رعایت کند.
برای اطمینان از دقت دستور زبان و معنی، اعضای تیم محلیسازی شما باید قبل از انتشار، تمام ترجمههای تولید شده توسط ماشین را با دقت بررسی کنند.
بومی سازی تصاویر SVG
پروژه کوبرنتیز توصیه میکند در صورت امکان از تصاویر برداری (SVG) استفاده کنید، زیرا ویرایش این تصاویر برای تیم محلیسازی بسیار آسانتر است. اگر یک تصویر شطرنجی پیدا کردید که نیاز به بومی سازی دارد، ابتدا نسخه انگلیسی را به صورت تصویر برداری مجدد ترسیم کنید و سپس آن را بومی سازی کنید.
هنگام ترجمه متن درون تصاویر SVG (گرافیک برداری مقیاسپذیر)، پیروی از دستورالعملهای خاص برای اطمینان از دقت و حفظ سازگاری در نسخههای مختلف زبان ضروری است. تصاویر SVG معمولاً در مستندات کوبرنتیز برای نشان دادن مفاهیم، گردشهای کاری و نمودارها استفاده میشوند.
شناسایی متن قابل ترجمه: با شناسایی عناصر متنی درون تصویر SVG که نیاز به ترجمه دارند، شروع کنید. این عناصر معمولاً شامل برچسبها، زیرنویسها، حاشیهنویسیها یا هر متنی هستند که اطلاعات را منتقل میکند.
ویرایش پروندههای SVG: پرونده های SVG مبتنی بر XML هستند، به این معنی که میتوان آنها را با استفاده از یک ویرایشگر متن ویرایش کرد. با این حال، توجه به این نکته مهم است که اکثر تصاویر مستندات در کوبرنتیز از قبل متن را به منحنی تبدیل میکنند تا از مشکلات سازگاری فونت جلوگیری شود. در چنین مواردی، توصیه میشود از نرمافزارهای تخصصی ویرایش SVG مانند Inkscape برای ویرایش استفاده کنید، پرونده SVG را باز کنید و عناصر متنی را که نیاز به ترجمه دارند، پیدا کنید.
ترجمه متن: متن اصلی را با نسخه ترجمه شده به زبان مورد نظر جایگزین کنید. مطمئن شوید که متن ترجمه شده به طور دقیق معنای مورد نظر را منتقل میکند و در فضای موجود در تصویر جای میگیرد. هنگام کار با زبانهایی که از الفبای لاتین استفاده میکنند، باید از خانواده فونت Open Sans استفاده شود. میتوانید فونت Open Sans را از اینجا دریافت کنید: فونت Open Sans.
تبدیل متن به منحنی: همانطور که قبلاً ذکر شد، برای رفع مشکلات سازگاری فونت، توصیه میشود متن ترجمه شده را به منحنی یا مسیر تبدیل کنید. تبدیل متن به منحنی تضمین میکند که تصویر نهایی متن ترجمه شده را به درستی نمایش میدهد، حتی اگر سیستم کاربر فونت دقیق استفاده شده در SVG اصلی را نداشته باشد.
بررسی و آزمایش: پس از انجام ترجمههای لازم و تبدیل متن به منحنی، تصویر SVG بهروزرسانیشده را ذخیره و بررسی کنید تا از نمایش و ترازبندی صحیح متن اطمینان حاصل شود. پیشنمایش تغییرات محلی را بررسی کنید.
پرونده های منبع
بومیسازیها باید بر اساس پرونده های انگلیسی از یک نسخه خاص که توسط تیم بومیسازی هدفگذاری شده است، انجام شوند. هر تیم بومیسازی میتواند تصمیم بگیرد که کدام نسخه را هدف قرار دهد، که در زیر به آن نسخه هدف گفته میشود.
توضیحات بالای پرونده را متناسب با محلیسازی خود اصلاح کنید، سپس مقدار هر رشته را ترجمه کنید. برای مثال، این متن جایگزین به زبان آلمانی برای فرم جستجو است:
[ui_search]
other = "Suchen"
بومیسازی رشتههای سایت به شما امکان میدهد متن و ویژگیهای کل سایت را سفارشی کنید: برای مثال، متن حق نشر قانونی در پاورقی هر صفحه.
راهنمای محلیسازی مختص زبان
به عنوان یک تیم محلیسازی، میتوانید با ایجاد یک راهنمای محلیسازی مختص هر زبان، بهترین شیوههایی را که تیمتان دنبال میکند، رسمی کنید.
واژهنامه اصطلاحات بومیسازیشده و غیربومیسازیشده
قراردادهای نشانهگذاری
اصطلاحات شیء کوبرنتیز API
جلسات زوم مخصوص زبانهای مختلف
اگر پروژه محلیسازی به زمان جلسه جداگانهای نیاز دارد، با یکی از اعضای SIG اسناد یا سرپرست فنی تماس بگیرید تا یک جلسه زوم جدید و دعوتنامه تقویمی ایجاد کنید. این کار فقط زمانی لازم است که تیم به اندازه کافی بزرگ باشد که بتواند از پس آن برآید و به یک جلسه جداگانه نیاز داشته باشد.
طبق سیاست CNCF، تیمهای محلیسازی باید جلسات خود را در لیست پخش یوتیوب SIG اسناد بارگذاری کنند. یکی از روسای مشترک یا سرپرست فنی SIG اسناد میتواند تا زمان خودکارسازی این فرآیند توسط SIG اسناد به آنها کمک کند.
راهبرد شاخه
از آنجا که پروژههای محلیسازی، تلاشهایی بسیار مشارکتی هستند، ما تیمها را تشویق میکنیم که در شاخههای محلیسازی مشترک کار کنند - به خصوص هنگام شروع کار و زمانی که محلیسازی هنوز فعال نشده است.
برای مثال، یک تأییدکننده در یک تیم محلیسازی آلمانی، شاخه محلیسازی dev-1.12-de.1 را مستقیماً در مخزن kubernetes/website، بر اساس شاخه منبع برای کوبرنتیز نسخه ۱.۱۲، باز میکند.
مشارکتکنندگان انفرادی، شاخههای ویژگی را بر اساس شاخه محلیسازی باز میکنند.
برای مثال، یک مشارکتکننده آلمانی یک درخواست ادغام با تغییرات در kubernetes:dev-1.12-de.1 از username:local-branch-name باز میکند.
تأییدکنندگان، شاخههای ویژگی را بررسی و در شاخه محلیسازی ادغام میکنند.
به صورت دورهای، یک تأییدکننده با باز کردن و تأیید یک درخواست ادغام جدید، شاخه محلیسازی را با شاخه منبع خود ادغام میکند. قبل از تأیید درخواست ادغام، حتماً commitها را squash کنید.
مراحل ۱ تا ۴ را در صورت نیاز تا زمان تکمیل بومیسازی تکرار کنید. برای مثال، شاخههای بومیسازی بعدی آلمانی عبارتند از: dev-1.12-de.2، dev-1.12-de.3 و غیره.
تیمها باید محتوای بومیسازیشده را در همان شاخهای که محتوا از آن تهیه شده است، ادغام کنند. برای مثال:
یک شاخه محلیسازی که از شاخه اصلی منبعگیری شده است، باید در شاخه اصلی ادغام شود.
یک شاخه محلیسازی که از release-1.32 منبعگیری شده است، باید در release-1.32 ادغام شود.
Note:
اگر شاخه محلیسازی شما از شاخه اصلی ایجاد شده باشد، اما قبل از ایجاد شاخه انتشار جدید release-1.33 با اصلی ادغام نشده باشد، آن را هم در اصلی و هم در شاخه انتشار جدید release-1.33 ادغام کنید. برای ادغام شاخه محلیسازی خود در شاخه انتشار جدید release-1.33، باید شاخه بالادستی شاخه محلیسازی خود را به release-1.33 تغییر دهید.
در ابتدای هر مرحله از مراحل پیشرفت تیم، باز کردن یک مسئله برای مقایسه تغییرات بالادستی بین شاخه محلیسازی قبلی و شاخه محلیسازی فعلی مفید است. دو اسکریپت برای مقایسه تغییرات بالادستی وجود دارد.
upstream_changes.py برای بررسی تغییرات اعمال شده در یک پرونده خاص مفید است. و
diff_l10n_branches.py برای ایجاد لیستی از پرونده های منسوخ شده برای یک شاخه محلیسازی خاص مفید است.
در حالی که فقط تأییدکنندگان میتوانند یک شاخه محلیسازی جدید باز کنند و درخواستهای ادغام را ادغام کنند، هر کسی میتواند یک درخواست ادغام برای یک شاخه محلیسازی جدید باز کند. هیچ مجوز خاصی لازم نیست.
برای اطلاعات بیشتر در مورد کار از طریق Forkها یا مستقیماً از مخزن، به "مخزن را fork و clone کنید" مراجعه کنید.
مشارکتهای بالادستی
SIG اسناد از مشارکتها و اصلاحات بالادستی در منبع انگلیسی استقبال میکند.