Orkestra Cybernetic. Docker Container Orchestration dengan .NET Core Applications in the Cloud

Untuk memastikan penyeimbangan muatan, skalabilitas dan meningkatkan toleransi kesalahan, alat bantu dapat digunakan - orkestra. Di antara mereka, layanan Kubernet sekarang sangat populer. Cara termudah untuk mencobanya dalam praktik adalah dengan menggunakannya di cloud, yang akan kita lakukan hari ini.



Catatan: kami melanjutkan serangkaian publikasi artikel versi lengkap dari majalah Hacker. Ejaan dan tanda baca penulis disimpan.


Perluas AKS


Kami pergi ke portal Azure , klik "Buat Sumber Daya" dan temukan layanan yang disebut Layanan Kubernetes.


Pilih nama dan awalan DNS sesuai selera Anda. Nama memengaruhi bagaimana Anda akan mengakses cluster Anda, tetapi awalan memengaruhi alamat FQDN-nya.



Mesin virtual termurah saat ini harganya hanya lebih dari $ 30 per bulan.


Langkah kedua adalah membuat kepala layanan. Prinsip layanan adalah sejenis akun layanan yang dapat digunakan untuk melakukan tugas tertentu. Keuntungannya adalah bahwa hak akun semacam itu dapat dibatasi. Selain itu, Anda dapat membuat sejumlah akun seperti itu (sementara jumlah akun reguler dibatasi oleh langganan). Anda dapat menemukan akun utama layanan yang dibuat di Direktori Aktif di antara Pendaftaran Aplikasi.



RBAC (kontrol akses berbasis peran) adalah kemampuan untuk membatasi atau menyediakan akses ke sumber daya tertentu (atau kelompok sumber daya). Artinya, Anda dapat membedakan mana pengguna langganan Anda yang memiliki hak akses dan mana yang tidak.



Saat ini, prosesnya memakan waktu sekitar 20 menit, tetapi semuanya mungkin tergantung pada konfigurasi.


Temukan panduan resmi dengan mengikuti tautan
Buat kluster AKS menggunakan portal
Membuat Cluster AKS Menggunakan CLI


Agar berfungsi, kita membutuhkan baris perintah Azure - CLI (Command Line Interface). Itu dapat diinstal baik di Windows, dan di bawah macOS atau Linux. Secara pribadi, saya lebih suka menggunakan Azure Cloud Shell. Ini adalah baris perintah yang berjalan dari halaman portal Azure yang dimuat ke browser. Agar berfungsi, ini membutuhkan penyimpanan gumpalan yang dibuat. Biayanya akan beberapa sen per bulan dan oleh karena itu saya lebih suka untuk tidak khawatir menginstal CLI pada mobil saya.


Kubernetes mendukung berbagai teknologi wadah, tetapi mari kita lihat yang paling populer - Docker. docker.hub memungkinkan Anda untuk menyimpan satu gambar buruh pelabuhan pribadi secara gratis. Jika Anda membutuhkan lebih banyak, Anda dapat menempatkannya untuk uang. Tetapi untuk uang, gambar buruh pelabuhan pribadi dapat ditempatkan di Azure Container Registry. Sekarang harga mulai dari $ 5 per bulan (untuk SKU dasar).


Saya membuat layanan ACR dengan nama myservice. Jika Anda juga memutuskan untuk menggunakan ACR, maka menciptakan layanan Anda harus mendapatkan kuncinya.



Maka akan menjadi mungkin untuk masuk dengan menjalankan perintah:


docker login myservice.azurecr.io 

Masukkan nama pengguna (layanan saya) dan kata sandi yang diambil dari portal (PJSeyO9 = lCMRDI7dGkz68wjhFGRGxSY3)


Sekarang dengan masuk ke direktori dengan proyek, akan mungkin untuk membangun gambar sambil menandainya dengan tag yang diinginkan. Dan setelah itu kirim ke layanan cloud:


 docker build -t myservice.azurecr.io/myservice . docker push myservice.azurecr.io/myservice 

Rahasia, rahasia ... Kami menyediakan akses ke gambar dan menyimpan pengaturan.


Saat bekerja dengan AKS yang dikerahkan, Anda perlu mendapatkan kreditnya. Jika tidak, perintah kubectl tidak akan dieksekusi. Untuk mengakses AKS, perintah berikut dijalankan:


 az aks get-credentials --resource-group KubernetesGroup --name verycoolcluster 

Untuk mengakses gambar buruh pelabuhan yang terletak di repositori buruh pelabuhan dalam wadah pribadi, Anda perlu membuat rahasia. Jika Anda memiliki gambar publik, maka Anda dapat melewati langkah ini.


Untuk membuat file rahasia, Anda harus menjalankan perintah dari formulir berikut:


 kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email> 

Jika gambar Anda berada di repositori buruh pelabuhan, maka nilai <domain-anda-server> Anda akan menjadi https://index.docker.io/v1/


Untuk Azure Container Registry, FQDN akan menjadi <registry-name> .azurecr.io


Artinya, untuk membuat rahasia untuk wadah dalam kasus saya, saya lakukan:


 kubectl create secret docker-registry regcred --docker-server="myservice.azurecr.io" --docker-username="myservice" --docker-password="PJSeyO9=lCMRDI7dGkz68wjhFGRGxSY3" --docker-email="asommer@yandex.ru" 

Anda sekarang dapat melihat konten file rahasia yang dibuat menggunakan perintah:


 kubectl get secret regcred --output=yaml 

INFO


Jika Anda menggunakan AKS, Anda tidak dapat membuat file rahasia, tetapi memberikan akses ke layanan ACR ke layanan AKS dengan cara lain - dengan menjalankan skrip khusus. Anda dapat mengambilnya dari halaman berikut:


Otentikasi dengan Azure Container Registry dari Layanan Azure Kubernetes


 #!/bin/bash AKS_RESOURCE_GROUP=KubernetesGroup AKS_CLUSTER_NAME=verycoolcluster ACR_RESOURCE_GROUP=MyACRGroup ACR_NAME=myservice # Get the id of the service principal configured for AKS CLIENT_ID=$(az aks show --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query "servicePrincipalProfile.clientId" --output tsv) # Get the ACR registry resource id ACR_ID=$(az acr show --name $ACR_NAME --resource-group $ACR_RESOURCE_GROUP --query "id" --output tsv) # Create role assignment az role assignment create --assignee $CLIENT_ID --role Reader --scope $ACR_ID 

Anda cukup memodifikasi nilai variabel AKS * dan ACR *, lalu menyalin skrip dan menempelnya ke Azure CLI atau Cloud Shell.


Kubernetes berisi toko kredensial yang aman. Artinya, Anda dapat membuat file dengan pengaturan dan akses ke pengaturan ini dari luar akan sulit. File ini biasanya berisi string koneksi database dan beberapa jenis kredit. Jika Anda tidak memiliki informasi seperti itu dalam aplikasi (apakah itu benar?), Maka Anda dapat melewati langkah ini.


Untuk membuat file pengaturan dari baris perintah, pertama-tama kita harus mempertimbangkan perintah vi.


 vi < > 

akan membuat file jika ada yang hilang atau membuka yang sudah ada


Untuk menyimpan perubahan yang dimasukkan tekan ESC dan kemudian ZZ


Untuk sekadar keluar tanpa menyimpan ESC dan setelah: q!


Deskripsi yang sangat singkat, tetapi harus cukup. Saya dapat menambahkan bahwa tombol Sisipkan dapat sangat berguna.


Jadi, melalui Azure Cloud Shell, buat file dengan nama sewenang-wenang (misalnya, appsettings.json) dan konten yang Anda butuhkan. Mari kita akui seperti itu:


 { "ConnectionString": "some secret string goes there" } 

Dan setelah Anda menjalankan perintah:


 kubectl create secret generic secret-appsettings --from-file=/home/youraccount/appsettings.json 

Perintah ini akan membuat rahasia dengan pengaturan yang disebut pengaturan aplikasi rahasia
Anda dapat mengetahui jalur mana yang harus diganti / home / akun Anda dengan perintah pwd


Buat penyebaran


Penyebaran adalah untuk layanan tanpa kewarganegaraan. Mereka menggambarkan bagaimana Pods dan ReplicaSets akan dibuat dan bagaimana mereka akan diperbarui. Pod adalah sekelompok wadah (atau wadah tunggal) yang berfungsi di lingkungan yang sama. Tujuan ReplicaSet adalah untuk mengontrol bahwa jumlah pod yang ditentukan akan diluncurkan dan akan terus berfungsi.
Berdasarkan yang sebelumnya dibuat, saya membuat file deploy.yaml yang akan membuat 3 sub. File tersebut berisi kode berikut (saya ingatkan Anda bahwa spasi di yaml sangat penting):


 apiVersion: apps/v1beta1 kind: Deployment metadata: name: mydeployment spec: replicas: 3 minReadySeconds: 10 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 template: metadata: labels: app: myapp spec: containers: - name: app image: myservice.azurecr.io/myservice:latest ports: - containerPort: 80 name: http protocol: TCP imagePullPolicy: Always env: - name: "ASPNETCORE_ENVIRONMENT" value: "Production" volumeMounts: - name: secrets mountPath: /app/secrets readOnly: true imagePullSecrets: - name: regcred volumes: - name: secrets secret: secretName: secret-appsettings 

Pertimbangkan kodenya. Awal menggambarkan jumlah replika dan strategi pembaruan. Kemudian penyebaran diberi nama (myapp) dan referensi ke gambar wadah ditunjukkan. Port terdaftar. 80 adalah port standar untuk http. Berikutnya adalah pengaturan lingkungan ASP.NET Core. Kemudian kredit gambar buruh pelabuhan pribadi dan pengaturan aplikasi rahasia yang baru saja kita buat di-mount.


  strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 

Bagian ini bertanggung jawab untuk proses peningkatan. maxSurge - jumlah perapian yang dibuat melebihi yang ada saat memperbarui (dalam satuan atau persen). maxUnavailable - jumlah maksimum perapian yang mungkin menjadi tidak tersedia selama proses pembaruan.
penyebaran dapat dibuat menggunakan perintah:


 kubectl apply -f deploy.yaml 

Temui Ingress


Untuk menyediakan akses ke layanan cluster dan mengatur penyeimbangan beban, layanan yang disebut ingress digunakan. Solusi yang cukup populer adalah ingress berdasarkan nginx. Cara termudah untuk menginstalnya adalah menggunakan manajer paket Kubernetes yang disebut helm. Keuntungan dari Azure Cloud Shell adalah helm yang sudah terpasang di dalamnya. Apa yang masih harus dilakukan untuk menginstal nginx-ingress. Masukkan:


 helm init 

Tunggu sebentar dan jalankan:


 helm install stable/nginx-ingress --namespace kube-system --set rbac.create=false 

Membuat Sertifikat SSL dengan LetsEncrypt


Karena sertifikat SSL terikat pada beberapa nama domain, kami akan menetapkan nama sumber daya DNS kami.


Jalankan perintah berikut dan ambil IP eksternal


 kubectl get service -l app=nginx-ingress --namespace kube-system 

Ganti IP dan nama yang kami temukan untuk subdomain dalam skrip berikut


 #!/bin/bash # Public IP address of your ingress controller IP="168.63.19.2" # Name to associate with public IP address DNSNAME="myservice-ingress" # Get the resource-id of the public ip PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --output tsv) # Update public ip address with DNS name az network public-ip update --ids $PUBLICIPID --dns-name $DNSNAME 

Kami cukup menyalin skrip ini, menempelkannya ke baris perintah dan menjalankannya dengan cara ini. Sebagai nama untuk subdomain, saya menetapkan nama yang sangat "asli" - myservice-ingress


Instal manajer sertifikat dengan cara yang sama dengan menyalin dan menempelkan skrip berikut ke dalam baris perintah. Di sini, bahkan tidak ada yang perlu diubah.


 helm install \ --name cert-manager \ --namespace kube-system \ stable/cert-manager \ --set ingressShim.defaultIssuerName=letsencrypt-prod \ --set ingressShim.defaultIssuerKind=ClusterIssuer \ --set rbac.create=false \ --set serviceAccount.create=false 

INFO


Jika kami memiliki cluster dengan RBAC, maka skrip akan berbeda.


 helm install stable/cert-manager --set ingressShim.defaultIssuerName=letsencrypt-staging --set ingressShim.defaultIssuerKind=ClusterIssuer 

Jika file sertifikat tersedia, maka Anda dapat menambahkannya seperti ini:


 kubectl create secret tls tls-secret --cert CERT.crt --key KEY-FOR-CERT.key 

Tetapi karena kita tidak memiliki sertifikat CA yang ditandatangani, kita harus berdansa sedikit dengan rebana. Kami akan membuat CA menggunakan layanan gratis yang disebut LetsEncrypt . LetsEncrypt adalah Otoritas Sertifikat yang menerbitkan sertifikat secara gratis. Organisasi altruistik, yang tujuannya adalah untuk mengamankan Internet.


Jadi, buat file cluster-issuer.yaml. Ini menjelaskan organisasi yang mengeluarkan sertifikat.


 apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: youeemail@yourdomain.ru privateKeySecretRef: name: letsencrypt-prod http01: {} 

Anda hanya perlu mengganti email dengan alamat Anda dan Anda dapat melakukannya:


 kubectl apply -f cluster-issuer.yaml 

Kemudian kami membuat file sertifikat Certificate.yaml yang menetapkan nama ClusterIssuer yang dibuat dan domain yang dimaksudkan untuk sertifikat tersebut - myservice-ingress.westeurope.cloudapp.azure.com


 apiVersion: certmanager.k8s.io/v1alpha1 kind: Certificate metadata: name: tls-prod-secret spec: secretName: tls-prod-secret dnsNames: - myservice-ingress.westeurope.cloudapp.azure.com acme: config: - http01: ingressClass: nginx domains: - myservice-ingress.westeurope.cloudapp.azure.com issuerRef: name: letsencrypt-prod kind: ClusterIssuer 

Kami melakukan:


 kubectl apply -f certificate.yaml 

Penciptaan Layanan dan Ingress


Kubernetes dapat membuat empat jenis layanan.
Layanan default adalah ClusterIP. Akses ke layanan ini hanya dimungkinkan dari cluster melalui IP internal.


NodePort secara otomatis membuat layanan ClusterIP. Akses ke NodePort dimungkinkan secara eksternal dengan rute berikut:

Penyeimbang beban LoadBalancer menyediakan akses ke layanan dari luar, secara otomatis membuat layanan NodePort dan ClusterIP.


ExternalName mengaitkan layanan dengan nama eksternal.


Layanan dasar sudah cukup bagi kami:


 apiVersion: v1 kind: Service metadata: name: myservice spec: type: ClusterIP ports: - port: 80 name: http targetPort: http selector: app: myapp 

Dengan nilai pemilih, kami menunjukkan nama penempatan kami.
Masih membuat layanan


 kubectl apply -f service.yaml 

Dan sebagai tahap akhir, kami membuat masuknya dengan yang saya sudah memperkenalkan Anda sedikit lebih tinggi dalam artikel ini. Dalam yaml kita akan menentukan nama penerbit cluster dan sertifikat. Kami membuatnya sebelumnya.


 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: myingress annotations: kubernetes.io/ingress.class: nginx certmanager.k8s.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/rewrite-target: / spec: tls: - hosts: - myservice-ingress.westeurope.cloudapp.azure.com secretName: tls-prod-secret rules: - host: myservice-ingress.westeurope.cloudapp.azure.com http: paths: - path: / backend: serviceName: myservice servicePort: 80 

Beberapa waktu setelah membuat masuknya menggunakan perintah kubectl yang sama berlaku, microservice kami harus tersedia di https: // myservice-ingress.westeurope.cloudapp.azure.com . Dengan mengklik kunci di bilah alamat browser di sebelah https, Anda dapat memverifikasi bahwa sertifikat itu valid dan dikeluarkan oleh CA.




Kami mengingatkan Anda bahwa ini adalah versi lengkap dari artikel dari majalah Hacker . Penulisnya adalah Alexey Sommer .

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


All Articles