أحتاج إلى رفع مجموعة Kubernetes ، لكنني مجرد مبرمج كود. هناك مخرج



يوم جيد. ملاحظة أخرى من تجربتي. هذه المرة ، يكون الأمر سطحيًا حول البنية التحتية الأساسية ، التي أستخدمها إذا كنت بحاجة إلى تفريغ شيء ما ، ولكن لا يوجد رجال 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 للأسماء المستعارة.

ملف 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 

عامل ميناء دوكر
 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 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 

تهيئة Terraform


في ملف البيانات / aws -uster-init-kops-terraform / variables.tf ، قم بتغيير اسم المجموعة إلى الاسم المطلوب. لا تنس أن تأخذ خوادم DNS الخاصة بنا من ملف update.json وقم بتحديثها حيث اشتريت نطاقك.

 #    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


نقوم بإنشاء كتلة من خلال 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
 #   terraform output -json > subnets.json 

 #     echo subnets.json | docker run --rm -i ryane/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 . حسنا ، أو إلى أي شخص آخر ، إذا كانت هناك رغبة كهذه.

 # 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


لقد أحرقت عدة مرات باستخدام عامل إرساء ليس للحاويات عديمة الجنسية ، ولكن التكوين الأخير حتى الآن أثبت أنه الأكثر ملاءمة. أستخدم Stolon لتوفير قابلية التوسع. حوالي عام الرحلة أمر طبيعي.

ننشر مخططات الدفة واثنين من تكوينات Redis السريعة.

 #  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


حفنة المعتادة. 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 بتحديث الرمز بعمل شيء مثل هذا.

 #     -      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 

سأكون سعيدًا إذا كان ذلك مثيرًا للاهتمام لشخص ما وسعيدًا مضاعفًا إذا ساعد أي شخص. شكرا لكم على اهتمامكم. مرة أخرى ، أرفق رابطًا إلى المستودع الأول والثاني .

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


All Articles