
Guten Tag. Noch ein Hinweis aus meiner Erfahrung. Diesmal geht es oberflächlich um die 
Basisinfrastruktur , die ich verwende, wenn ich etwas entladen muss, aber es sind keine 
Entwickler in der Nähe . Der derzeitige Abstraktionsgrad in der Technologie ermöglicht es jedoch, etwa ein Jahr lang mit dieser Infrastruktur zu leben, die während der Nacht mithilfe des Internets und vorgefertigter Dinge aufgebaut wurde.
Schlüsselwörter - 
AWS + 
Terraform + 
Kops . Wenn dies für mich nützlich ist, wird es wahrscheinlich für jemand anderen nützlich sein. Willkommen zu den Kommentaren.
-1. Womit wir es zu tun haben
Die klassische Situation - das Projekt wird in eine solche Phase geschrieben, in der es irgendwo entladen und verwendet werden muss. Und das Projekt ist komplizierter als eine einfache HTML-Seite. Ich möchte die Möglichkeit einer horizontalen Skalierung, die Identität der Umgebung auf lokalen, Test-, Produktständen und einen mehr oder weniger normalen Bereitstellungsprozess.
Es geht um eine Anwendung auf Laravel , die den gesamten Prozess von Anfang bis Ende zeigt. Auf ähnliche Weise können Sie jedoch eine Reihe von Diensten für unterwegs, Python-Anwendungen, kleine Websites in WP, HTML-Seiten und vieles mehr bereitstellen. Bis zu einem gewissen Grad reicht dies aus, und dann erscheint eine separate Person im Team, die es verbessern und ergänzen wird.
Kürzlich kam ich zu der Tatsache, dass ich 
GoLand, PhpStorm, Docker, Git auf lokalen Computern installiere und bereit 
bin zu arbeiten. Ja, und Sie können von einem einzigen Computer aus in Massenclustern verwalten. Daher werde ich den gesamten Prozess beschreiben, ohne das Betriebssystem zu berücksichtigen, auf dem Sie arbeiten, und alle Dinge in einen Docker-Container packen.
0. Vorbereitungen für die Arbeit.
Stellen wir uns vor, wir haben bereits ein Konto bei 
AWS registriert, vom technischen Support gebeten, die Kontolimits um die Anzahl der gleichzeitig ausgeführten Server zu erhöhen, einen 
IAM- Benutzer erstellt und jetzt haben wir 
Zugriffsschlüssel + 
Geheimschlüssel . Zone - 
us-east-1 .
Was brauchen wir auf dem lokalen Computer? 
AWS CLI , 
Terraform für die deklarative Verwaltung von 
AWS , 
kubectl , 
kops für die Konfiguration des Clusters und 
Helm für die Bereitstellung einiger Dienste. Wir sammeln die 
Docker-Datei (die ich vor langer Zeit irgendwo in der Weite des Githubs gefunden habe, aber ich kann nicht finden, wo). Wir schreiben unsere 
docker-compose.yml für Mount-Verzeichnisse und 
Makefile für Aliase.
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 - Nehmen Sie das grundlegende Ubuntu-Image und installieren Sie die gesamte Software. 
Makefile - nur zur Vereinfachung können Sie den üblichen Aliase-Mechanismus verwenden. 
Docker-compose.yml - Wir haben einen zusätzlichen Container hinzugefügt 
, der uns in den 
K8S Dashboard- Browser 
wirft , wenn Sie etwas visuell sehen müssen.
Wir erstellen die 
Ordner data , 
.ssh , 
.kube , 
.aws im Stammverzeichnis und legen dort unsere Konfiguration für aws, ssh-Schlüssel ab. Wir können unseren Container über 
make docker.build & make docker.run sammeln und 
ausführen .
Nun, erstellen Sie im 
Datenordner einen Ordner, in dem wir 
yaml k8s- Dateien 
ablegen , und neben dem zweiten, in dem wir den Status der 
Terraform des Clusters speichern. Ich 
habe das ungefähre Ergebnis dieser Etappe 
auf den Github gelegt .
1. Erhöhen Sie unseren Cluster.
Als nächstes folgt eine kostenlose Übersetzung dieser Notiz. Ich werde viele theoretische Punkte weglassen und versuchen, einen kurzen Druck zu beschreiben. Trotzdem ist das Format meiner Notiz tldr.
In unserem 
Ordner data / aws-cluster-init-kops-terraform klonen 
wir, was sich in 
diesem Repository befindet, und gehen über 
make docker.bash zur Containerkonsole. Die Streuung langweiliger Teams beginnt.
AWS CLI
Wir erstellen die User- 
Kops , fügen Zugriffsrechte hinzu und konfigurieren die 
AWS-CLI neu , um keine Befehle vom Superuser auszuführen.
 aws iam create-group --group-name kops  
 aws configure 
Terraform initialisieren
Ändern Sie in der Datei 
data / aws-cluster-init-kops-terraform / variables.tf den Namen des Clusters in den gewünschten. Vergessen Sie nicht, unsere DNS-Server aus der Datei 
update.json zu entnehmen und dort zu aktualisieren, wo Sie Ihre Domain gekauft haben.
 
Kops
Wir erstellen einen Cluster durch 
Kops und exportieren die Konfiguration in eine 
.tf- Datei.
 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} 
Hier ist eine kleine Bemerkung erforderlich. Terraform erstellt eine VPC , und wir müssen die Konfiguration, die Kops uns geben , leicht anpassen . Dies geschieht ganz einfach über das Hilfbild von Ryane / Gensubnets: 0.1
 
 
Sie können sofortige Richtlinien für route53 hinzufügen.
 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": ["*"] } ] 
Bearbeiten über 
Kops Bearbeiten Sie Cluster $ {NAME} .

Jetzt können wir den Cluster selbst anheben.
 kops update cluster \ --out=. \ --target=terraform \ ${NAME} terraform apply 
Alles wird gut gehen, der Kontext von 
kubectl wird sich ändern. Im Ordner 
data / aws-cluster-init-kops-terraform speichern wir den Clusterstatus. Sie können einfach alles in 
git einfügen und an ein privates Bitpack-Repository senden.
 $ 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. Erhöhen Sie unsere Anwendung
Nachdem wir etwas haben, können wir unsere Dienste in einem Cluster bereitstellen. Ich werde ungefähre Konfigurationen in 
dasselbe Repository stellen . Sie können in 
data / k8s in ein Paket 
gestellt werden .
Service-Witze
Beginnen wir mit dem Service. Wir benötigen 
Helm , 
Route53 , 
Speicherklassen und Zugriff auf unsere private 
Registrierung unter 
hub.docker.com . Nun, oder zu jedem anderen, wenn es einen solchen Wunsch gibt.
 
 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
Ich habe so oft mit Docker gebrannt, nicht für 
zustandslose Container, aber die letzte Konfiguration hat sich bisher als am besten geeignet erwiesen. Ich benutze 
Stolon , um Skalierbarkeit zu gewährleisten. Etwa ein Jahr ist der Flug normal.
Wir setzen Helmkarten und ein paar schnelle 
Redis- Konfigurationen ein.
 
Nginx + php
Der übliche Haufen. 
Nginx und 
PHP-Fpm . Ich habe die Konfigurationen nicht besonders bereinigt, aber jeder kann sie selbst konfigurieren. Bevor Sie sich bewerben, müssen Sie das Bild angeben, von dem wir den Code übernehmen möchten, und eine Zertifikatzeile von 
AWS Certificate Manager hinzufügen. PHP selbst - Sie können es aus dem Dockerhab nehmen, aber ich habe mein privates erstellt, indem ich ein paar Bibliotheken hinzugefügt habe.
 kubectl apply -f nginx kubectl apply -f php 
In unserem Bild mit dem Code speichern wir ihn im Ordner 
/ crm-code . Wir ersetzen es durch Ihr Bild und es wird ganz richtig funktionieren. Die Datei lautet 
nginx / deploy.yml .

Bringen Sie die Domain heraus. 
Der Route53- Dienst nimmt es auf, ändert / fügt DNS-Einträge hinzu, und das Zertifikat wird vom 
AWS Certificate Manager in 
ELB hochgeladen . Die Datei lautet 
nginx / service.yml .

Leiten Sie env-Variablen in PHP weiter, um sie darin zu haben und eine Verbindung zu 
PostgreSQL / Redis herzustellen . Die Datei ist 
php / deploy.yml .

Als Ergebnis haben wir einen 
K8S- Cluster, den wir auf einer grundlegenden Ebene skalieren, neue Dienste, neue Server (Knoten) hinzufügen, die Anzahl der 
PostgreSQL-, PHP- und Nginx- Instanzen ändern und leben können, bevor eine separate Person im Team erscheint, die dies tun wird .
Als Teil dieser kurzen Notiz werde ich nicht auf Sicherungs- / Überwachungsprobleme all dieser Dinge eingehen. In der Anfangsphase reicht 
localhost aus 
: 8001 / ui vom 
K8S Dashboard- Dienst. Später können 
Prometheus , 
Grafana , 
Barman oder ähnliche Lösungen befestigt werden.
Wenn 
Jenkins ein Terminal oder 
Teamcity verwendet , aktualisiert er den Code in etwa so.
 
Ich würde mich freuen, wenn es für jemanden interessant wäre und doppelt froh, wenn es jemandem hilft. Vielen Dank für Ihre Aufmerksamkeit. Ich füge noch einmal einen Link zum Repository 
eins und 
zwei hinzu .