
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.
DockerfileFROM 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 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.
 
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
 
 
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.
 
 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.
 
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.
 
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 .