十个步骤在Kubernetes上在AWS上部署Elasticsearch


Kubernetes aka k8s是一个开源系统,用于自动化容器化应用程序的部署,扩展和管理。 在本文中,我将向您展示如何设置Kubernetes集群并将Elasticsearch集群部署到AWS上。 这些设置也可以在GCEAzure上使用


在AWS上配置Kubernetes


首先,获得对以下AWS服务的管理访问权: S3,EC2,Route53,IAMVPC


1.安装:我将显示Linux版CLI的安装。 如果您使用其他操作系统,请按照以下链接获取适用于您的操作系统的安装说明。


首先,将AWS CLI设置为通过CLI访问AWS。 如果您已经拥有Python和pip,请运行以下命令:


 pip install awscli --upgrade --user 

然后,我们使用Kops (一种命令行工具),它引导我们完成K8S生产级集群的设置。
直接从github安装Kops二进制文件。


 wget -O kops https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64 chmod +x ./kops sudo mv ./kops /usr/local/bin/ 

最后,我们使用kubectl -CLI来管理K8S集群(如果使用docker,则类似于docker CLI)。 通过以下命令安装最新版本:


 wget -O kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl 

注意:您可以在minikube家用计算机上启动Kubernetes集群并按照本文中的说明进行操作


2.创建IAM用户:要在AWS中创建集群,我们将为kops创建一个单独的IAM用户。 对于kops需要一个API帐户。 通过AWS控制台用户界面创建用户并配置账户。 kops用户将需要以下IAM权限:


  • AmazonEC2完全访问
  • 亚马逊Route53FullAccess
  • AmazonS3FullAccess
  • IAMF完全访问
  • 亚马逊VPCFullAccess


或者,您可以通过以下命令从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/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 

注意SecretAccessKeyAccessKeyID


将AWS CLI配置为通过aws configure使用您的账户。


确保您创建的用户在aws iam list-users


我们将AWS账户导出为以下环境变量,以便CLI kops可以使用它们。


 export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key) 

如果使用Kops 1.6.2或更高版本,则设置DNS是可选的。 您可以创建一个八卦集群。 唯一的要求:群集名称必须以.k8s.local

DNS设置


如果您已经通过AWS托管您的域并计划使用它,则无需执行任何操作。 另一个选择:如果要使用域的子域,请为此子域创建第二个公共托管区域。 在本手册中,我们将使用私有托管区域。 用任何名称设置区域。 使用此名称创建Kubernetes集群。 在此处阅读有关设置DNS的更多信息。


3.创建一个S3存储桶:要保存K8S集群的状态和外观,您需要为kops创建一个单独的S3存储桶。 该存储桶将成为配置群集可靠数据的来源。


 aws s3api create-bucket \ --bucket <your-unique-bucket-name> \ --region us-east-1 

注意:如果您将铲斗在us-east-1之外的其他- region除了设置- region切换到所需区域,然后将LocationConstraint添加到同一区域。 以下显示了us-west-1中的bucket build命令。


 aws s3api create-bucket \ --bucket <your-unique-bucket-name> \ --region us-west-1 \ --create-bucket-configuration LocationConstraint=us-west-1 

要为S3存储桶版本配置存储以进行恢复,请使用以下命令:


 aws s3api put-bucket-versioning \ --bucket <your-unique-bucket-name> \ --versioning-configuration Status=Enabled 

4.创建第一个Kubernetes集群:这样,您就可以创建第一个集群了! 首先,设置环境变量以简化过程。 如果跳过了DNS配置(在第2步之后),请将.k8s.local添加到NAME值。


 export NAME=myfirstcluster.example.com export KOPS_STATE_STORE=s3://your-bucket-name 

不要忘记跟踪您可以使用哪些区域。 在此示例中,我们将在us-east-2区域中部署一个集群。


 aws ec2 describe-availability-zones --region us-east-2 

如果使用公共托管区域,请使用以下命令创建集群:


 kops create cluster \ --zones us-east-2c \ --node-count 3 \ ${NAME} 

如果您使用私人托管区域,请执行以下操作:


 kops create cluster \ --zones us-east-2c \ --node-count 3 \ --dns private ${NAME} 

该命令将为您提供K8S集群配置日志。 集群启动需要花费时间,因为它为minion主节点创建了新的EC2计算机。


 [ec2-user@ip-172-31-35-145 test]$ kops create cluster \ > --dns private \ > --zones us-east-2c \ > --node-count 3 \ > ${NAME} --yes I0306 09:45:29.636834 20628 create_cluster.go:439] Inferred --cloud=aws from zone "us-east-2c" I0306 09:45:29.637030 20628 create_cluster.go:971] Using SSH public key: /home/ec2-user/.ssh/id_rsa.pub I0306 09:45:29.850021 20628 subnets.go:184] Assigned CIDR 172.20.32.0/19 to subnet us-east-2c I0306 09:45:31.118837 20628 dns.go:92] Private DNS: skipping DNS validation I0306 09:45:46.986963 20628 executor.go:91] Tasks: 73 done / 73 total; 0 can run I0306 09:45:46.987101 20628 dns.go:153] Pre-creating DNS records I0306 09:45:47.668392 20628 update_cluster.go:248] Exporting kubecfg for cluster kops has set your kubectl context to k8s.appbase Cluster is starting. It should be ready in a few minutes. 

瞧! K8s集群应该已经在工作。


5.群集检查: kops创建的所有实例都在ASG(Auto Scaling组)中 。 发生故障时,将检查ASG实例并自动重建。


要更改群集配置,请运行以下命令:


 kops edit cluster ${NAME} 

每次更改集群配置时,都需要通过运行以下命令来创建集群:


 kops update cluster ${NAME} --yes 

您将看到类似这样的内容。


 [ec2-user@ip-172-31-35-145 examples]$ kops update cluster --yes Using cluster from kubectl context: k8s.appbase I0216 05:09:06.074467 2158 dns.go:92] Private DNS: skipping DNS validation I0216 05:09:07.699380 2158 executor.go:91] Tasks: 73 done / 73 total; 0 can run I0216 05:09:07.699486 2158 dns.go:153] Pre-creating DNS records I0216 05:09:07.961703 2158 update_cluster.go:248] Exporting kubecfg for cluster kops has set your kubectl context to k8s.appbase Cluster changes have been applied to the cloud. 

检查集群。


 kops validate cluster 

确保群集已启动并正在运行。


 Using cluster from kubectl context: k8s.appbase Validating cluster k8s.appbase INSTANCE GROUPS NAME ROLE MACHINETYPE MIN MAX SUBNETS master-us-east-2c Master t2.large 1 1 us-east-2c nodes Node t2.medium 3 3 us-east-2c NODE STATUS NAME ROLE READY ip-172-20-44-33.us-east-2.compute.internal master True ip-172-20-52-48.us-east-2.compute.internal node True ip-172-20-62-30.us-east-2.compute.internal node True ip-172-20-64-53.us-east-2.compute.internal node True Your cluster k8s.appbase is ready 

查看您的新k8s!


通过简单调用Kubernetes API,您可以检查API是否在线并且正在监听。 使用kubectl检查节点。


 kubectl get nodes 

这将提供有关您的节点及其当前状态的信息。


 [ec2-user@ip-172-31-35-145 elasticsearch]$ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-172-20-44-33.us-east-2.compute.internal Ready master 1m v1.8.6 ip-172-20-52-48.us-east-2.compute.internal Ready node 3m v1.8.6 ip-172-20-62-30.us-east-2.compute.internal Ready node 2m v1.8.6 ip-172-20-64-53.us-east-2.compute.internal Ready node 4m v1.8.6 

Kubernetes子是一种抽象,代表一组一个或多个应用程序容器(例如Docker)以及这些容器的几个共享资源。 在节点上展开。 如果需要扩展应用程序,请将节点添加到已部署的K8S。


要了解可用的吊舱:


 kubectl get pods 

此命令将列出群集中的可用炉床。


 [ec2-user@ip-172-31-35-145 ~]$ kubectl get pods NAME READY STATUS RESTARTS AGE es-5967f5d99c-5vcpb 1/1 Running 0 3h es-5967f5d99c-cqk88 1/1 Running 0 3h es-5967f5d99c-lp789 1/1 Running 0 3h 

K8S集群中的Elasticsearch部署



如果您不熟悉Kubernetes,建议您使用k8s在线培训


目前,我们已经在K8S集群中创建了:主节点和两个代理节点。 主节点的作用是将部署命令传输到在节点代理的pod中运行的应用程序。


K8S应用程序部署是声明性的,并通过JSON / YAML文件进行配置。 根据要部署的应用程序或系统的类型选择控制器。 由于Elasticsearch是有状态的应用程序,因此我们将使用StatefulSet控制器。


6.通过StatefulSet进行部署。 StatefulSet根据相同容器的规范管理容器。 它管理炉床集的部署和扩展,并确保这些炉床的顺序和唯一性。 StatefulSet控制器还使将应用程序与持久卷关联变得容易,这对于Elasticsearch非常重要。


创建一个名为es-stateful set. yaml的文件。 它将包含Elasticsearch规范。 随时更改配置。 有关可以传递到您的Elasticsearch图像的环境变量的列表, 请参见此处


7.服务: Service Kubernetes-一种抽象,定义了逻辑上的并对其进行访问。 这有助于容器应用程序识别另一个炉膛中的另一个容器应用程序或它自己的实例。



LoadBalancer是一种特殊类型的服务,它向外部网络提供Pod并分配负载。 我们将使用它来创建一个外部IP地址,任何人都可以通过该IP地址联系Elasticsearch集群。 我们将此服务用于ES节点,以发现对方。


创建一个名为es-svc.yaml的文件。 编辑它并指定负载均衡器服务。


 apiVersion: v1 #API Version of the resource kind: Service #Type of resource metadata: #Contains metadata of this resource. name: elasticsearch #Name of this resource labels: #Additional identifier to put on pods component: elasticsearch #puts component = elasticsearch spec: #Specifications of this resource type: LoadBalancer #type of service selector: #will distribute load on pods which component: elasticsearch #have label `component = elasticsearch` ports: #Port on which LoadBalancer will listen - name: http #Name given to port port: 9200 #Port number protocol: TCP #Protocol supported - name: transport #Name given to port port: 9300 #Port number protocol: TCP #Protocol supported 

8.创建一个应用程序:这就是我们所需要的。 使用以下命令在K8S上部署我们的Elasticsearch集群。


 kubectl create -f es-statefulset.yaml kubectl create -f es-svc.yaml 

“创建”是用于在K8S中创建任何资源的通用命令。


我们的3节点(在StatefulSet配置中还记得replicas = 3吗?)Elasticsearch集群将立即启动。


我们可以使用以下命令检查Elasticsearch pod:


 kubectl get pods 

 [ec2-user@ip-172-31-35-145 test]$ kubectl get pods,svc,deployment NAME READY STATUS RESTARTS AGE es-0 1/1 Running 0 23m es-1 1/1 Running 0 17m es-2 1/1 Running 0 23m 

9.测试Elasticsearch集群:检查Elasticsearch配置是否正确并且可以正常工作。 获取外部IP地址以连接到Elasticsearch。 它将位于我们创建的LoadBalancer服务 。 使用以下命令描述LoadBalancer


 kubectl describe service elasticsearch 

 [ec2-user@ip-172-31-35-145 examples]$ kubectl describe service elasticsearch Name: elasticsearch Namespace: default Labels: component=elasticsearch Annotations: <none> Selector: component=elasticsearch Type: LoadBalancer IP: 100.70.114.146 LoadBalancer Ingress: http://a4d0c157d212811e898430af47d23da1-952261901.us-east-2.elb.amazonaws.com Port: http 9200/TCP TargetPort: 9200/TCP NodePort: http 31358/TCP Endpoints: 100.96.4.28:9200 Port: transport 9300/TCP TargetPort: 9300/TCP NodePort: transport 31767/TCP Endpoints: 100.96.4.28:9300 Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal EnsuringLoadBalancer 1m service-controller Ensuring load balancer Normal EnsuredLoadBalancer 1m service-controller Ensured load balancer [ec2-user@ip-172-31-35-145 examples]$ 

注意LoadBalancer Ingress的值。 打开带有Elasticsearch外部端口的URI和后缀号的浏览器: 9200 。 您将看到:



您可以通过在外部IP地址上添加以下代码来检查Elasticsearch节点的功能: 9200/_cluster /health?pretty



10. Kubernetes修复测试: StatefulSets 可以存储指定数量的副本。 这样,如果子项掉落,StatefulSet将启动新的子项。


我们将通过模拟故障(删除运行ES实例的所有Pod)来测试它,以查看ES集群是否可以自动备份完整的数据。



由于StatefulSet一次运行一个炉床,因此恢复所有容器需要时间。


我们看到,炉膛恢复后,在ES故障之前的状态下,我们可以获得索引记录。


推荐的后续步骤


在生产中使用这些设置之前,请注意:


  1. 配置备份。 帮助恢复丢失的数据。 此过程最好自动化。
  2. 授权设置。 我们要保护Elasticsearch集群。 基于媒体令牌设置基本身份验证或授权将提供安全性。
  3. TLS证书。 为我们的ES群集配置LetsEncrypt /其他TLS个人域映射证书提供程序,并保护发送给它的所有请求。

虽然本文不是关于此的,但知道:Kubernetes可以完成所有这一切。


原始文档:通过10个步骤在Kubernetes上部署Elasticsearch和Kubernetes

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


All Articles