
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 .