قم بتثبيت Kubernetes على Hetzner Cloud

تم التحديث في 10/01/2020. لقد مر أكثر من عام بقليل منذ كتابة المقال وتوقف عدد من الأمثلة عن العمل - التقنيات تتطور ، لذلك أضفت الأمثلة وأعيد تصميمها قليلاً.

في هذه المقالة ، أود أن أتحدث عن تثبيت Kubernetes على Hetzner Cloud.

تم تثبيت Ubuntu Linux 18.04 على جهاز الكمبيوتر الخاص بي ، وستعني جميع الأمثلة استخدام نظام التشغيل هذا.

للعمل مع Hetzner Cloud وإنشاء مجموعة Kubernetes ، سنستخدم الأداة المساعدة hetzner-kube . قم بتثبيته على جهاز الكمبيوتر المحلي الخاص بك.

$ wget https://github.com/xetys/hetzner-kube/releases/download/0.5.1/hetzner-kube-0.5.1-linux-amd64 $ chmod a+x ./hetzner-kube-0.5.1-linux-amd64 $ sudo mv ./hetzner-kube-0.5.1-linux-amd64 /usr/local/bin/hetzner-kube 

لاستخدام الأداة المساعدة hetzner-kube وتخويلها في Hetzner Cloud ، تحتاج إلى إنشاء Token API من خلال Hetzner Cloud Console https://console.hetzner.cloud . في الجزء العلوي ، حدد تحديد مشروع -> افتراضي ، حدد عنصر الوصول في القائمة اليسرى ، ثم انتقل إلى قسم الرموز المميزة لواجهة برمجة التطبيقات ، وانقر على زر إنشاء رمز مميز لواجهة برمجة التطبيقات.

ونتيجة لذلك ، سيتم إنشاء Token API وسيتعين تحديدها في تكوين الأداة المساعدة hetzner-kube.

 $ hetzner-kube context add k8s Token: <PASTE TOKEN HERE> added context 'k8s' 

بعد ذلك ، نحتاج إلى إنشاء مفتاح SSH سيتم استخدامه للوصول إلى الخوادم في Hetzner Cloud. للقيام بذلك ، استخدم الأداة المساعدة ssh-keygen:

 $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (~/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ~/.ssh/id_rsa. Your public key has been saved in ~/.ssh/id_rsa.pub. The key fingerprint is: SHA256:1bwptZ8lPiAhtA37/2U1G7HsC+aE7qMVCtVIfN3OLzk lx4241@LX4241-LINUX The key's randomart image is: +---[RSA 2048]----+ | +. . . | | ..*o+ . . | | +o=.+ o. | | .+ o +.oo| | .S +.= .*+| | . .+o+E+*| | . o.+==o| | o.+..+.| | .oo.... | +----[SHA256]-----+ 

ونتيجة لذلك ، سيتم إنشاء ملفين ~ / .ssh / id_rsa (مفتاح خاص) و ~ / .ssh / id_rsa.pub (مفتاح عمومي) في دليل منزلك.

أضف مفتاح ssh العام إلى Hetzner Cloud:

 $ hetzner-kube ssh-key add --name k8s sshKeyAdd called SSH key k8s(95430) created 

إن بناء مجموعة Kubernetes مباشرة أمر سهل للغاية:

 $ hetzner-kube cluster create --name k8s --ssh-key k8s --master-count 1 --worker-count 1 2018/08/02 13:57:57 Creating new cluster NAME:k8s MASTERS: 1 WORKERS: 1 ETCD NODES: 0 HA: false ISOLATED ETCD: false 2018/08/02 13:57:58 creating server 'k8s-master-01'... --- [======================================] 100% 2018/08/02 13:58:18 Created node 'k8s-master-01' with IP 159.69.54.228 2018/08/02 13:58:18 creating server 'k8s-worker-01'... --- [======================================] 100% 2018/08/02 13:58:37 Created node 'k8s-worker-01' with IP 159.69.51.140 2018/08/02 13:58:37 sleep for 10s... k8s-master-01 : complete! 100.0% [==============] k8s-worker-01 : complete! 100.0% [==============] 2018/08/02 14:02:50 Cluster successfully created! 

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

لاحقًا ، باستخدام الأداة المساعدة hetzner-kube ، من السهل أيضًا تغيير تكوين مجموعة Kubernetes عن طريق إضافة عقد العامل. على سبيل المثال ، أضف عقدين عاملين:

 $ hetzner-kube cluster add-worker --name k8s --nodes 2 

لسوء الحظ ، لا يمكن حاليًا تغيير تكوين العقدة الرئيسية باستخدام الأداة المساعدة hetzner-kube بدون إعادة بناء مجموعة Kubernetes بالكامل.

يتم استخدام الأداة المساعدة kubectl للعمل مع مجموعة Kubernetes. يمكن العثور على تعليمات مفصلة لتثبيته لأنظمة التشغيل المختلفة على الرابط التالي .

من أجل العمل مع مجموعة Kubernetes التي تم إنشاؤها باستخدام الأمر kubectl ، يجب عليك حفظ تكوين الكتلة التي تم إنشاؤها محليًا على النحو التالي:

 $ hetzner-kube cluster kubeconfig k8s create file kubeconfig configured 

يتم حفظ ملف التكوين في ~ / .kube / config.

الآن دعنا ننتقل إلى الجزء الأكثر إثارة للاهتمام - تكوين مجموعة Kubernetes الناتجة.

للبدء ، سننشئ الموارد الأساسية اللازمة لنشر التطبيق في المستقبل. يمكنك العثور على معلومات أكثر تفصيلاً على الرابط التالي .

 $ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/mandatory.yaml | kubectl apply -f - % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 6170 100 6170 0 0 13987 0 --:--:-- --:--:-- --:--:-- 14022 namespace/ingress-nginx created configmap/nginx-configuration created configmap/tcp-services created configmap/udp-services created serviceaccount/nginx-ingress-serviceaccount created clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created role.rbac.authorization.k8s.io/nginx-ingress-role created rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created deployment.apps/nginx-ingress-controller created limitrange/ingress-nginx created $ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/provider/baremetal/service-nodeport.yaml | kubectl apply -f - service/ingress-nginx created 


علاوة على ذلك ، من الضروري أن يكون جهاز التحكم في الدخول متاحًا لنا من الإنترنت. للقيام بذلك ، استخدم أداة kubectl لتحرير الخدمة / ingress-nginx وإضافتها إلى قائمة عناوين IP العامة للعقدة الرئيسية / العاملة في مجموعة Kubernetes (فقط تلك التي نريد استخدامها لمعالجة الطلبات الواردة من الإنترنت).

 $ kubectl -n ingress-nginx edit service/ingress-nginx 

وإضافة القسم التالي إلى بيان YAML
 spec: externalIPs: - XXXX - YYYY 


أضف سجلات A إلى نطاقك وانتظر حتى تظهر المعلومات المتعلقة بها في CSN. على سبيل المثال:

 Type: A Name: echo.example.com Value: XXXX 


إذا حددت العديد من عناوين IP الخارجية في ingress-nginx.yaml ، فيمكنك إنشاء عدة سجلات DNS متطابقة بعناوين IP هذه. في هذه الحالة ، سيتم توزيع طلبات نطاقك بين عناوين IP هذه وستحدث موازنة التحميل.

في هذا المثال ، لكي يعمل https ، سننشئ شهادة SSL موقعة ذاتيًا.

 $ openssl req -newkey rsa:2048 -nodes -keyout echo.example.com.key -x509 -days 365 -out echo.example.com.crt Generating a 2048 bit RSA private key ..+++ .............+++ writing new private key to 'echo.example.com.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:UA State or Province Name (full name) [Some-State]:Kyiv Locality Name (eg, city) []:Kyiv Organization Name (eg, company) [Internet Widgits Pty Ltd]:Super Company Ltd Organizational Unit Name (eg, section) []:echo.example.com Common Name (eg server FQDN or YOUR name) []:echo.example.com Email Address []:info@echo.example.com $ cat echo.example.com.key | base64 | tr -d '\n' <YOUR PRIVATE KEY> $ cat echo.example.com.crt | base64 | tr -d '\n' <YOUR CERTIFICATE> 


الآن نضيف طلبنا. تم اختيار صدى بسيط كمثال. قم بإنشاء ملف يسمى app.yaml بالمحتويات التالية:

 apiVersion: v1 kind: Namespace metadata: name: echoserver --- apiVersion: v1 kind: Secret metadata: name: echo.example.com-tls namespace: echoserver type: kubernetes.io/tls data: tls.crt: <YOUR CERTIFICATE> tls.key: <YOUR PRIVATE KEY> --- apiVersion: apps/v1 kind: Deployment metadata: name: echoserver namespace: echoserver spec: replicas: 1 selector: matchLabels: app: echoserver template: metadata: labels: app: echoserver spec: containers: - image: gcr.io/google_containers/echoserver:1.0 imagePullPolicy: Always name: echoserver ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: echoserver namespace: echoserver spec: ports: - name: http port: 80 targetPort: 8080 protocol: TCP selector: app: echoserver --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: echoserver namespace: echoserver annotations: kubernetes.io/ingress.class: "nginx" spec: tls: - hosts: - echo.example.com secretName: echo.example.com-tls rules: - host: echo.example.com http: paths: - path: / backend: serviceName: echoserver servicePort: 80 


 $ kubectl apply -f app.yaml namespace "echoserver" configured deployment "echoserver" unchanged service "echoserver" configured ingress "echoserver" unchanged 


هذا كل شيء)) تحقق من النتيجة:

 $ curl https://echo.example.com/ CLIENT VALUES: client_address=('10.244.3.2', 32860) (10.244.3.2) command=GET path=/ real path=/ query= request_version=HTTP/1.1 SERVER VALUES: server_version=BaseHTTP/0.6 sys_version=Python/3.5.0 protocol_version=HTTP/1.0 HEADERS RECEIVED: Accept=*/* Connection=close Host=echo.example.com User-Agent=curl/7.58.0 X-Forwarded-For=10.244.0.0 X-Forwarded-Host=echo.example.com X-Forwarded-Port=80 X-Forwarded-Proto=http X-Original-URI=/ X-Real-IP=10.244.0.0 X-Request-ID=7a4f4aabf9a0043ea2b1ca91bd1a3adf X-Scheme=http 

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


All Articles