Saya perlu meningkatkan cluster Kubernetes, tapi saya hanya seorang programmer kode. Ada jalan keluar



Hari yang baik Catatan lain dari pengalaman saya. Kali ini dangkal tentang infrastruktur dasar, yang saya gunakan jika saya perlu membongkar sesuatu, tetapi tidak ada orang - orang devOps di dekatnya . Tetapi tingkat abstraksi saat ini, dalam teknologi, memungkinkan sekitar satu tahun untuk hidup dengan infrastruktur ini, dinaikkan pada malam hari, menggunakan Internet dan hal-hal yang sudah jadi.

Kata kunci - AWS + Terraform + kops . Jika ini berguna bagi saya, mungkin akan bermanfaat bagi orang lain. Selamat datang di komentar.

-1. Apa yang kita hadapi


Situasi klasik - proyek ditulis ke tahap seperti itu ketika perlu untuk membongkar di suatu tempat dan mulai menggunakannya. Dan proyek ini lebih rumit daripada halaman html sederhana. Saya ingin kemungkinan penskalaan horizontal, identitas lingkungan pada pengujian lokal, produk, dan proses penyebaran yang lebih atau kurang normal.
Ini tentang aplikasi pada Laravel untuk menunjukkan seluruh proses dari awal hingga akhir. Tetapi dengan cara yang serupa, Anda dapat menggunakan layanan yang tersebar di mana saja, aplikasi python, situs kecil di WP, halaman html dan banyak lagi. Untuk tingkat tertentu, ini sudah cukup, dan kemudian orang yang terpisah muncul di tim, yang akan meningkatkan dan melengkapinya.
Baru-baru ini, saya sampai pada kenyataan bahwa saya menginstal GoLand, PhpStorm, Docker, Git pada mesin lokal dan saya benar - benar siap untuk bekerja. Ya, dan Anda dapat mengelola dari satu mesin dalam kelompok curah, jadi saya akan menjelaskan seluruh proses tanpa memperhitungkan OS tempat Anda bekerja, mengemas semua hal dalam wadah buruh pelabuhan.

0. Bersiap untuk bekerja.


Mari kita bayangkan bahwa kita telah mendaftarkan akun di AWS , diminta melalui dukungan teknis untuk meningkatkan batas akun dengan jumlah server yang berjalan secara bersamaan, menciptakan pengguna IAM dan sekarang kita memiliki Kunci Akses + Kunci Rahasia . Zone - us-east-1 .

Apa yang kita butuhkan di komputer lokal? AWS CLI , Terraform untuk manajemen deklaratif AWS , kubectl , kops untuk mengkonfigurasi cluster dan Helm , untuk menyebarkan beberapa layanan. Kami mengumpulkan Dockerfile (yang saya temukan jauh sebelumnya di suatu tempat di luasnya github, tetapi saya tidak dapat menemukan di mana). Kami menulis docker-compose.yml kami untuk me-mount direktori dan Makefile untuk alias.

Dockerfile
FROM ubuntu:16.04 ARG AWSCLI_VERSION=1.12.1 ARG HELM_VERSION=2.8.2 ARG ISTIO_VERSION=0.6.0 ARG KOPS_VERSION=1.9.0 ARG KUBECTL_VERSION=1.10.1 ARG TERRAFORM_VERSION=0.11.0 # Install generally useful things RUN apt-get update \ && apt-get -y --force-yes install --no-install-recommends \ curl \ dnsutils \ git \ jq \ net-tools \ ssh \ telnet \ unzip \ vim \ wget \ && apt-get clean \ && apt-get autoclean \ && apt-get autoremove \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Install AWS CLI RUN apt-get update \ && apt-get -y --force-yes install \ python-pip \ && pip install awscli==${AWSCLI_VERSION} \ && apt-get clean \ && apt-get autoclean \ && apt-get autoremove \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Install Terraform RUN wget -O terraform.zip https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip \ && unzip terraform.zip \ && mv terraform /usr/local/bin/terraform \ && chmod +x /usr/local/bin/terraform \ && rm terraform.zip # Install kubectl ADD https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/amd64/kubectl /usr/local/bin/kubectl RUN chmod +x /usr/local/bin/kubectl # Install Kops ADD https://github.com/kubernetes/kops/releases/download/${KOPS_VERSION}/kops-linux-amd64 /usr/local/bin/kops RUN chmod +x /usr/local/bin/kops # Install Helm RUN wget -O helm.tar.gz https://storage.googleapis.com/kubernetes-helm/helm-v${HELM_VERSION}-linux-amd64.tar.gz \ && tar xfz helm.tar.gz \ && mv linux-amd64/helm /usr/local/bin/helm \ && chmod +x /usr/local/bin/helm \ && rm -Rf linux-amd64 \ && rm helm.tar.gz # Create default user "kops" RUN useradd -ms /bin/bash kops WORKDIR /home/kops USER kops # Ensure the prompt doesn't break if we don't mount the ~/.kube directory RUN mkdir /home/kops/.kube \ && touch /home/kops/.kube/config 

docker-compose.yml
 version: '2.1' services: cluster-main: container_name: cluster.com image: cluster.com user: root stdin_open: true volumes: - ./data:/data - ./.ssh:/root/.ssh - ./.kube:/root/.kube - ./.aws:/root/.aws cluster-proxy: container_name: cluster.com-kubectl-proxy image: cluster.com user: root entrypoint: kubectl proxy --address='0.0.0.0' --port=8001 --accept-hosts='.*' ports: - "8001:8001" stdin_open: true volumes: - ./data:/data - ./.ssh:/root/.ssh - ./.kube:/root/.kube - ./.aws:/root/.aws 

Makefile
 docker.build: docker build -t cluster.com . docker.run: docker-compose up -d docker.bash: docker exec -it cluster.com bash 


Dockerfile - ambil gambar ubuntu dasar dan instal semua perangkat lunak. Makefile - hanya untuk kenyamanan, Anda dapat menggunakan mekanisme alias biasa. Docker-compose.yml - kami menambahkan wadah tambahan yang akan melemparkan kami ke browser Dashboard K8S jika Anda perlu melihat sesuatu secara visual.

Kami membuat data , .ssh , .kube , .aws folder di root dan menempatkan konfigurasi kami untuk aws, kunci ssh di sana dan kami dapat mengumpulkan dan menjalankan wadah kami melalui make docker.build & make docker.run .

Nah, di folder data , buat folder tempat kita meletakkan file yaml k8s , dan di sebelah yang kedua, di mana kita akan menyimpan status terraform dari cluster. Saya menempatkan hasil perkiraan tahap ini di github .

1. Angkat cluster kami.


Selanjutnya akan menjadi terjemahan gratis dari catatan ini . Saya akan menghilangkan banyak poin teoretis, mencoba menggambarkan pemerasan singkat. Semua sama, format catatan saya adalah tldr.

Dalam folder data / aws-cluster-init-kops-terraform kami, kami mengkloning apa yang ada di repositori ini dan pergi ke konsol kontainer melalui make docker.bash . Penyebaran tim yang membosankan dimulai.

AWS CLI


Kami membuat pengguna kops , menambahkan hak akses dan mengkonfigurasi AWS CLI di atasnya agar tidak menjalankan perintah dari superuser.

 aws iam create-group --group-name kops #   aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AWSCertificateManagerFullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess --group-name kops aws iam create-user --user-name kops aws iam add-user-to-group --user-name kops --group-name kops aws iam create-access-key --user-name kops 

 aws configure 

Inisialisasi Terraform


Dalam file data / aws-cluster-init-kops-terraform / variable.tf, ubah nama cluster ke yang diinginkan. Jangan lupa untuk mengambil server dns kami dari file update.json dan perbarui di mana Anda membeli domain Anda.

 #    cd /data/aws-cluster-init-kops-terraform #    AWS CLI export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key) #  terraform terraform init terraform get terraform apply #  NS  cat update-zone.json \ | jq ".Changes[].ResourceRecordSet.Name=\"$(terraform output name).\"" \ | jq ".Changes[].ResourceRecordSet.ResourceRecords=$(terraform output -json name_servers | jq '.value|[{"Value": .[]}]')" \ > update-zone.json 

Kops


Kami membuat cluster melalui kops , mengekspor konfigurasi ke file .tf .

 export NAME=$(terraform output cluster_name) export KOPS_STATE_STORE=$(terraform output state_store) export ZONES=$(terraform output -json availability_zones | jq -r '.value|join(",")') kops create cluster \ --master-zones $ZONES \ --zones $ZONES \ --topology private \ --dns-zone $(terraform output public_zone_id) \ --networking calico \ --vpc $(terraform output vpc_id) \ --target=terraform \ --out=. \ ${NAME} 

Dibutuhkan sedikit komentar di sini. Terraform akan membuat VPC , dan kita perlu sedikit mengubah konfigurasi yang diberikan oleh kita . Ini dilakukan cukup sederhana melalui helper ryane / gensubnets image : 0,1
 #   terraform output -json > subnets.json 

 #     echo subnets.json | docker run --rm -i ryane/gensubnets:0.1 

Anda dapat menambahkan kebijakan langsung untuk route53.

 additionalPolicies: master: | [ { "Effect": "Allow", "Action": ["route53:ListHostedZonesByName"], "Resource": ["*"] }, { "Effect": "Allow", "Action": ["elasticloadbalancing:DescribeLoadBalancers"], "Resource": ["*"] }, { "Effect": "Allow", "Action": ["route53:ChangeResourceRecordSets"], "Resource": ["*"] } ] node: | [ { "Effect": "Allow", "Action": ["route53:ListHostedZonesByName"], "Resource": ["*"] }, { "Effect": "Allow", "Action": ["elasticloadbalancing:DescribeLoadBalancers"], "Resource": ["*"] }, { "Effect": "Allow", "Action": ["route53:ChangeResourceRecordSets"], "Resource": ["*"] } ] 

Mengedit melalui kops, mengedit cluster $ {NAME} .



Sekarang kita bisa menaikkan cluster itu sendiri.

 kops update cluster \ --out=. \ --target=terraform \ ${NAME} terraform apply 

Semuanya akan berjalan dengan baik, konteks kubectl akan berubah. Di folder data / aws-cluster-init-kops-terraform , kami akan menyimpan status cluster. Anda bisa meletakkan semuanya di git dan mengirimkannya ke repositori bitpack pribadi.

 $ kubectl get nodes NAME STATUS AGE ip-10-20-101-252.ec2.internal Ready,master 7m ip-10-20-103-232.ec2.internal Ready,master 7m ip-10-20-103-75.ec2.internal Ready 5m ip-10-20-104-127.ec2.internal Ready,master 6m ip-10-20-104-6.ec2.internal Ready 5m 

2. Angkat aplikasi kita


Sekarang kami memiliki sesuatu, kami dapat menggunakan layanan kami dalam sebuah cluster. Saya akan menempatkan perkiraan konfigurasi di repositori yang sama . Mereka dapat dimasukkan ke dalam paket di data / k8s .

Lelucon servis


Mari kita mulai dengan hal-hal layanan. Kami membutuhkan helm , route53 , kelas penyimpanan , dan akses ke registri pribadi kami di hub.docker.com . Baik, atau untuk yang lain, jika ada keinginan seperti itu.

 # Init helm kubectl create serviceaccount --namespace kube-system tiller kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}' helm init 

 kubectl apply -f default-namespace.yaml kubectl apply -f storage-classes.yaml kubectl apply -f route53.yaml kubectl apply -f docker-hub-secret.yml kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml 

PostgreSQL + Redis


Saya membakar berkali-kali menggunakan buruh pelabuhan bukan untuk wadah stateless , tetapi konfigurasi terakhir sejauh ini terbukti paling cocok. Saya menggunakan Stolon untuk memberikan skalabilitas. Sekitar setahun penerbangannya normal.

Kami menggunakan helm-chart dan beberapa konfigurasi Redis cepat.

 #  etcd  stolon cd etcd-chart helm install --name global-etcd . #   stolon cd stolon-chart helm dep build helm install --name global-postgres . #  redis kubectl apply -f redis 

Nginx + php


Tandan biasa. Nginx dan php-fpm . Saya tidak secara khusus membersihkan konfigurasi, tetapi semua orang dapat mengonfigurasi sendiri. Sebelum mendaftar, Anda harus menentukan gambar dari mana kami akan mengambil kode + menambahkan garis sertifikat dari AWS Certificate Manager . Php sendiri - Anda dapat mengambilnya dari dockerhab, tapi saya membangun yang pribadi dengan menambahkan beberapa perpustakaan.

 kubectl apply -f nginx kubectl apply -f php 

Pada gambar kita dengan kode, kita menyimpannya di folder / crm-code . Kami menggantinya dengan gambar Anda dan itu akan berfungsi dengan benar. File tersebut adalah nginx / deployment.yml .



Keluarkan domain. Layanan Route53 akan mengambilnya, mengubah / menambah catatan DNS, sertifikat akan diunggah ke ELB dari AWS Certificate Manager . File tersebut adalah nginx / service.yml .



Teruskan variabel env di php untuk memilikinya di dalam dan terhubung ke PostgreSQL / Redis . File tersebut adalah php / deployment.yml .



Sebagai hasilnya, kami memiliki kluster K8S , yang pada tingkat dasar kami dapat meningkatkan skala, menambahkan layanan baru, server baru (node), mengubah jumlah instance PostgreSQL, PHP, Nginx dan hidup sebelum orang yang berbeda muncul di tim yang akan melakukan ini .

Sebagai bagian dari catatan singkat ini, saya tidak akan menyentuh masalah cadangan / pemantauan semua hal ini. Pada tahap awal, localhost akan cukup : 8001 / ui dari layanan Dashboard K8S . Nantinya akan dimungkinkan untuk mengikat Prometheus , Grafana , Barman , atau solusi serupa lainnya.

Menggunakan terminal atau Teamcity , Jenkins memperbarui kode akan melakukan sesuatu seperti ini.

 #     -      Teamcity docker build -t GROUP/crm-code:latest . docker push GROUP/crm-code:latest #   (  ) kubectl set image deployment/php-fpm php-fpm=GROUP/php-fpm kubectl rollout status deployment/php-fpm kubectl set image deployment/php-fpm php-fpm=GROUP/php-fpm:latest kubectl set image deployment/nginx nginx=danday74/nginx-lua kubectl rollout status deployment/nginx kubectl set image deployment/nginx nginx=danday74/nginx-lua:latest kubectl rollout status deployment/php-fpm kubectl rollout status deployment/nginx 

Saya akan senang jika itu akan menarik bagi seseorang dan dua kali lipat senang jika itu membantu siapa pun. Terima kasih atas perhatian anda Sekali lagi, saya melampirkan tautan ke repositori satu dan dua .

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


All Articles