我需要提升Kubernetes集群,但是我只是一个代码程序员。 有出路



大家好 根据我的经验的另一个说明。 这次是关于基础架构的浅谈,如果需要卸载某些东西,我会使用该基础架构,但是附近没有devOps专家 。 但是,目前的技术抽象水平允许在夜间使用互联网和现成的东西使用这种基础架构来使用大约一年。

关键字-AWS + Terraform + kops 。 如果这对我有用,则可能对其他人有用。 欢迎发表评论。

-1。 我们正在处理的是


典型的情况-该项目已写到需要将其卸载到某个地方并开始使用的阶段。 而且该项目比简单的html页面更复杂。 我希望水平扩展,在本地,测试,产品架上或在或多或少的正常部署过程中确定环境的可能性。
它是关于Laravel上的一个应用程序,以显示从头到尾的整个过程。 但是以类似的方式,您可以在旅途中部署各种服务,python应用程序,WP上的小型站点,html页面等等。 在一定程度上,这已经足够了,然后一个单独的人出现在团队中,他将对此进行完善和补充。
最近,我发现我在本地计算机上安装了GoLand,PhpStorm,Docker,Git ,并且我已经完全准备好工作了。 是的,您可以在一台集群中的一台计算机上进行管理,因此我将在不考虑您使用的操作系统的情况下描述整个过程,而是将所有内容打包在Docker容器中。

0.准备工作。


假设我们已经在AWS上注册了一个帐户,通过技术支持要求通过同时运行的服务器数量来增加帐户限制,创建了一个IAM用户,现在我们拥有访问密钥 + 秘密密钥 。 Zone- us-east-1

我们在本地计算机上需要什么? AWS CLI ,用于AWS声明式管理的Terraformkubectl ,用于配置集群的kops以及用于部署某些服务的Helm 。 我们收集了Dockerfile (我很久以前就在github的巨大地方找到了Dockerfile ,但是我找不到它的位置)。 我们为装载目录编写docker-compose.yml ,为别名编写Makefile

Docker文件
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 

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 

生成文件
 docker.build: docker build -t cluster.com . docker.run: docker-compose up -d docker.bash: docker exec -it cluster.com bash 


Dockerfile-获取基本的ubuntu映像并安装所有软件。 Makefile-为方便起见,您可以使用常规的别名机制。 Docker-compose.yml-我们添加了一个额外的容器,如果您需要直观地看到某些东西,它将我们扔进K8S仪表板浏览器。

我们在根目录中创建data.ssh.kube.aws文件夹 ,并在其中放置aws,ssh密钥的配置,然后可以通过make docker.build和make docker.run收集并运行容器。

好吧,在data文件夹中,创建一个文件夹,在其中放置yaml k8s文件,然后在第二个文件夹旁边,存储集群的地形状态。 我这个阶段大概结果放在github上

1.提升集群。


接下来将是注释的免费翻译。 我将省略许多理论要点,尝试描述一个简短的挤压。 都一样,我的注释格式为tldr。

在我们的data / 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-cluster-init-kops-terraform/variables.tf中 ,将群集名称更改为所需名称。 不要忘记从update.json文件中获取我们的dns服务器,并在购买域名的地方对其进行更新。

 #    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创建集群,将配置导出到.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将为我们提供的配置。 通过ryane / gensubnets辅助图像非常简单地完成此操作:0.1
 #   terraform output -json > subnets.json 

 #     echo subnets.json | docker run --rm -i ryane/gensubnets:0.1 

您可以为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": ["*"] } ] 

通过kops编辑编辑群集$ {NAME}



现在我们可以提高集群本身。

 kops update cluster \ --out=. \ --target=terraform \ ${NAME} terraform apply 

一切都会顺利进行, kubectl的上下文将会改变。 在文件夹data / aws-cluster-init-kops-terraform中 ,我们将存储集群状态。 您可以将所有内容放入git并将其发送到私有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的形式放在数据包中。

服务笑话


让我们从服务内容开始。 我们需要helmroute53存储类,并需要访问我们在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


我使用docker烧了很多遍,而不是无状态容器,但是到目前为止,最后一种配置被证明是最合适的。 我使用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


通常的一堆。 Nginxphp-fpm 。 我没有特别清理配置,但每个人都可以自行配置。 申请之前,您必须指定要从中获取代码的图像,然后从AWS Certificate Manager添加证书行。 PHP本身-您可以从dockerhab中获取它,但是我通过添加一些库来构建了我的私有库。

 kubectl apply -f nginx kubectl apply -f php 

在带有代码的映像中,我们将其存储在/ crm-code文件夹中。 我们用您的图片替换了它,它将可以正常工作。 该文件是nginx / deployment.yml



带出域。 Route53服务将对其进行提取,更改/添加DNS记录,该证书将从AWS Certificate Manager 上载到ELB 。 该文件是nginx / service.yml



转发php中的env变量以使其包含在其中并连接到PostgreSQL / Redis 。 该文件为php / deployment.yml



结果,我们有了一个K8S集群,在基本级别上,我们可以扩展,添加新服务,新服务器(节点),更改PostgreSQL,PHP,Nginx实例的数量并在一个单独的人出现在团队中之前将其运行。

作为本简短说明的一部分,我将不涉及所有这些内容的备份/监视问题。 在初始阶段,通过K8S仪表板服务提供localhost就足够了:8001 / ui 。 稍后,可以固定PrometheusGrafanaBarman或任何其他类似的解决方案。

使用终端或TeamcityJenkins更新代码将执行以下操作。

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

如果对某人有趣,我会感到高兴;如果对任何人有帮助,我也会感到高兴。 谢谢您的关注。 再次,我将链接附加到存储库one2

Source: https://habr.com/ru/post/zh-CN423481/


All Articles