Instal Kubernetes di Hetzner Cloud

Diperbarui 10/01/2020. Sedikit lebih dari satu tahun telah berlalu sejak penulisan artikel dan sejumlah contoh telah berhenti bekerja - teknologinya sedang berkembang, jadi saya menambahkan dan mereduksi contohnya sedikit.

Pada artikel ini, saya ingin berbicara tentang menginstal Kubernetes di Hetzner Cloud.

Ubuntu Linux 18.04 diinstal pada komputer saya yang bekerja dan semua contoh akan menyiratkan penggunaan sistem operasi ini.

Untuk bekerja dengan Hetzner Cloud dan membangun cluster Kubernetes, kita akan menggunakan utilitas hetzner-kube . Instal di komputer lokal Anda.

$ 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 

Untuk menggunakan utilitas hetzner-kube dan mengesahkannya di Hetzner Cloud, Anda harus membuat Token API melalui Hetzner Cloud Console https://console.hetzner.cloud . Di atas, pilih Pilih proyek -> Default, pilih item Akses di menu sebelah kiri, lalu buka bagian API token, klik tombol Generate API Token.

Sebagai hasilnya, API Token akan dihasilkan dan perlu ditentukan dalam konfigurasi utilitas hetzner-kube.

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

Selanjutnya, kita perlu membuat kunci SSH yang akan digunakan untuk mengakses server di Hetzner Cloud. Untuk melakukan ini, gunakan utilitas 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]-----+ 

Sebagai hasilnya, dua file ~ / .ssh / id_rsa (kunci pribadi) dan ~ / .ssh / id_rsa.pub (kunci publik) akan dibuat di direktori home Anda.

Tambahkan kunci ssh publik ke Hetzner Cloud:

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

Membangun cluster Kubernetes secara langsung sangat mudah:

 $ 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! 

Perintah ini secara otomatis akan membuat server virtual di Hetzner Cloud dan menginstal jumlah node master / pekerja yang ditentukan dari kluster Kubernet pada mereka. Secara default, server virtual CX11 akan digunakan.

Kemudian, menggunakan utilitas hetzner-kube, juga mudah untuk mengubah konfigurasi cluster Kubernetes dengan menambahkan node pekerja. Misalnya, tambahkan 2 node pekerja:

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

Sayangnya, mengubah konfigurasi master node menggunakan utilitas hetzner-kube tanpa sepenuhnya membangun kembali cluster Kubernetes saat ini tidak memungkinkan.

Utilitas kubectl digunakan untuk bekerja dengan kluster Kubernetes. Petunjuk terperinci untuk menginstalnya untuk sistem operasi yang berbeda dapat ditemukan di tautan berikut .

Untuk bekerja dengan kluster Kubernetes yang dibuat menggunakan perintah kubectl, Anda harus menyimpan konfigurasi kluster yang dibuat secara lokal sebagai berikut:

 $ hetzner-kube cluster kubeconfig k8s create file kubeconfig configured 

File konfigurasi disimpan di ~ / .kube / config.

Sekarang mari kita beralih ke bagian yang paling menarik - mengkonfigurasi cluster Kubernet yang dihasilkan.

Untuk memulai, kami akan membuat sumber daya dasar yang diperlukan untuk penerapan aplikasi di masa mendatang. Anda dapat menemukan informasi lebih rinci di tautan berikut .

 $ 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 


Lebih jauh lagi perlu bahwa pengendali masuknya dapat diakses oleh kami dari Internet. Untuk melakukan ini, gunakan utilitas kubectl untuk mengedit service / ingress-nginx dan menambahkannya daftar alamat IP publik dari node pekerja / master dari kluster Kubernet kami (hanya yang ingin digunakan untuk memproses permintaan yang masuk dari Internet).

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

dan tambahkan bagian selanjutnya ke manifes YAML
 spec: externalIPs: - XXXX - YYYY 


Tambahkan catatan ke domain Anda dan tunggu hingga informasi tentang mereka muncul di CSN. Sebagai contoh:

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


Jika Anda menentukan beberapa alamat IP eksternal di ingress-nginx.yaml, maka Anda dapat membuat beberapa catatan DNS yang identik dengan alamat IP ini. Dalam hal ini, permintaan untuk domain Anda akan didistribusikan antara alamat IP ini dan penyeimbangan beban akan terjadi.

Dalam contoh ini, agar https berfungsi, kami akan menghasilkan sertifikat SSL yang ditandatangani sendiri.

 $ 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> 


Sekarang kita tambahkan aplikasi kita. Echoserver sederhana dipilih sebagai contoh. Buat file bernama app.yaml dengan konten berikut:

 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 


Itu saja)) Periksa hasilnya:

 $ 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/id419323/


All Articles