
يوم جيد. ملاحظة أخرى من تجربتي. هذه المرة ، يكون الأمر سطحيًا حول البنية التحتية الأساسية ، التي
أستخدمها إذا كنت بحاجة إلى تفريغ شيء ما ، ولكن لا يوجد رجال
devOps قريبون . لكن المستوى الحالي للتجريد ، في التكنولوجيا ، يسمح لحوالي عام بالعيش مع هذه البنية التحتية ، التي أثيرت خلال الليل ، باستخدام الإنترنت والأشياء الجاهزة.
الكلمات المفتاحية -
AWS +
Terraform +
kops . إذا كان هذا مفيدًا بالنسبة لي ، فربما يكون مفيدًا لشخص آخر. مرحبًا بك في التعليقات.
-1. ما نتعامل معه
الوضع الكلاسيكي - يتم كتابة المشروع في مثل هذه المرحلة عندما يكون من الضروري تفريغه في مكان ما والبدء في استخدامه. والمشروع أكثر تعقيدًا من صفحة html بسيطة. أرغب في إمكانية التحجيم الأفقي ، وهوية البيئة على منصات المنتج المحلية ، والاختبارية ، وعملية النشر بشكل أو بآخر.
يتعلق الأمر بتطبيق على Laravel لإظهار العملية برمتها من البداية إلى النهاية. ولكن بطريقة مماثلة ، يمكنك نشر تشتت الخدمات أثناء التنقل وتطبيقات الثعبان والمواقع الصغيرة على WP و html-pages والمزيد. إلى مستوى معين ، هذا يكفي ، ثم يظهر شخص منفصل في الفريق ، والذي سيحسنه ويكمله.
في الآونة الأخيرة ، توصلت إلى حقيقة أنني قمت بتثبيت
GoLand و PhpStorm و Docker و Git على الأجهزة المحلية
وأنا مستعد تمامًا للعمل. نعم ، ويمكنك الإدارة من جهاز واحد في مجموعات مجمعة ، لذلك سأصف العملية بأكملها دون أخذ نظام التشغيل الذي تعمل عليه في الاعتبار ، مع تعبئة جميع الأشياء في حاوية عامل ميناء.
0. الاستعداد للعمل.
دعنا نتخيل أننا قمنا بالفعل بتسجيل حساب على
AWS ، طُلب من خلال الدعم الفني زيادة حدود الحساب من خلال عدد الخوادم التي تعمل في نفس الوقت ،
وأنشأنا مستخدم
IAM والآن لدينا
مفتاح الوصول +
مفتاح السر . زون-
us-east-1 .
ماذا نحتاج على الكمبيوتر المحلي؟
AWS CLI ،
Terraform للإدارة التعريفية لـ
AWS ،
kubectl ،
kops لتكوين المجموعة و
Helm ، لنشر بعض الخدمات. نقوم بجمع ملف
Dockerfile (الذي وجدته منذ فترة طويلة في مكان
واسع من
الحزام ، ولكن لا يمكنني العثور على مكانه). نكتب
docker-compose.yml الخاص بنا
لأدلة التثبيت و
Makefile للأسماء المستعارة.
ملف 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
عامل ميناء دوكر 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
ملف الإرساء - خذ صورة أوبونتو الأساسية وقم بتثبيت جميع البرامج.
Makefile - للراحة فقط ، يمكنك استخدام الآلية المعتادة للأسماء المستعارة.
Docker-compose.yml - أضفنا حاوية إضافية
ستلقي بنا في متصفح
لوحة القيادة K8S إذا كنت بحاجة إلى رؤية شيء بصريًا.
نقوم بإنشاء
مجلدات البيانات ،
.ssh ،
.kube ،
.aws في الجذر ونضع التكوين الخاص بنا على مفاتيح aws ، ssh هناك ويمكننا جمع وتشغيل الحاوية الخاصة بنا من خلال
make docker.build & docker.run .
حسنًا ، في مجلد
البيانات ، قم بإنشاء مجلد نضع
فيه ملفات
yaml k8s ، وبجانب المجلد الثاني ، الذي سنقوم فيه بتخزين حالة
terraform للكتلة.
أضع النتيجة التقريبية لهذه المرحلة
على جيثب .
1. رفع مجموعتنا.
التالي سيكون ترجمة مجانية لهذه المذكرة. سأحذف العديد من النقاط النظرية ، أحاول وصف ضغط قصير. كل نفس ، تنسيق ملاحظتي هو tldr.
في
مجلد البيانات / aws-cluster-init-kops-terraform ، نستنسخ ما يكمن في
هذا المستودع وننتقل إلى وحدة تحكم الحاوية من خلال
make docker.bash . يبدأ تناثر الفرق المملة.
AWS CLI
نقوم بإنشاء
kops المستخدم ، وإضافة حقوق الوصول وإعادة تكوين
AWS CLI عليه حتى لا يتم تشغيل الأوامر من المستخدم الخارق.
aws iam create-group --group-name kops
aws configure
تهيئة Terraform
في ملف
البيانات / aws -uster-init-kops-terraform / variables.tf ، قم بتغيير اسم المجموعة إلى الاسم المطلوب. لا تنس أن تأخذ خوادم DNS الخاصة بنا من ملف
update.json وقم بتحديثها حيث اشتريت نطاقك.
Kops
نقوم بإنشاء كتلة من خلال
kops ، وتصدير التكوين إلى ملف
.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}
هناك حاجة إلى ملاحظة صغيرة هنا. ستقوم Terraform بإنشاء VPC ، وسنحتاج إلى تعديل التكوين الذي ستمنحه لنا Kops . يتم ذلك ببساطة من خلال صورة مساعد الريان / gensubnets: 0.1
يمكنك إضافة سياسات فورية للطريق 53.
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": ["*"] } ]
تحرير من خلال
kops تحرير المجموعة $ {NAME} .

الآن يمكننا رفع الكتلة نفسها.
kops update cluster \ --out=. \ --target=terraform \ ${NAME} terraform apply
كل شيء يسير على ما يرام ،
سيتغير سياق
kubectl . في المجلد
data data / aws -uster-init-kops-terraform ، سنقوم بتخزين حالة الكتلة. يمكنك فقط وضع كل شيء في
بوابة وإرساله إلى مستودع bitpack خاص.
$ 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. رفع طلبنا
الآن لدينا شيء ما ، يمكننا نشر خدماتنا في كتلة. سأضع تكوينات تقريبية في
نفس المستودع . يمكن وضعها في حزمة في
البيانات / k8s .
نكت الخدمة
لنبدأ بأشياء الخدمة. نحن بحاجة إلى
دفة القيادة ،
والطريق 53 ،
وفصول التخزين والوصول إلى سجلنا الخاص على
hub.docker.com . حسنا ، أو إلى أي شخص آخر ، إذا كانت هناك رغبة كهذه.
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
لقد أحرقت عدة مرات باستخدام عامل إرساء ليس للحاويات
عديمة الجنسية ، ولكن التكوين الأخير حتى الآن أثبت أنه الأكثر ملاءمة. أستخدم
Stolon لتوفير قابلية التوسع. حوالي عام الرحلة أمر طبيعي.
ننشر
مخططات الدفة واثنين من تكوينات Redis السريعة.
Nginx + php
حفنة المعتادة.
Nginx و
php-fpm . لم أقم بتنظيف التكوينات بشكل خاص ، ولكن يمكن للجميع التهيئة بأنفسهم. قبل التقديم ، يجب عليك تحديد الصورة التي سنأخذ منها الرمز + إضافة سطر شهادة من
مدير شهادة AWS . Php نفسها - يمكنك أخذه من الرصيف ، لكني بنيت واحدة خاصة بي عن طريق إضافة عدد قليل من المكتبات.
kubectl apply -f nginx kubectl apply -f php
في صورتنا مع الرمز ، نقوم بتخزينه في مجلد
/ crm-code . نحن نستبدلها بصورتك وستعمل بشكل صحيح تمامًا. الملف هو
nginx / distribution.yml .

أخرج المجال.
ستقوم خدمة
Route53 باستلامها ، وتغيير / إضافة سجلات DNS ، وسيتم
تحميل الشهادة إلى
ELB من
مدير شهادة AWS . الملف هو
nginx / service.yml .

إلى الأمام متغيرات env في php لجعلها في الداخل والاتصال بـ
PostgreSQL / Redis . الملف هو
php / Publishing.yml .

ونتيجة لذلك ، لدينا مجموعة
K8S ، والتي يمكننا على المستوى الأساسي توسيع نطاقها وإضافة خدمات جديدة وخوادم جديدة (عُقد) وتغيير عدد مثيلات
PostgreSQL و PHP و Nginx والعيش قبل ظهور شخص منفصل في الفريق يقوم بذلك .
كجزء من هذه الملاحظة القصيرة ، لن أتطرق إلى مشاكل النسخ الاحتياطي / المراقبة لكل هذه الأشياء. في المرحلة الأولية ، سيكون
المضيف المحلي كافيًا
: 8001 / ui من خدمة
لوحة القيادة K8S . في وقت لاحق سيكون من الممكن ربط
Prometheus أو
Grafana أو
Barman أو أي حلول أخرى مماثلة.
باستخدام محطة طرفية أو
Teamcity ،
سيقوم Jenkins بتحديث الرمز بعمل شيء مثل هذا.
سأكون سعيدًا إذا كان ذلك مثيرًا للاهتمام لشخص ما وسعيدًا مضاعفًا إذا ساعد أي شخص. شكرا لكم على اهتمامكم. مرة أخرى ، أرفق رابطًا إلى المستودع
الأول والثاني .