المحتويات

المقدمة

المشكلة

الحل

المقدمة

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

المشكلة

بعد مرور سنة من الوقت الافتراضي المثبت على نظام Kubernetes cluster، تنتهي صلاحية شهادات العميل. لن تتمكن من الوصول إلى مجموعة Cisco CloudCentre (CCS). على الرغم من أنها ستظل تظهر على الشاشة، لن تتمكن من تسجيل الدخول. إذا انتقلت إلى واجهة سطر أوامر Kubectl، فسترى هذا الخطأ، "يتعذر الاتصال بالخادم: x509: انتهت صلاحية الشهادة أو لم تعد صالحة بعد."

يمكنك تشغيل هذا البرنامج النصي الأساسي لترى تاريخ انتهاء صلاحية شهاداتهم:

for crt in /etc/kubernetes/pki/*.crt; do

printf '%s: %s\n' \

"$(date --date="$(openssl x509 -enddate -noout -in "$crt"|cut -d= -f 2)" --iso-8601)" \

"$crt"

done | sort

يمكنك أيضا العثور على سير عمل OpenSource ل Action Orchestrator الذي سيقوم بمراقبة هذا يوميا وتنبيههم بالمشكلات.

https://github.com/cisco-cx-workflows/cx-ao-shared-workflows/tree/master/CCSCheckKubernetesExpiration__definition_workflow_01E01VIRWZDE24mWlsHrqCGB9xUix0f9ZxG

الحل

يجب إعادة إصدار الشهادات الجديدة عبر Kubeadm عبر نظام المجموعة، ومن ثم يجب إعادة ضم عقد العامل إلى الأساسيات.

1. قم بتسجيل الدخول إلى عقدة رئيسية.

2. احصل على عنوان IP الخاص به عبر عرض عناوين IP.

[root@cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a3 kubernetes]# ip address show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8920 qdisc pfifo_fast state UP group default qlen 1000

link/ether fa:16:3e:19:63:a2 brd ff:ff:ff:ff:ff:ff

inet 192.168.1.20/24 brd 192.168.1.255 scope global dynamic eth0

valid_lft 37806sec preferred_lft 37806sec

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default

link/ether 02:42:d0:29:ce:5e brd ff:ff:ff:ff:ff:ff

inet 172.17.0.1/16 scope global docker0

valid_lft forever preferred_lft forever

13: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1430 qdisc noqueue state UNKNOWN group default qlen 1000

link/ipip 0.0.0.0 brd 0.0.0.0

inet 172.16.176.128/32 brd 172.16.176.128 scope global tunl0

valid_lft forever preferred_lft forever

14: cali65453a0219d@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1430 qdisc noqueue state UP group default

link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 4

3. انتقل إلى دليل Kubernetes عبر القرص المضغوط /etc/kubernetes.

4. قم بإنشاء ملف يسمى kubeadmCERT.yaml عبر vi kubeadmCERT.yaml.

5. يجب أن يبدو الملف كما يلي:

apiVersion: kubeadm.k8s.io/v1alpha1

kind: MasterConfiguration

api:

advertiseAddress: <IP ADDRESS FROM STEP 2>

kubernetesVersion: v1.11.6

#NOTE: If the customer is running a load balancer VM then you must add these lines after...

#apiServerCertSANs:

#- <load balancer IP>

6. قم بإجراء نسخ إحتياطي للشهادات والمفاتيح القديمة. وهذا غير مطلوب ولكن يوصى به. إنشاء دليل نسخ إحتياطي ونسخ هذه الملفات إليه.

#Files

#apiserver.crt

#apiserver.key

#apiserver-kubelet-client.crt

#apiserver-kubelet-client.key

#front-proxy-client.crt

#front-proxy-client.key

#ie

cd /etc/kubernetes/pki

mkdir backup

mv apiserver.key backup/apiserver.key.bak

7. إذا قمت بتخطي الخطوة 6.، يمكنك فقط حذف الملفات السابقة عبر أمر rm مثل rm apiserver.crt.

8. انتقل إلى الخلف حيث يوجد ملف kubeadmCERT.yaml. قم بإنشاء شهادة ترحيل جديدة عبر Kubeadm —config kubeadmCERT.yaml alpha phase piserver.

[root@cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a3 kubernetes]# kubeadm --config kubeadmCERT.yaml alpha phase certs apiserver

[certificates] Generated apiserver certificate and key.

[certificates] apiserver serving cert is signed for DNS names [cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a3 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.1.20]

9. قم بإنشاء شهادة قاعدة بيانات جديدة عبر kubeadm —config kubeadmCERT.yaml alpha phase apiserver-kubelet-client.

10. قم بإنشاء شهادة عميل-وكيل-أمامي جديدة عبر kubeadm —config kubeadmCERT.yaml ألفا المرحلة الأولى-proxy-client.

11. في مجلد /etc/kubernetes، نسخة إحتياطية .conf مبرد. غير مطلوب ولكن موصى به. يجب أن يكون لديك kubelet.conf، controller-manager.conf، scheduler.conf، وربما admin.conf. يمكنك حذفها إذا لم ترغب في نسخها إحتياطيا.

12. قم بإنشاء ملفات تكوين جديدة عبر kubeadm —config kubeadmCERT.yaml alpha phase kubeconfig all.

[root@cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a3 kubernetes]# kubeadm --config kubeadmCERT.yaml alpha phase kubeconfig all

[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"

[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"

[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"

[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"

13. تصدير ملف admin.conf الجديد إلى المضيف.

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config

chmod 777 $HOME/.kube/config

export KUBECONFIG=.kube/config

14. أعد تمهيد العقدة الرئيسية عبر إيقاف التشغيل -r الآن.

15. بمجرد النسخ الاحتياطي للمدير، تحقق مما إذا كان Kubelet يعمل من خلال Kubelet حالة النظام.

16. تحقق من Kubernetes عبر Kubectl احصل على العقد.

[root@cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a3 ~]# kubectl get nodes

NAME                                                       STATUS     ROLES     AGE       VERSION

cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a1   Ready      master    1y        v1.11.6

cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a2   Ready      master    1y        v1.11.6

cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a3   Ready      master    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a1   NotReady   <none>    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a2   NotReady   <none>    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a3   NotReady   <none>    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a4   NotReady   <none>    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a5   NotReady   <none>    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a6   NotReady   <none>    1y        v1.11.6

17. كرر الخطوات من 1 إلى 16. لكل عقدة أساسية.

18. على أساسي واحد، قم بإنشاء رمز مميز جديد للانضمام من خلال إنشاء رمز مميز ل Kubeadm — أمر طباعة-join. انسخ هذا الأمر للاستخدام لاحقا.

[root@cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a1 k8s-mgmt]# kubeadm token create

--print-join-command

kubeadm join 192.168.1.14:6443 --token m1ynvj.f4n3et3poki88ry4

--discovery-token-ca-cert-hash

sha256:4d0c569985c1d460ef74dc01c85740285e4af2c2369ff833eed1ba86e1167575

19. احصل على عناوين IP الخاصة بالعاملين لديك من خلال Kubectl واحصل على العقد - على مساحة عريضة.

20. قم بتسجيل الدخول إلى عامل مثل ssh -i /home/cloud-user/keys/gen3-ao-prod.key cloud-user@192.168.1.17 وتصفح إلى الوصول الجذري.

21. قم بإيقاف خدمة Kubelet عبر SystemCtl stop kubelet.

22. قم بإزالة ملفات التكوين القديمة، والتي تتضمن ca.crt، وkubelet.conf، وbootstrap-kubelet.conf.

rm /etc/kubernetes/pki/ca.crt

rm /etc/kubernetes/kubelet.conf

rm /etc/kubernetes/bootstrap-kubelet.conf

23. الحصول على اسم العقدة من الخطوة 19.

24. قم بإصدار الأمر للعامل لإعادة الانضمام إلى نظام المجموعة. أستخدم الأمر من 18. ولكن إلى النهاية أضف—node-name <name of node>.

[root@cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a1 kubernetes]# kubeadm join 192.168.1.14:6443 --token m1ynvj.f4n3et3poki88ry4 --discovery-token-ca-cert-hash sha256:4d0c569985c1d460ef74dc01c85740285e4af2c2369ff833eed1ba86e1167575 --node-name cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a1

[preflight] running pre-flight checks

[WARNING RequiredIPVSKernelModulesAvailable]: the IPVS proxier will not be used, because the following required kernel modules are not loaded: [ip_vs_rr ip_vs_wrr ip_vs_sh] or no builtin kernel ipvs support: map[ip_vs:{} ip_vs_rr:{} ip_vs_wrr:{} ip_vs_sh:{} nf_conntrack_ipv4:{}]

you can solve this problem with following methods:

1. Run 'modprobe -- ' to load missing kernel modules;

2. Provide the missing builtin kernel ipvs support

I0226 17:59:52.644282   19170 kernel_validator.go:81] Validating kernel version

I0226 17:59:52.644421   19170 kernel_validator.go:96] Validating kernel config

[discovery] Trying to connect to API Server "192.168.1.14:6443"

[discovery] Created cluster-info discovery client, requesting info from "https://192.168.1.14:6443"

[discovery] Requesting info from "https://192.168.1.14:6443" again to validate TLS against the pinned public key

[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.1.14:6443"

[discovery] Successfully established connection with API Server "192.168.1.14:6443"

[kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.11" ConfigMap in the kube-system namespace

[kubelet] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"

[kubelet] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"

[preflight] Activating the kubelet service

[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...

[patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a1" as an annotation

This node has joined the cluster:

* Certificate signing request was sent to master and a response

was received.

* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the master to see this node join the cluster.

25. قم بالخروج من العامل وتحقق من الحالة على مدير عبر Kubectl للحصول على العقد. يجب أن يكون في حالة "جاهز".

26. كرر الخطوات من 20 إلى 25. لكل عامل.

27. يجب أن تظهر العقد الأخيرة في حالة "جاهز"، ثم تعود إلى الإنترنت، ثم تنضم إلى نظام المجموعة.

[root@cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a1 ~]# kubectl get nodes

NAME                                                       STATUS    ROLES     AGE       VERSION

cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a1   Ready     master    1y        v1.11.6

cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a2   Ready     master    1y        v1.11.6

cx-ccs-prod-master-d7f34f25-f524-4f90-9037-7286202ed13a3   Ready     master    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a1   Ready     <none>    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a2   Ready     <none>    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a3   Ready     <none>    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a4   Ready     <none>    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a5   Ready     <none>    1y        v1.11.6

cx-ccs-prod-worker-d7f34f25-f524-4f90-9037-7286202ed13a6   Ready     <none>    1y        v1.11.6