مجموعة Kubernetes HA مع الحاوية. أم أن هناك حياة بدون عامل ميناء؟

نشر kubernetes HA مع الحاوية



مساء الخير عزيزي هبر! في 24 مايو 2018 ، تم نشر مقال بعنوان Kubernetes Containerd Integration Goes GA على مدونة Kubernetes الرسمية ، والتي تنص على أن تكامل الحاوية مع Kubernetes جاهز للإنتاج. أيضا ، نشر رجال من شركة Flant ترجمة للمقال إلى اللغة الروسية على مدونتهم ، مضيفين القليل من التوضيح عن أنفسهم. بعد قراءة وثائق المشروع على github ، قررت تجربة الحاوية على "بشرتي".


شركتنا لديها العديد من المشاريع في مرحلة "لا تزال بعيدة جدا عن الإنتاج". لذلك سيصبحون تجريبينا ؛ بالنسبة لهم ، قررنا محاولة نشر مجموعة تجاوز الفشل من Kubernetes باستخدام الحاوية ومعرفة ما إذا كانت هناك حياة بدون عامل إرساء.


إذا كنت مهتمًا برؤية كيف فعلنا ذلك وما جاء به ، مرحبًا بك في القط.


الوصف التخطيطي والنشر


عند نشر مجموعة ، كالمعتاد ، (كتبت عن هذا في مقال سابق

keepalived - تطبيقات VRRP (Virtual Router Redundancy Protocol) لنظام Linux
تقوم Keepalived بإنشاء IP افتراضي (VIRTIP) والذي "يشير" (ينشئ واجهة فرعية) إلى IP الخاص بأحد الأساتذة الثلاثة. يراقب البرنامج الخفي الذي يتم الاحتفاظ به حالة الماكينة ، وفي حالة حدوث عطل ، يستثني الخادم الفاشل من قائمة الخوادم النشطة عن طريق تحويل VIRTIP إلى IP الخاص بخادم آخر ، وفقًا "للوزن" المحدد عند تكوين الاحتفاظ به على كل خادم.

تتواصل شياطين Keepalived عبر VRRP ، وترسل رسائل بعضها البعض إلى العنوان 224.0.0.18.


إذا لم يقم الجار بإرسال رسالته ، فعندها يعتبر ميتاً. بمجرد أن يبدأ الخادم المعطل في إرسال رسائله إلى الشبكة ، يعود كل شيء إلى مكانه


نقوم بتكوين العمل مع خادم API على عقد kubernetes على النحو التالي.


بعد تثبيت المجموعة ، قم بتكوين kube-proxy ، قم بتغيير المنفذ من 6443 إلى 16443 (التفاصيل أدناه). على كل من الأساتذة ، يتم نشر nginx ، والذي يعمل بمثابة موازن تحميل ، ويستمع على المنفذ 16443 ويقوم بعمل المنبع من جميع الأساتذة الثلاثة على المنفذ 6443 (التفاصيل أدناه).


حقق هذا النظام زيادة في التسامح مع الخطأ باستخدام Keepalived ، وكذلك باستخدام nginx ، وتم تحقيق التوازن بين خوادم API على المعالجات.


في مقال سابق ، وصفت نشر nginx و etcd في عامل الميناء. ولكن في هذه الحالة ، ليس لدينا عامل إرساء ، لذلك سيعمل nginx و etcd محليًا على masternodes.


من الناحية النظرية ، سيكون من الممكن نشر nginx و etcd باستخدام الحاوية ، ولكن في حالة وجود أي مشاكل ، فإن هذا النهج سيعقد التشخيص ، لذلك قررنا عدم تجربته وتشغيله محليًا.


وصف خوادم للنشر:


الاسمIPالخدمات
VIRTIP172.26.133.160------
kube-master01172.26.133.161kubeadm ، kubelet ، kubectl ، etcd ، containerd ، nginx ، keepalived
كوبي ماستر 02172.26.133.162kubeadm ، kubelet ، kubectl ، etcd ، containerd ، nginx ، keepalived
كوبي ماستر 03172.26.133.163kubeadm ، kubelet ، kubectl ، etcd ، containerd ، nginx ، keepalived
kube-node01172.26.133.164kubeadm ، kubelet ، kubectl ، الحاوية
عقدة كوبي 02172.26.133.165kubeadm ، kubelet ، kubectl ، الحاوية
عقدة كوبي 03172.26.133.166kubeadm ، kubelet ، kubectl ، الحاوية

قم بتثبيت kubeadm و kubelet و kubectl والحزم ذات الصلة


تعمل جميع الأوامر من الجذر


sudo -i 

 apt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl unzip tar apt-transport-https btrfs-tools libseccomp2 socat util-linux mc vim keepalived 

تثبيت conteinerd


 cd / wget https://storage.googleapis.com/cri-containerd-release/cri-containerd-1.1.0-rc.0.linux-amd64.tar.gz tar -xvf cri-containerd-1.1.0-rc.0.linux-amd64.tar.gz 

تكوين تكوينات الحاوية


 mkdir -p /etc/containerd nano /etc/containerd/config.toml 

أضف إلى الملف:


 [plugins.cri] enable_tls_streaming = true 

نبدأ conteinerd نتحقق من أن كل شيء على ما يرام


 systemctl enable containerd systemctl start containerd systemctl status containerd ● containerd.service - containerd container runtime Loaded: loaded (/etc/systemd/system/containerd.service; disabled; vendor preset: enabled) Active: active (running) since Mon 2018-06-25 12:32:01 MSK; 7s ago Docs: https://containerd.io Process: 10725 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS) Main PID: 10730 (containerd) Tasks: 15 (limit: 4915) Memory: 14.9M CPU: 375ms CGroup: /system.slice/containerd.service └─10730 /usr/local/bin/containerd Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Get image filesystem path "/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs"" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=error msg="Failed to load cni during init, please check CRI plugin status before setting up network for pods" error="cni con Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="loading plugin "io.containerd.grpc.v1.introspection"..." type=io.containerd.grpc.v1 Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Start subscribing containerd event" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Start recovering state" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg=serving... address="/run/containerd/containerd.sock" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="containerd successfully booted in 0.308755s" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Start event monitor" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Start snapshots syncer" Jun 25 12:32:01 hb-master02 containerd[10730]: time="2018-06-25T12:32:01+03:00" level=info msg="Start streaming server" 

تثبيت وتشغيل وما إلى ذلك


ملاحظة مهمة ، لقد قمت بتثبيت إصدار مجموعة kubernetes 1.10. بعد يومين فقط ، عند كتابة مقال ، تم إصدار الإصدار 1.11. إذا قمت بتثبيت الإصدار 1.11 ، فقم بتعيين المتغير ETCD_VERSION = "v3.2.17" ، إذا كان 1.10 ثم ETCD_VERSION = "v3.1.12".


 export ETCD_VERSION="v3.1.12" curl -sSL https://github.com/coreos/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz | tar -xzv --strip-components=1 -C /usr/local/bin/ 

نسخ التكوينات من gitahab.


 git clone https://github.com/rjeka/k8s-containerd.git cd k8s-containerd 

تكوين المتغيرات في ملف التكوين.


 vim create-config.sh 

وصف متغيرات الملف create-config.sh
 #!/bin/bash # local machine ip address export K8SHA_IPLOCAL=172.26.133.161 # local machine etcd name, options: etcd1, etcd2, etcd3 export K8SHA_ETCDNAME=kube-master01 # local machine keepalived state config, options: MASTER, BACKUP. One keepalived cluster only one MASTER, other's are BACKUP export K8SHA_KA_STATE=MASTER # local machine keepalived priority config, options: 102, 101,100 MASTER must 102 export K8SHA_KA_PRIO=102 # local machine keepalived network interface name config, for example: eth0 export K8SHA_KA_INTF=ens18 ####################################### # all masters settings below must be same ####################################### # master keepalived virtual ip address export K8SHA_IPVIRTUAL=172.26.133.160 # master01 ip address export K8SHA_IP1=172.26.133.161 # master02 ip address export K8SHA_IP2=172.26.133.162 # master03 ip address export K8SHA_IP3=172.26.133.163 # master01 hostname export K8SHA_HOSTNAME1=kube-master01 # master02 hostname export K8SHA_HOSTNAME2=kube-master02 # master03 hostname export K8SHA_HOSTNAME3=kube-master03 # keepalived auth_pass config, all masters must be same export K8SHA_KA_AUTH=56cf8dd754c90194d1600c483e10abfr #etcd tocken: export ETCD_TOKEN=9489bf67bdfe1b3ae077d6fd9e7efefd # kubernetes cluster token, you can use 'kubeadm token generate' to get a new one export K8SHA_TOKEN=535tdi.utzk5hf75b04ht8l # kubernetes CIDR pod subnet, if CIDR pod subnet is "10.244.0.0/16" please set to "10.244.0.0\\/16" export K8SHA_CIDR=10.244.0.0\\/16 

الإعدادات على الجهاز المحلي لكل عقدة (كل عقدة لها الخاصة بها)
K8SHA_IPLOCAL - عنوان IP للعقدة التي تم تكوين البرنامج النصي عليها
K8SHA_ETCDNAME - اسم الجهاز المحلي في مجموعة ETCD
K8SHA_KA_STATE - دور في Keepalived . عقدة رئيسية واحدة ، وجميع النسخ الاحتياطية الأخرى.
K8SHA_KA_PRIO - الأولوية المحجوزة ، لدى الماجستير 102 للأرقام المتبقية 101 ، 100. عندما يسقط الرئيسي ذو الرقم 102 ، تأخذ العقدة برقم 101 مكانها وهكذا.
K8SHA_KA_INTF - واجهة شبكة محفوظة . سيتم الاستماع إلى اسم الواجهة التي يتم الاحتفاظ بها.


الإعدادات العامة لجميع ماسترنودس هي نفسها:


K8SHA_IPVIRTUAL = 172.26.133.160 - IP الظاهري للكتلة.
K8SHA_IP1 ... K8SHA_IP3 - عناوين IP للسادة
K8SHA_HOSTNAME1 ... K8SHA_HOSTNAME3 - أسماء المضيفين للماسترنودز. نقطة مهمة ، بهذه الأسماء ستولد kubeadm الشهادات.
K8SHA_KA_AUTH - كلمة المرور لحفظها . يمكنك تحديد أي
K8SHA_TOKEN - رمز الكتلة. يمكن إنشاؤها باستخدام الأمر إنشاء رمز مميز kubeadm
K8SHA_CIDR - عنوان الشبكة الفرعية للمداخن . يمكنني استخدام الفانيلا حتى CIDR 0.244.0.0/16. تأكد من الشاشة - في التكوين يجب أن يكون K8SHA_CIDR = 10.244.0.0 \ / 16


قم بتشغيل البرنامج النصي الذي سيقوم بتكوين nginx و keepalived و etcd و kubeadmin


 ./create-config.sh 

نبدأ إلخ.


وما إلى ذلك رفعت بدون TLS. إذا كنت بحاجة إلى tls ، فسيتم كتابته بالتفصيل في وثائق kubernetes الرسمية كيفية إنشاء شهادات لـ etcd.


 systemctl daemon-reload && systemctl start etcd && systemctl enable etcd 

فحص الحالة


 etcdctl cluster-health member ad059013ec46f37 is healthy: got healthy result from http://192.168.5.49:2379 member 4d63136c9a3226a1 is healthy: got healthy result from http://192.168.4.169:2379 member d61978cb3555071e is healthy: got healthy result from http://192.168.4.170:2379 cluster is healthy etcdctl member list ad059013ec46f37: name=hb-master03 peerURLs=http://192.168.5.48:2380 clientURLs=http://192.168.5.49:2379,http://192.168.5.49:4001 isLeader=false 4d63136c9a3226a1: name=hb-master01 peerURLs=http://192.168.4.169:2380 clientURLs=http://192.168.4.169:2379,http://192.168.4.169:4001 isLeader=true d61978cb3555071e: name=hb-master02 peerURLs=http://192.168.4.170:2380 clientURLs=http://192.168.4.170:2379,http://192.168.4.170:4001 isLeader=false 

إذا كان كل شيء على ما يرام ، فانتقل إلى الخطوة التالية.


تكوين kubeadmin
إذا كنت تستخدم الإصدار 1.11 من kubeadm ، فيمكنك تخطي هذه الخطوة
لكي تبدأ kybernetes في العمل ليس مع عامل الميناء ، ولكن مع الحاوية ، قم بتكوين kubeadmin config


 vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 

بعد [الخدمة] أضف خطًا إلى الكتلة


 Environment="KUBELET_EXTRA_ARGS=--runtime-cgroups=/system.slice/containerd.service --container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock" 

يجب أن يبدو التكوين بالكامل كما يلي:
 [Service] Environment="KUBELET_EXTRA_ARGS=--runtime-cgroups=/system.slice/containerd.service --container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock" Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true" Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin" Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local" Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt" Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0" Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki" ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS 

إذا قمت بتثبيت الإصدار 1.11 وتريد تجربة CoreDNS بدلاً من kube-dns واختبار التكوين الديناميكي ، قم بإلغاء تعليق الكتلة التالية في ملف التكوين kubeadm-init.yaml:


 feature-gates: DynamicKubeletConfig: true CoreDNS: true 

إعادة تشغيل kubelet


 systemctl daemon-reload && systemctl restart kubelet 

تهيئة المعالج الأول


قبل بدء kubeadm ، تحتاج إلى إعادة تشغيل Keepalived والتحقق من حالتها


 systemctl restart keepalived.service systemctl status keepalived.service ● keepalived.service - Keepalive Daemon (LVS and VRRP) Loaded: loaded (/lib/systemd/system/keepalived.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2018-06-27 10:40:03 MSK; 1min 44s ago Process: 4589 ExecStart=/usr/sbin/keepalived $DAEMON_ARGS (code=exited, status=0/SUCCESS) Main PID: 4590 (keepalived) Tasks: 7 (limit: 4915) Memory: 15.3M CPU: 968ms CGroup: /system.slice/keepalived.service ├─4590 /usr/sbin/keepalived ├─4591 /usr/sbin/keepalived ├─4593 /usr/sbin/keepalived ├─5222 /usr/sbin/keepalived ├─5223 sh -c /etc/keepalived/check_apiserver.sh ├─5224 /bin/bash /etc/keepalived/check_apiserver.sh └─5231 sleep 5 

تحقق مما إذا كان الأصوات VIRTIP


 ping -c 4 172.26.133.160 PING 172.26.133.160 (172.26.133.160) 56(84) bytes of data. 64 bytes from 172.26.133.160: icmp_seq=1 ttl=64 time=0.030 ms 64 bytes from 172.26.133.160: icmp_seq=2 ttl=64 time=0.050 ms 64 bytes from 172.26.133.160: icmp_seq=3 ttl=64 time=0.050 ms 64 bytes from 172.26.133.160: icmp_seq=4 ttl=64 time=0.056 ms --- 172.26.133.160 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3069ms rtt min/avg/max/mdev = 0.030/0.046/0.056/0.012 ms 

بعد ذلك ، قم بتشغيل kubeadmin. تأكد من تضمين الخط - skip-preflight-check. ستفشل Kubeadmin افتراضيًا في البحث عن عامل إرساء وبدون تخطي عمليات التحقق مع وجود خطأ.


 kubeadm init --config=kubeadm-init.yaml --skip-preflight-checks 

بعد عمل kubeadm ، احفظ الخط الذي تم إنشاؤه. ستكون هناك حاجة لإدخال عقد العمل في الكتلة.


 kubeadm join 172.26.133.160:6443 --token XXXXXXXXXXXXXXXXXXXXXXXXX --discovery-token-ca-cert-hash sha256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

بعد ذلك ، وضح مكان تخزين ملف admin.conf
إذا عملنا كجذر ثم:


 vim ~/.bashrc export KUBECONFIG=/etc/kubernetes/admin.conf source ~/.bashrc 

بالنسبة لمستخدم بسيط ، اتبع التعليمات التي تظهر على الشاشة.


 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 

أضف معالجات أخرى إلى الكتلة. للقيام بذلك ، انسخ الشهادات من kube-master01 إلى kube-master02 و kube-master03 إلى الدليل / etc / kubernetes /. للقيام بذلك ، قمت بتكوين وصول ssh للجذر ، وبعد نسخ الملفات ، أعدت الإعدادات مرة أخرى.


 scp -r /etc/kubernetes/pki 172.26.133.162:/etc/kubernetes/ scp -r /etc/kubernetes/pki 172.26.133.163:/etc/kubernetes/ 

بعد النسخ إلى kube-master02 و kube-master03 ، قم بتشغيل.


 kubeadm init --config=kubeadm-init.yaml --skip-preflight-checks 

قم بتثبيت CIDR الفانيلا


على kube-master01 تنفيذ


 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml 

يمكن العثور على الإصدار الحالي من flanel في وثائق kubernetes .


ننتظر حتى يتم إنشاء جميع الحاويات.


 watch -n1 kubectl get pods --all-namespaces -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE kube-system kube-apiserver-kube-master01 1/1 Running 0 17m 172.26.133.161 kube-master01 kube-system kube-apiserver-kube-master02 1/1 Running 0 6m 172.26.133.162 kube-master02 kube-system kube-apiserver-kube-master03 1/1 Running 0 6m 172.26.133.163 kube-master03 kube-system kube-controller-manager-kube-master01 1/1 Running 0 17m 172.26.133.161 kube-master01 kube-system kube-controller-manager-kube-master02 1/1 Running 0 6m 172.26.133.162 kube-master02 kube-system kube-controller-manager-kube-master03 1/1 Running 0 6m 172.26.133.163 kube-master03 kube-system kube-dns-86f4d74b45-8c24s 3/3 Running 0 17m 10.244.2.2 kube-master03 kube-system kube-flannel-ds-4h4w7 1/1 Running 0 2m 172.26.133.163 kube-master03 kube-system kube-flannel-ds-kf5mj 1/1 Running 0 2m 172.26.133.162 kube-master02 kube-system kube-flannel-ds-q6k4z 1/1 Running 0 2m 172.26.133.161 kube-master01 kube-system kube-proxy-9cjtp 1/1 Running 0 6m 172.26.133.163 kube-master03 kube-system kube-proxy-9sqk2 1/1 Running 0 17m 172.26.133.161 kube-master01 kube-system kube-proxy-jg2pt 1/1 Running 0 6m 172.26.133.162 kube-master02 kube-system kube-scheduler-kube-master01 1/1 Running 0 18m 172.26.133.161 kube-master01 kube-system kube-scheduler-kube-master02 1/1 Running 0 6m 172.26.133.162 kube-master02 kube-system kube-scheduler-kube-master03 1/1 Running 0 6m 172.26.133.163 kube-master03 

نحن نصنع نسخة طبق الأصل من نظام أسماء النطاقات kube إلى جميع الأساتذة الثلاثة


على kube-master01 تنفيذ


 kubectl scale --replicas=3 -n kube-system deployment/kube-dns 

تثبيت وتكوين nginx


في كل عقدة رئيسية ، قم بتثبيت nginx كموازن لـ Kubernetes API
لدي كل آلات الكتلة على ديبيان. من حزم nginx ، لا تدعم وحدة الدفق ، لذا أضف مستودعات nginx وقم بتثبيتها من مستودعات nginx`a. إذا كان لديك نظام تشغيل مختلف ، فراجع وثائق nginx .


 wget https://nginx.org/keys/nginx_signing.key sudo apt-key add nginx_signing.key echo -e "\n#nginx\n\ deb http://nginx.org/packages/debian/ stretch nginx\n\ deb-src http://nginx.org/packages/debian/ stretch nginx" >> /etc/apt/sources.list apt-get update && apt-get install nginx -y 

إنشاء تكوين nginx (إذا لم يكن قد تم إنشاؤه بالفعل)


 ./create-config.sh 

nginx.conf

nginx المستخدم ؛
عمليات العمال


error_log /var/log/nginx/error.log تحذير ؛
pid /var/run/nginx.pid ؛


الأحداث {
العمال_وصلات 1024 ؛
}}


http {
تشمل /etc/nginx/mime.types ؛
تطبيق default_type / دفق ثماني بتات ؛


 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; 

}}


تيار {
apiserver المنبع {
الخادم 172.26.133.161:6443 الوزن = 5 max_fails = 3 fail_timeout = 30s ؛
الخادم 172.26.133.162:6443 الوزن = 5 max_fails = 3 fail_timeout = 30s ؛
الخادم 172.26.133.163:6443 الوزن = 5 max_fails = 3 fail_timeout = 30s ؛


 } server { listen 16443; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass apiserver; } 

}}


نتحقق من أن كل شيء على ما يرام ونطبق التكوين


 nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful systemctl restart nginx systemctl status nginx ● nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2018-06-28 08:48:09 MSK; 22s ago Docs: http://nginx.org/en/docs/ Process: 22132 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 22133 (nginx) Tasks: 2 (limit: 4915) Memory: 1.6M CPU: 7ms CGroup: /system.slice/nginx.service ├─22133 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf └─22134 nginx: worker process 

اختبار الموازن


 curl -k https://172.26.133.161:16443 | wc -l % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 233 100 233 0 0 12348 0 --:--:-- --:--:-- --:--:-- 12944 

تكوين وكيل kube للعمل مع الموازن


بعد تكوين الموازن ، قم بتحرير المنفذ في إعدادات kubernetes.


 kubectl edit -n kube-system configmap/kube-proxy 

قم بتغيير إعدادات الخادم إلى https://172.26.133.160:16443
بعد ذلك ، تحتاج إلى تكوين وكيل kube للعمل مع المنفذ الجديد


 kubectl get pods --all-namespaces -o wide | grep proxy kube-system kube-proxy-9cjtp 1/1 Running 1 22h 172.26.133.163 kube-master03 kube-system kube-proxy-9sqk2 1/1 Running 1 22h 172.26.133.161 kube-master01 kube-system kube-proxy-jg2pt 1/1 Running 4 22h 172.26.133.162 kube- 

نحذف جميع القرون ، بعد إزالتها ، يتم إعادة إنشائها تلقائيًا باستخدام الإعدادات الجديدة


 kubectl delete pod -n kube-system kube-proxy-XXX ```bash    .      ```bash kubectl get pods --all-namespaces -o wide | grep proxy kube-system kube-proxy-hqrsw 1/1 Running 0 33s 172.26.133.161 kube-master01 kube-system kube-proxy-kzvw5 1/1 Running 0 47s 172.26.133.163 kube-master03 kube-system kube-proxy-zzkz5 1/1 Running 0 7s 172.26.133.162 kube-master02 

إضافة عقد العمل إلى الكتلة


في كل ملاحظة جذرية ، قم بتنفيذ الأمر الذي تم إنشاؤه بواسطة kubeadm


 kubeadm join 172.26.133.160:6443 --token XXXXXXXXXXXXXXXXXXXXXXXXX --discovery-token-ca-cert-hash sha256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --cri-socket /run/containerd/containerd.sock --skip-preflight-checks 

إذا كان الخط "مفقودًا" ، فأنت بحاجة إلى إنشاء خط جديد


 kubeadm token generate kubeadm token create <generated-token> --print-join-command --ttl=0 

حول عقد العمل في ملفات /etc/kubernetes/bootstrap-kubelet.conf و /etc/kubernetes/kubelet.conf
قيمة الخادم المتغيرة لدينا


 vim /etc/kubernetes/bootstrap-kubelet.conf server: https://172.26.133.60:16443 vim /etc/kubernetes/kubelet.conf server: https://172.26.133.60:16443 

وإعادة تشغيل الحاوية و kubernetes


 systemctl restart containerd kubelet 

تركيب لوحة القيادة


 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml 

إنشاء مستخدم بامتيازات المسؤول:


 kubectl apply -f kube-dashboard/dashboard-adminUser.yaml 

نحصل على الرمز المميز للدخول:


 kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') 

تكوين الوصول إلى لوحة القيادة عبر NodePort على VIRTIP


 kubectl -n kube-system edit service kubernetes-dashboard 

نستبدل قيمة النوع: ClusterIP بالنوع: NodePort وفي قسم المنفذ: أضف قيمة nodePort: 30000 (أو المنفذ في النطاق 30000 إلى 32000 الذي تريد الوصول إلى اللوحة عليه):



اللوحة متاحة الآن على https: // VIRTIP: 30000


هيبستر


بعد ذلك ، قم بتثبيت Heapster ، وهي أداة للحصول على مقاييس لمكونات الكتلة.


التثبيت:


 git clone https://github.com/kubernetes/heapster.git cd heapster kubectl create -f deploy/kube-config/influxdb/ kubectl create -f deploy/kube-config/rbac/heapster-rbac.yaml 

الاستنتاجات


لم ألاحظ أي مشاكل خاصة عند العمل مع الحاوية. مرة واحدة كان هناك خلل غير مفهوم مع الموقد بعد إزالة الانتشار. يعتقد Kubernetes أنه تم حذف تحت ، ولكن أصبح تحت "غيبوبة" غريبة. بقيت موجودة على العقدة ، ولكن في الوضع الممتد.


أعتقد أن Containerd أكثر توجهاً كوقت تشغيل للحاويات لـ kubernetes. على الأرجح ، في المستقبل ، كبيئة لإطلاق الخدمات الصغيرة في Kubernetes ، سيكون من الممكن والضروري استخدام بيئات مختلفة سيتم توجيهها لمهام ومشاريع مختلفة ، إلخ.


يتطور المشروع بسرعة كبيرة. بدأت Alibaba Cloud في استخدام conatinerd بنشاط وتؤكد أنها البيئة المثالية لتشغيل الحاويات.


وفقًا للمطورين ، فإن تكامل الحاوية في منصة Google السحابية Kubernetes يعادل الآن تكامل Docker.


مثال جيد لأداة وحدة التحكم crictl . سأعطيك أيضًا بعض الأمثلة من المجموعة التي تم إنشاؤها:


 kubectl describe nodes | grep "Container Runtime Version:" 


تفتقر Docker CLI إلى المفاهيم الأساسية لـ Kubernetes ، على سبيل المثال ، pod ومساحة الاسم ، بينما يدعم crictl هذه المفاهيم


 crictl pods 


وإذا لزم الأمر ، يمكننا إلقاء نظرة على الحاويات بالتنسيق المعتاد ، مثل عامل الميناء


 crictl ps 


يمكننا أن نرى الصور الموجودة على العقدة


 crictl images 


كما اتضح أن الحياة بدون عامل ميناء هي :)


من السابق لأوانه الحديث عن الأخطاء ومواطن الخلل ، تعمل المجموعة معنا لمدة أسبوع تقريبًا. في المستقبل القريب سيتم نقل الاختبار إليه ، وفي حالة النجاح ، على الأرجح موقف ديف لأحد المشاريع. هناك فكرة عن هذا لكتابة سلسلة من المقالات التي تغطي عمليات DevOps ، مثل: إنشاء مجموعة ، وإعداد وحدة تحكم في الإدخال ونقلها إلى عقد عنقودية منفصلة ، وأتمتة تجميع الصور ، والتحقق من الصور بحثًا عن نقاط الضعف ، والنشر ، إلخ. في هذه الأثناء ، سننظر في استقرار العمل ، ونبحث عن الأخطاء ونطور منتجات جديدة.


أيضًا ، هذا الدليل مناسب لنشر مجموعة تجاوز الفشل مع عامل الإرساء ، ما عليك سوى تثبيت عامل الإرساء وفقًا للتعليمات الواردة من وثائق Kubernetes الرسمية وتخطي الخطوات لتثبيت الحاوية وتكوين تهيئة kubeadm.


أو يمكنك وضع الحاوية والرسو في نفس الوقت على نفس المضيف ، وكما يؤكد المطورون ، سيعملون معًا بشكل مثالي. إن الحاوية هي بيئة إطلاق حاويات konbernetes ، والمرسى يشبه عامل الميناء تمامًا)))




يحتوي مستودع الحاوية على دليل تشغيل غير مرغوب فيه لإعداد مجموعة أحادية المعالج. ولكن كان الأمر أكثر إثارة للاهتمام بالنسبة لي أن "أرفع" النظام بيدي لكي أفهم بمزيد من التفصيل تكوين كل مكون وفهم كيفية عمله عمليًا.

ربما في يوم من الأيام ستصل يدي ، وسأكتب كتاب اللعب الخاص بي لنشر مجموعة مع HA ، حيث قمت خلال الأشهر الستة الماضية بنشر أكثر من اثني عشر منها ، وربما حان الوقت لأتمتة العملية.


أيضا ، أثناء كتابة هذا المقال ، تم إصدار النسخة kubernetes 1.11. يمكنك أن تقرأ عن التغييرات الرئيسية في مدونة Flant أو في مدونة kubernetes الرسمية . قمنا بتحديث مجموعات الاختبار إلى الإصدار 1.11 واستبدلنا kube-dns بـ CoreDNS. بالإضافة إلى ذلك ، قمنا بتضمين وظيفة DynamicKubeletConfig لاختبار إمكانات التحديث الديناميكي للتكوينات.


المواد المستخدمة:



شكرا للقراءة حتى النهاية.


نظرًا لأن المعلومات حول kubernetes ، خاصةً حول العناقيد التي تعمل في ظروف حقيقية ، نادرة جدًا في RuNet ، فإن مؤشرات عدم الدقة موضع ترحيب ، وكذلك التعليقات على مخطط نشر المجموعة العام. سأحاول أخذها في الاعتبار وإجراء التصحيحات المناسبة. وأنا على استعداد دائم للإجابة على الأسئلة في التعليقات ، على githab وفي أي شبكات اجتماعية مذكورة في ملفي الشخصي.


مع خالص التقدير ، يوجين.

Source: https://habr.com/ru/post/ar415601/


All Articles