الجزء 2/3 هنا
الجزء 3/3 هنا
مرحبا بالجميع! في هذه المقالة ، أريد تبسيط المعلومات ومشاركة تجربة إنشاء واستخدام الكتلة الداخلية Kubernetes.
على مدار الأعوام القليلة الماضية ، اتخذت تقنية تزامن الحاويات هذه خطوة كبيرة إلى الأمام وأصبحت نوعًا من معايير الشركات لآلاف الشركات. يستخدمه البعض في الإنتاج ، بينما يقوم الآخرون فقط باختباره على المشروعات ، لكن العواطف المحيطة به ، بغض النظر عن رأيك ، تتوهج بجدية. إذا لم تستخدمها من قبل ، فقد حان الوقت لبدء المواعدة.
0. مقدمة
Kubernetes هي تقنية تزامن قابلة للتطوير يمكن أن تبدأ بالتثبيت على عقدة واحدة وتصل إلى حجم مجموعات HA الضخمة استنادًا إلى عدة مئات من العقد داخلها. يوفر معظم مزودي الخدمات السحابية الشعبية أنواعًا مختلفة من تطبيقات Kubernetes - خذها واستخدمها. لكن المواقف مختلفة ، وهناك شركات لا تستخدم السحب ، وهي تريد الحصول على جميع مزايا تقنيات الأوركسترا الحديثة. وهنا يأتي تركيب Kubernetes على المعدن العاري.

1. مقدمة
في هذا المثال ، سنقوم بإنشاء كتلة Kubernetes HA مع طوبولوجيا لعدة أساتذة ، مع مجموعة خارجية وغيرها كطبقة أساسية وموازن تحميل MetalLB بداخله. في جميع عقد العمل ، سنقوم بنشر GlusterFS كوحدة تخزين نظامية داخلية موزعة بسيطة. سنحاول أيضًا نشر العديد من مشروعات الاختبار باستخدام سجل Docker الشخصي الخاص بنا.
بشكل عام ، هناك عدة طرق لإنشاء مجموعة Kubernetes HA: المسار الصعب والمتعمق الموصوف في مستند kubernetes-the-hard-popular ، أو الطريقة الأبسط باستخدام الأداة المساعدة kubeadm .
Kubeadm هي أداة تم إنشاؤها بواسطة مجتمع Kubernetes خصيصًا لتبسيط عملية تثبيت Kubernetes وتسهيل العملية. في وقت سابق ، تم التوصية Kubeadm فقط لإنشاء مجموعات اختبار صغيرة مع عقدة رئيسية واحدة ، للبدء. ولكن على مدار العام الماضي ، تم تحسين الكثير ، والآن يمكننا استخدامه لإنشاء مجموعات HA مع العديد من العقد الرئيسية. وفقًا لأخبار مجتمع Kubernetes ، في المستقبل ، سيتم التوصية Kubeadm كأداة لتثبيت Kubernetes.
تقدم وثائق Kubeadm طريقتين أساسيتين لتنفيذ مجموعة ، مع طبولوجيا مكدس وغيرها. سأختار المسار الثاني مع العقد الخارجية الأخرى بسبب التسامح مع الخطأ في مجموعة HA.
فيما يلي رسم تخطيطي من وثائق Kubeadm التي تصف هذا المسار:

سوف أغيره قليلا. أولاً ، سأستخدم زوجًا من خوادم HAProxy كموازين تحميل مع حزمة Heartbeat ، التي ستشارك عنوان IP الظاهري. تستخدم Heartbeat و HAProxy كمية صغيرة من موارد النظام ، لذلك سأضعها على زوج من العقد الأخرى لتقليل عدد الخوادم في نظامنا قليلاً.
لهذا المخطط نظام Kubernetes ، مطلوب ثماني العقد. ثلاثة خوادم لمجموعة خارجية وغيرها (ستستخدم خدمات LB أيضًا اثنين منهم) ، واثنان للعقد في مستوى التحكم (العقد الرئيسية) ، وثلاثة للعُقد العاملة. يمكن أن يكون إما المعدن عارية أو خادم VM. في هذه الحالة ، لا يهم. يمكنك بسهولة تغيير المخطط عن طريق إضافة المزيد من العقد الرئيسية ووضع HAProxy مع Heartbeat على عقد منفصلة ، إذا كان هناك الكثير من الخوادم المجانية. على الرغم من أن الخيار الأول للتطبيق الأول لمجموعة HA يكفي للعينين.
إذا أردت ، أضف خادمًا صغيرًا به الأداة المساعدة kubectl مثبتة لإدارة هذه المجموعة أو استخدم سطح مكتب Linux الخاص بك لهذا الغرض.
سيبدو الشكل التوضيحي لهذا المثال كما يلي:

2. المتطلبات
ستحتاج إلى عقدتين رئيسيتين في Kubernetes مع الحد الأدنى من متطلبات النظام الموصى بها: وحدتي CPU و 2 جيجابايت من ذاكرة الوصول العشوائي وفقًا لوثائق kubeadm . بالنسبة إلى عقد العمل ، أوصي باستخدام خوادم أكثر قوة ، حيث سنقوم بتشغيل جميع خدمات التطبيقات لدينا عليها. وبالنسبة إلى Etcd + LB ، يمكننا أيضًا أخذ خوادم مزودة بوحدتين من وحدات المعالجة المركزية وذاكرة وصول عشوائي لا تقل عن 2 جيجابايت.
حدد شبكة عامة أو شبكة خاصة لهذه الكتلة ؛ عناوين IP لا يهم ؛ من المهم أن تكون جميع الخوادم قابلة للوصول لبعضها البعض ، وبالطبع لك. في وقت لاحق ، داخل مجموعة Kubernetes ، سنقوم بإنشاء شبكة تراكب.
الحد الأدنى من المتطلبات لهذا المثال هي:
- 2 خوادم مع 2 المعالجات و 2 غيغابايت من ذاكرة الوصول العشوائي للعقدة الرئيسية
- 3 خوادم مع 4 معالجات و 4-8 جيجابايت من ذاكرة الوصول العشوائي للعقد العمل
- 3 خوادم مع معالجات 2 و 2 غيغابايت من ذاكرة الوصول العشوائي ل Etcd و HAProxy
- 192.168.0.0/24 - الشبكة الفرعية.
192.168.0.1 - عنوان IP الظاهري HAProxy ، 192.168.0.2 - 4 عناوين IP الرئيسية لعقد Etcd و HAProxy ، 192.168.0.5 - 6 عناوين IP الرئيسية للعقدة الرئيسية Kubernetes ، 192.168.0.7 - 9 عناوين IP الرئيسية لعُقد عمل Kubernetes .
يتم تثبيت قاعدة بيانات دبيان 9 على جميع الخوادم.
تذكر أيضًا أن متطلبات النظام تعتمد على حجم الكتلة وقوتها. لمزيد من المعلومات ، راجع وثائق Kubernetes.
3. تكوين هابروكسي ونبضات القلب.
لدينا أكثر من عقدة Kubernetes الرئيسية ، وبالتالي تحتاج إلى تكوين موازن تحميل HAProxy أمامهم - لتوزيع حركة المرور. سيكون هذا زوجًا من خوادم HAProxy مع عنوان IP ظاهري مشترك واحد. يتم توفير التسامح مع الخطأ مع حزمة Heartbeat. للنشر ، سوف نستخدم أول اثنين من الخوادم.
تثبيت وتكوين HAProxy مع Heartbeat على خوادم الخوادم الأولى والثانية (192.168.0.2–3 في هذا المثال):
etcd1# apt-get update && apt-get upgrade && apt-get install -y haproxy etcd2# apt-get update && apt-get upgrade && apt-get install -y haproxy
حفظ التكوين الأصلي وإنشاء تكوين جديد:
etcd1# mv /etc/haproxy/haproxy.cfg{,.back} etcd1# vi /etc/haproxy/haproxy.cfg etcd2# mv /etc/haproxy/haproxy.cfg{,.back} etcd2# vi /etc/haproxy/haproxy.cfg
أضف خيارات التكوين هذه لكلا HAProxy:
global user haproxy group haproxy defaults mode http log global retries 2 timeout connect 3000ms timeout server 5000ms timeout client 5000ms frontend kubernetes bind 192.168.0.1:6443 option tcplog mode tcp default_backend kubernetes-master-nodes backend kubernetes-master-nodes mode tcp balance roundrobin option tcp-check server k8s-master-0 192.168.0.5:6443 check fall 3 rise 2 server k8s-master-1 192.168.0.6:6443 check fall 3 rise 2
كما ترون ، تشترك كل من خدمات HAProxy في عنوان IP - 192.168.0.1. سينتقل عنوان IP الظاهري هذا بين الخوادم ، لذلك سنكون مبكرين قليلاً ونمكّن المعلمة net.ipv4.ip_nonlocal_bind للسماح بربط خدمات النظام بعنوان IP غير محلي.
أضف هذه الميزة إلى ملف /etc/sysctl.conf :
etcd1# vi /etc/sysctl.conf net.ipv4.ip_nonlocal_bind=1 etcd2# vi /etc/sysctl.conf net.ipv4.ip_nonlocal_bind=1
تعمل على الخادمين:
sysctl -p
قم أيضًا بتشغيل HAProxy على كلا الخادمين:
etcd1# systemctl start haproxy etcd2# systemctl start haproxy
تأكد من تشغيل HAProxy والاستماع إلى عنوان IP الظاهري على كلا الخادمين:
etcd1# netstat -ntlp tcp 0 0 192.168.0.1:6443 0.0.0.0:* LISTEN 2833/haproxy etcd2# netstat -ntlp tcp 0 0 192.168.0.1:6443 0.0.0.0:* LISTEN 2833/haproxy
هود! الآن تثبيت Heartbeat وتكوين IP الظاهري هذا.
etcd1# apt-get -y install heartbeat && systemctl enable heartbeat etcd2# apt-get -y install heartbeat && systemctl enable heartbeat
لقد حان الوقت لإنشاء العديد من ملفات التكوين الخاصة بها: بالنسبة للخوادم الأولى والثانية ، ستكون هي نفسها بشكل أساسي.
قم أولاً بإنشاء الملف /etc/ha.d/authkeys ، في هذا الملف يخزن Heartbeat البيانات للمصادقة المتبادلة. يجب أن يكون الملف هو نفسه على الخادمين:
# echo -n securepass | md5sum bb77d0d3b3f239fa5db73bdf27b8d29a etcd1# vi /etc/ha.d/authkeys auth 1 1 md5 bb77d0d3b3f239fa5db73bdf27b8d29a etcd2# vi /etc/ha.d/authkeys auth 1 1 md5 bb77d0d3b3f239fa5db73bdf27b8d29a
يجب أن يكون هذا الملف متاحًا للجذر فقط:
etcd1# chmod 600 /etc/ha.d/authkeys etcd2# chmod 600 /etc/ha.d/authkeys
قم الآن بإنشاء ملف التكوين الرئيسي لـ Heartbeat على كلا الخادمين: لكل خادم سيكون مختلفًا قليلاً.
إنشاء /etc/ha.d/ha.cf :
etcd1
etcd1# vi /etc/ha.d/ha.cf # keepalive: how many seconds between heartbeats # keepalive 2 # # deadtime: seconds-to-declare-host-dead # deadtime 10 # # What UDP port to use for udp or ppp-udp communication? # udpport 694 bcast ens18 mcast ens18 225.0.0.1 694 1 0 ucast ens18 192.168.0.3 # What interfaces to heartbeat over? udp ens18 # # Facility to use for syslog()/logger (alternative to log/debugfile) # logfacility local0 # # Tell what machines are in the cluster # node nodename ... -- must match uname -n node etcd1_hostname node etcd2_hostname
etcd2
etcd2# vi /etc/ha.d/ha.cf # keepalive: how many seconds between heartbeats # keepalive 2 # # deadtime: seconds-to-declare-host-dead # deadtime 10 # # What UDP port to use for udp or ppp-udp communication? # udpport 694 bcast ens18 mcast ens18 225.0.0.1 694 1 0 ucast ens18 192.168.0.2 # What interfaces to heartbeat over? udp ens18 # # Facility to use for syslog()/logger (alternative to vlog/debugfile) # logfacility local0 # # Tell what machines are in the cluster # node nodename ... -- must match uname -n node etcd1_hostname node etcd2_hostname
احصل على معلمات "العقدة" لهذا التكوين من خلال تشغيل uname -n على خادمي Etcd. استخدم أيضًا اسم بطاقة الشبكة الخاصة بك بدلاً من ens18.
أخيرًا ، تحتاج إلى إنشاء ملف /etc/ha.d/haresources على هذه الخوادم. لكلا الخادمين ، يجب أن يكون الملف هو نفسه. في هذا الملف ، حددنا عنوان IP المشترك الخاص بنا ونحدد العقدة الرئيسية:
etcd1# vi /etc/ha.d/haresources etcd1_hostname 192.168.0.1 etcd2# vi /etc/ha.d/haresources etcd1_hostname 192.168.0.1
عندما يكون كل شيء جاهزًا ، ابدأ تشغيل خدمات Heartbeat على كلا الخادمين وتحقق من أننا تلقينا عنوان IP الظاهري المعلن على العقدة etcd1:
etcd1# systemctl restart heartbeat etcd2# systemctl restart heartbeat etcd1# ip a ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff inet 192.168.0.2/24 brd 192.168.0.255 scope global ens18 valid_lft forever preferred_lft forever inet 192.168.0.1/24 brd 192.168.0.255 scope global secondary
يمكنك التحقق من أن HAProxy يعمل بشكل جيد عن طريق تشغيل nc على 192.168.0.1 6443. يجب أن يكون لديك مهلة لأن واجهة برمجة تطبيقات Kubernetes لم تستمع بعد على جانب الخادم. ولكن هذا يعني أنه تم تكوين HAProxy و Heartbeat بشكل صحيح.
# nc -v 192.168.0.1 6443 Connection to 93.158.95.90 6443 port [tcp/*] succeeded!
4. إعداد العقد ل Kubernetes
والخطوة التالية هي إعداد جميع العقد Kubernetes. تحتاج إلى تثبيت Docker مع بعض الحزم الإضافية ، وإضافة مستودع Kubernetes وتثبيت حزم kubelet و kubeadm و kubectl منه. هذا الإعداد هو نفسه لكل عقد Kubernetes (رئيسي ، عمال ، إلخ.)
الميزة الرئيسية لـ Kubeadm هي أنه لا توجد حاجة كبيرة لبرامج إضافية. تثبيت kubeadm على جميع المضيفين - واستخدامه ؛ على الأقل توليد شهادات المرجع المصدق.
تثبيت Docker على جميع العقد:
Update the apt package index # apt-get update Install packages to allow apt to use a repository over HTTPS # apt-get -y install \ apt-transport-https \ ca-certificates \ curl \ gnupg2 \ software-properties-common Add Docker's official GPG key # curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - Add docker apt repository # apt-add-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable" Install docker-ce. # apt-get update && apt-get -y install docker-ce Check docker version # docker -v Docker version 18.09.0, build 4d60db4
بعد ذلك ، قم بتثبيت حزم Kubernetes على جميع العقد:
kubeadm
: الأمر لتحميل الكتلة.kubelet
: مكون يعمل على جميع أجهزة الكمبيوتر في المجموعة ويقوم بتنفيذ إجراءات مثل إطلاق الموقد والحاويات.kubectl
: kubectl
سطر الأوامر للتواصل مع الكتلة.- kubectl - في الإرادة ؛ غالبًا ما أقوم بتثبيته على جميع العقد لتشغيل بعض أوامر Kubernetes لتصحيح الأخطاء.
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - Add the Google repository # cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF Update and install packages # apt-get update && apt-get install -y kubelet kubeadm kubectl Hold back packages # apt-mark hold kubelet kubeadm kubectl Check kubeadm version # kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.1", GitCommit:"eec55b9dsfdfgdfgfgdfgdfgdf365bdd920", GitTreeState:"clean", BuildDate:"2018-12-13T10:36:44Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
بعد تثبيت kubeadm والحزم الأخرى ، لا تنسَ تعطيل التبادل.
# swapoff -a # sed -i '/ swap / s/^/#/' /etc/fstab
كرر التثبيت على العقد المتبقية. حزم البرامج هي نفسها لجميع العقد في الكتلة ، والتكوين التالي فقط هو الذي سيحدد الأدوار التي سيتلقونها لاحقًا.
5. تكوين HA Etcd الكتلة
لذلك ، بعد الانتهاء من الاستعدادات ، سنقوم بتكوين مجموعة Kubernetes. سيكون أول لبنة هو نظام HA Etcd ، الذي تم تكوينه أيضًا باستخدام أداة kubeadm.
قبل أن نبدأ ، تأكد من أن جميع العقد الأخرى تتصل عبر المنافذ 2379 و 2380. بالإضافة إلى ذلك ، تحتاج إلى تكوين وصول ssh بينهما لاستخدام scp .
لنبدأ بالعقدة الأولى وغيرها ، ثم انسخ جميع الشهادات وملفات التكوين اللازمة إلى الخوادم الأخرى.
في جميع العقد الأخرى ، تحتاج إلى إضافة ملف تكوين systemd جديد لوحدة kubelet مع أولوية أعلى:
etcd-nodes# cat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf [Service] ExecStart= ExecStart=/usr/bin/kubelet --address=127.0.0.1 --pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true Restart=always EOF etcd-nodes# systemctl daemon-reload etcd-nodes# systemctl restart kubelet
ثم سننتقل عبر ssh إلى أول عقدة etcd - سنستخدمها لإنشاء جميع تكوينات kubeadm اللازمة لكل عقدة etcd ، ثم نسخها.
# Export all our etcd nodes IP's as variables etcd1# export HOST0=192.168.0.2 etcd1# export HOST1=192.168.0.3 etcd1# export HOST2=192.168.0.4 # Create temp directories to store files for all nodes etcd1# mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/ etcd1# ETCDHOSTS=(${HOST0} ${HOST1} ${HOST2}) etcd1# NAMES=("infra0" "infra1" "infra2") etcd1# for i in "${!ETCDHOSTS[@]}"; do HOST=${ETCDHOSTS[$i]} NAME=${NAMES[$i]} cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml apiVersion: "kubeadm.k8s.io/v1beta1" kind: ClusterConfiguration etcd: local: serverCertSANs: - "${HOST}" peerCertSANs: - "${HOST}" extraArgs: initial-cluster: ${NAMES[0]}=https://${ETCDHOSTS[0]}:2380,${NAMES[1]}=https://${ETCDHOSTS[1]}:2380,${NAMES[2]}=https://${ETCDHOSTS[2]}:2380 initial-cluster-state: new name: ${NAME} listen-peer-urls: https://${HOST}:2380 listen-client-urls: https://${HOST}:2379 advertise-client-urls: https://${HOST}:2379 initial-advertise-peer-urls: https://${HOST}:2380 EOF done
الآن قم بإنشاء المرجع المصدق الرئيسي باستخدام kubeadm
etcd1# kubeadm init phase certs etcd-ca
سيقوم هذا الأمر بإنشاء ملفين ca.crt & ca.key في الدليل / etc / kubernetes / pki / etcd / .
etcd1# ls /etc/kubernetes/pki/etcd/ ca.crt ca.key
سنقوم الآن بإنشاء شهادات لجميع العقد الأخرى:
### Create certificates for the etcd3 node etcd1# kubeadm init phase certs etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yaml etcd1# kubeadm init phase certs etcd-peer --config=/tmp/${HOST2}/kubeadmcfg.yaml etcd1# kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yaml etcd1# kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST2}/kubeadmcfg.yaml etcd1# cp -R /etc/kubernetes/pki /tmp/${HOST2}/ ### cleanup non-reusable certificates etcd1# find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete ### Create certificates for the etcd2 node etcd1# kubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yaml etcd1# kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml etcd1# kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml etcd1# kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml etcd1# cp -R /etc/kubernetes/pki /tmp/${HOST1}/ ### cleanup non-reusable certificates again etcd1# find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete ### Create certificates for the this local node etcd1# kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml etcd1 #kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml etcd1# kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml etcd1# kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml # No need to move the certs because they are for this node # clean up certs that should not be copied off this host etcd1# find /tmp/${HOST2} -name ca.key -type f -delete etcd1# find /tmp/${HOST1} -name ca.key -type f -delete
ثم انسخ شهادات وتكوينات kubeadm إلى العقد etcd2 و etcd3 .
قم أولاً بإنشاء زوج من مفاتيح ssh على etcd1 وأضف الجزء العام إلى العقدتين etcd2 و 3 . في هذا المثال ، يتم تنفيذ جميع الأوامر نيابة عن مستخدم يمتلك جميع الحقوق في النظام.
etcd1# scp -r /tmp/${HOST1}/* ${HOST1}: etcd1# scp -r /tmp/${HOST2}/* ${HOST2}: ### login to the etcd2 or run this command remotely by ssh etcd2# cd /root etcd2# mv pki /etc/kubernetes/ ### login to the etcd3 or run this command remotely by ssh etcd3# cd /root etcd3# mv pki /etc/kubernetes/
قبل بدء تشغيل الكتلة etcd ، تأكد من وجود الملفات على جميع العقد:
قائمة الملفات المطلوبة على etcd1 :
/tmp/192.168.0.2 └── kubeadmcfg.yaml --- /etc/kubernetes/pki ├── apiserver-etcd-client.crt ├── apiserver-etcd-client.key └── etcd ├── ca.crt ├── ca.key ├── healthcheck-client.crt ├── healthcheck-client.key ├── peer.crt ├── peer.key ├── server.crt └── server.key
بالنسبة للعقدة etcd2 ، هذا:
/root └── kubeadmcfg.yaml --- /etc/kubernetes/pki ├── apiserver-etcd-client.crt ├── apiserver-etcd-client.key └── etcd ├── ca.crt ├── healthcheck-client.crt ├── healthcheck-client.key ├── peer.crt ├── peer.key ├── server.crt └── server.key
والعقدة الأخيرة هي etcd3 :
/root └── kubeadmcfg.yaml --- /etc/kubernetes/pki ├── apiserver-etcd-client.crt ├── apiserver-etcd-client.key └── etcd ├── ca.crt ├── healthcheck-client.crt ├── healthcheck-client.key ├── peer.crt ├── peer.key ├── server.crt └── server.key
عندما تكون جميع الشهادات والتكوينات في مكانها الصحيح ، فإننا نقوم بإنشاء بيانات. على كل عقدة ، قم بتشغيل الأمر kubeadm - لإنشاء بيان ثابت للكتلة etcd :
etcd1# kubeadm init phase etcd local --config=/tmp/192.168.0.2/kubeadmcfg.yaml etcd1# kubeadm init phase etcd local --config=/root/kubeadmcfg.yaml etcd1# kubeadm init phase etcd local --config=/root/kubeadmcfg.yaml
الآن الكتلة etcd - من الناحية النظرية - تم تكوينها وصحية. تحقق عن طريق تشغيل الأمر التالي على عقدة etcd1:
etcd1# docker run --rm -it \ --net host \ -v /etc/kubernetes:/etc/kubernetes quay.io/coreos/etcd:v3.2.24 etcdctl \ --cert-file /etc/kubernetes/pki/etcd/peer.crt \ --key-file /etc/kubernetes/pki/etcd/peer.key \ --ca-file /etc/kubernetes/pki/etcd/ca.crt \ --endpoints https://192.168.0.2:2379 cluster-health ### status output member 37245675bd09ddf3 is healthy: got healthy result from https://192.168.0.3:2379 member 532d748291f0be51 is healthy: got healthy result from https://192.168.0.4:2379 member 59c53f494c20e8eb is healthy: got healthy result from https://192.168.0.2:2379 cluster is healthy
ارتفع الكتلة etcd ، لذلك المضي قدما.
6. تكوين عقد الماجستير والعمل
قم بتكوين العقد الرئيسية للمجموعة الخاصة بنا - انسخ هذه الملفات من العقدة الأولى إلى العقدة الرئيسية الأولى:
etcd1# scp /etc/kubernetes/pki/etcd/ca.crt 192.168.0.5: etcd1# scp /etc/kubernetes/pki/apiserver-etcd-client.crt 192.168.0.5: etcd1# scp /etc/kubernetes/pki/apiserver-etcd-client.key 192.168.0.5:
ثم انتقل إلى ssh master1 العقدة الرئيسية وقم بإنشاء ملف kubeadm-config.yaml بالمحتويات التالية:
master1# cd /root && vi kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfiguration kubernetesVersion: stable apiServer: certSANs: - "192.168.0.1" controlPlaneEndpoint: "192.168.0.1:6443" etcd: external: endpoints: - https://192.168.0.2:2379 - https://192.168.0.3:2379 - https://192.168.0.4:2379 caFile: /etc/kubernetes/pki/etcd/ca.crt certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt keyFile: /etc/kubernetes/pki/apiserver-etcd-client.key
انقل الشهادات المنسوخة مسبقًا والمفتاح إلى الدليل المناسب على عقدة master1 ، كما هو موضح في وصف الإعداد.
master1# mkdir -p /etc/kubernetes/pki/etcd/ master1# cp /root/ca.crt /etc/kubernetes/pki/etcd/ master1# cp /root/apiserver-etcd-client.crt /etc/kubernetes/pki/ master1# cp /root/apiserver-etcd-client.key /etc/kubernetes/pki/
لإنشاء العقدة الرئيسية الأولى ، قم بما يلي:
master1# kubeadm init --config kubeadm-config.yaml
إذا تم إكمال جميع الخطوات السابقة بشكل صحيح ، فسترى ما يلي:
You can now join any number of machines by running the following on each node as root: kubeadm join 192.168.0.1:6443 --token aasuvd.kw8m18m5fy2ot387 --discovery-token-ca-cert-hash sha256:dcbaeed8d1478291add0294553b6b90b453780e546d06162c71d515b494177a6
قم بنسخ إخراج تهيئة kubeadm هذا إلى أي ملف نصي ، وسوف نستخدم هذا الرمز المميز في المستقبل عندما نعلق العقد الرئيسية الثانية وعقد العمل على نظامنا العنقودي.
لقد سبق أن قلت أن مجموعة Kubernetes ستستخدم نوعًا من شبكة التراكب للمداخن والخدمات الأخرى ، لذلك في هذه المرحلة تحتاج إلى تثبيت نوع من البرنامج المساعد CNI. أوصي البرنامج المساعد نسج CNI . أظهرت التجربة أنها أكثر فائدة وأقل إشكالية ، ولكن يمكنك اختيار واحدة أخرى ، على سبيل المثال ، Calico.
تثبيت المكون الإضافي لشبكة Weave على العقدة الرئيسية الأولى:
master1# kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" The connection to the server localhost:8080 was refused - did you specify the right host or port? serviceaccount/weave-net created clusterrole.rbac.authorization.k8s.io/weave-net created clusterrolebinding.rbac.authorization.k8s.io/weave-net created role.rbac.authorization.k8s.io/weave-net created rolebinding.rbac.authorization.k8s.io/weave-net created daemonset.extensions/weave-net created
انتظر لحظة ، ثم أدخل الأمر التالي للتحقق من أن موقد المكون يبدأ:
master1# kubectl --kubeconfig /etc/kubernetes/admin.conf get pod -n kube-system -w NAME READY STATUS RESTARTS AGE coredns-86c58d9df4-d7qfw 1/1 Running 0 6m25s coredns-86c58d9df4-xj98p 1/1 Running 0 6m25s kube-apiserver-master1 1/1 Running 0 5m22s kube-controller-manager-master1 1/1 Running 0 5m41s kube-proxy-8ncqw 1/1 Running 0 6m25s kube-scheduler-master1 1/1 Running 0 5m25s weave-net-lvwrp 2/2 Running 0 78s
- يوصى بإرفاق العقد الجديدة لمستوى التحكم فقط بعد تهيئة العقدة الأولى.
للتحقق من حالة الكتلة ، قم بما يلي:
master1# kubectl --kubeconfig /etc/kubernetes/admin.conf get nodes NAME STATUS ROLES AGE VERSION master1 Ready master 11m v1.13.1
عظيم! ارتفع العقدة الرئيسية الأولى. أصبح جاهزًا الآن ، وسننتهي من إنشاء مجموعة Kubernetes - سنضيف عقدة رئيسية ثانية وعُقد عمل.
لإضافة عقدة رئيسية ثانية ، قم بإنشاء مفتاح ssh على master1 وإضافة الجزء العام إلى master2 . قم بإجراء تسجيل دخول اختبار ، ثم انسخ بعض الملفات من العقدة الرئيسية الأولى إلى الثانية:
master1# scp /etc/kubernetes/pki/ca.crt 192.168.0.6: master1# scp /etc/kubernetes/pki/ca.key 192.168.0.6: master1# scp /etc/kubernetes/pki/sa.key 192.168.0.6: master1# scp /etc/kubernetes/pki/sa.pub 192.168.0.6: master1# scp /etc/kubernetes/pki/front-proxy-ca.crt @192.168.0.6: master1# scp /etc/kubernetes/pki/front-proxy-ca.key @192.168.0.6: master1# scp /etc/kubernetes/pki/apiserver-etcd-client.crt @192.168.0.6: master1# scp /etc/kubernetes/pki/apiserver-etcd-client.key @192.168.0.6: master1# scp /etc/kubernetes/pki/etcd/ca.crt 192.168.0.6:etcd-ca.crt master1# scp /etc/kubernetes/admin.conf 192.168.0.6: ### Check that files was copied well master2# ls /root admin.conf ca.crt ca.key etcd-ca.crt front-proxy-ca.crt front-proxy-ca.key sa.key sa.pub
على العقدة الرئيسية الثانية ، انقل الشهادات والمفاتيح التي تم نسخها مسبقًا إلى الدلائل المناسبة:
master2# mkdir -p /etc/kubernetes/pki/etcd mv /root/ca.crt /etc/kubernetes/pki/ mv /root/ca.key /etc/kubernetes/pki/ mv /root/sa.pub /etc/kubernetes/pki/ mv /root/sa.key /etc/kubernetes/pki/ mv /root/apiserver-etcd-client.crt /etc/kubernetes/pki/ mv /root/apiserver-etcd-client.key /etc/kubernetes/pki/ mv /root/front-proxy-ca.crt /etc/kubernetes/pki/ mv /root/front-proxy-ca.key /etc/kubernetes/pki/ mv /root/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt mv /root/admin.conf /etc/kubernetes/admin.conf
الاتصال العقدة الرئيسية الثانية إلى الكتلة. للقيام بذلك ، تحتاج إلى إخراج أمر الاتصال الذي تم kubeadm init
مسبقًا إلينا بواسطة kubeadm init
على العقدة الأولى.
قم بتشغيل العقدة الرئيسية master2 :
master2# kubeadm join 192.168.0.1:6443 --token aasuvd.kw8m18m5fy2ot387 --discovery-token-ca-cert-hash sha256:dcbaeed8d1478291add0294553b6b90b453780e546d06162c71d515b494177a6 --experimental-control-plane
- تحتاج إلى إضافة
--experimental-control-plane
. فإنه بأتمتة مرفق البيانات الرئيسية إلى كتلة. بدون هذا العلم ، سيتم ببساطة إضافة عقدة العمل المعتادة.
انتظر قليلاً حتى تنضم العقدة إلى الكتلة وتحقق من حالة المجموعة الجديدة:
master1# kubectl --kubeconfig /etc/kubernetes/admin.conf get nodes NAME STATUS ROLES AGE VERSION master1 Ready master 32m v1.13.1 master2 Ready master 46s v1.13.1
تأكد أيضًا من بدء تشغيل جميع البرامج الصوتية من جميع العقد الرئيسية بشكل طبيعي:
master1# kubectl — kubeconfig /etc/kubernetes/admin.conf get pod -n kube-system -w NAME READY STATUS RESTARTS AGE coredns-86c58d9df4-d7qfw 1/1 Running 0 46m coredns-86c58d9df4-xj98p 1/1 Running 0 46m kube-apiserver-master1 1/1 Running 0 45m kube-apiserver-master2 1/1 Running 0 15m kube-controller-manager-master1 1/1 Running 0 45m kube-controller-manager-master2 1/1 Running 0 15m kube-proxy-8ncqw 1/1 Running 0 46m kube-proxy-px5dt 1/1 Running 0 15m kube-scheduler-master1 1/1 Running 0 45m kube-scheduler-master2 1/1 Running 0 15m weave-net-ksvxz 2/2 Running 1 15m weave-net-lvwrp 2/2 Running 0 41m
عظيم! لقد انتهينا تقريبًا من تكوين نظام Kubernetes. وآخر شيء فعله هو إضافة عقد العمل الثلاث التي أعددناها مسبقًا.
أدخل عقد العمل وقم بتنفيذ أمر انضمام kubeadm بدون --experimental-control-plane
.
worker1-3# kubeadm join 192.168.0.1:6443 --token aasuvd.kw8m18m5fy2ot387 --discovery-token-ca-cert-hash sha256:dcbaeed8d1478291add0294553b6b90b453780e546d06162c71d515b494177a6
تحقق من حالة الكتلة مرة أخرى:
master1# kubectl --kubeconfig /etc/kubernetes/admin.conf get nodes NAME STATUS ROLES AGE VERSION master1 Ready master 1h30m v1.13.1 master2 Ready master 1h59m v1.13.1 worker1 Ready <none> 1h8m v1.13.1 worker2 Ready <none> 1h8m v1.13.1 worker3 Ready <none> 1h7m v1.13.1
كما ترون ، لدينا مجموعة Kubernetes HA مكونة بالكامل مع اثنين من العقد الرئيسية وثلاث عقد عمل. إنه مبني على أساس مجموعة HA etcd مع موازن تحميل آمن من الفشل أمام العقد الرئيسية. يبدو جيدا جدا بالنسبة لي.
7. تكوين إدارة الكتلة عن بعد
هناك إجراء آخر يبقى في الاعتبار في هذا الجزء الأول من المقالة وهو إعداد الأداة المساعدة kubectl عن بُعد لإدارة الكتلة. في السابق ، قمنا بتشغيل جميع الأوامر من master master node master ، ولكن هذا مناسب فقط لأول مرة - عند تكوين الكتلة. سيكون من الجميل تكوين عقدة تحكم خارجية. يمكنك استخدام كمبيوتر محمول أو خادم آخر لهذا الغرض.
تسجيل الدخول إلى هذا الخادم وتشغيل:
Add the Google repository key control# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - Add the Google repository control# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF Update and install kubectl control# apt-get update && apt-get install -y kubectl In your user home dir create control# mkdir ~/.kube Take the Kubernetes admin.conf from the master1 node control# scp 192.168.0.5:/etc/kubernetes/admin.conf ~/.kube/config Check that we can send commands to our cluster control# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready master 6h58m v1.13.1 master2 Ready master 6h27m v1.13.1 worker1 Ready <none> 5h36m v1.13.1 worker2 Ready <none> 5h36m v1.13.1 worker3 Ready <none> 5h36m v1.13.1
حسنًا ، دعنا الآن نجري اختبارًا في مجموعتنا ونتحقق من كيفية عمله.
control# kubectl create deployment nginx --image=nginx deployment.apps/nginx created control# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-5c7588df-6pvgr 1/1 Running 0 52s
مبروك! لقد نشرت للتو Kubernetes. وهذا يعني أن مجموعة HA الجديدة جاهزة. في الواقع ، عملية إنشاء مجموعة Kubernetes باستخدام kubeadm بسيطة وسريعة للغاية.
في الجزء التالي من المقالة ، سنضيف مساحة تخزين داخلية عن طريق إعداد GlusterFS على جميع عقد العمل ، وإعداد موازن حمل داخلي لمجموعة Kubernetes الخاصة بنا ، وأيضًا إجراء اختبارات إجهاد معينة ، وفصل بعض العقد ، والتحقق من الكتلة من أجل الاستقرار.
خاتمة
نعم ، في هذا المثال ، سوف تواجه عددًا من المشكلات. لا داعي للقلق: للتراجع عن التغييرات وإعادة العقد إلى حالتها الأصلية ، ما عليك سوى تشغيل إعادة تعيين kubeadm - سيتم إعادة تعيين التغييرات التي أجراها kubeadm في وقت سابق ، ويمكنك التهيئة مرة أخرى. أيضًا ، لا تنس التحقق من حالة حاويات Docker على عقد نظام المجموعة - تأكد من أنها جميعًا تبدأ وتعمل دون أخطاء. لمزيد من المعلومات حول الحاويات التالفة ، استخدم الأمر docker logs containerid .
هذا كل شيء لهذا اليوم. حظا سعيدا