Mendix部署亚马逊AWS容器服务最佳实践

1. Mendix云部署架构

Mendix官方文档介绍了如何部署Mendix应用到k8s的最佳实践。运行环境包括PostgreSQL数据库实例,或者其他数据库,Mysql、oracle等,本地文件存储系统,本地k8s集群。部署方式采用kubectl工具,通过yaml文件命令行方式运行。

所需运行组件的部署架构如下:

Mendix应用部署依赖的k8s组件包括:

•   StatefulSet:用于Mendix应用的部署组件,部署两个pod。因为组件支持为pod编号,可以保证按照顺序管理pod,因此用于支持有状态的应用拓扑架构。

•   Deployment:用于部署数据库组件,提供了使用PostgreSQL容器的部署脚本。

•   Services:容器集群中的pod必须通过Service组件提供对外访问,可以提供固定IP地址和端口。本文为了满足Mendix应用和自建数据库的访问,分别创建了两个Service。

•   Volumes:用于为pod提供数据存储。

•   Ingress/LoadBalancer:是代理后端Service而设置的负载均衡服务。

•   Pods:最小编排单元,用于管理容器镜像。

2. AWS的EKS服务

Amazon Elastic Kubernetes Service(Amazon EKS)是一项托管服务,可让您在AWS上轻松运行 Kubernetes,而无需支持或维护您自己的 Kubernetes 控制层面。Kubernetes 是一个用于实现容器化应用程序的部署、扩展和管理的自动化的开源系统。

AmazonEKS 跨多个可用区运行 Kubernetes 控制层面实例以确保高可用性。Amazon EKS 可以自动检测和替换运行状况不佳的控制层面实例,并为它们提供自动版本升级和修补。

Amazon EKS 还与许多 AWS 服务集成以便为您的应用程序提供可扩展性和安全性,包括:

•   用于容器镜像的 Amazon ECR

•   用于负载分配的 ELB

•   用于身份验证的 IAM

•   用于隔离的 Amazon VPC

Amazon EKS 工作原理

AmazonEKS 可为您预配置(启动)和管理 Kubernetes 控制平面。总体来说,Kubernetes 由两大组件构成 – 运行容器的工作节点集群和管理容器在集群上的启动时间和位置并监控容器状态的控制平面。

如果不使用 Amazon EKS,您需要自行管理 Kubernetes 控制平面和工作节点集群。借助 Amazon EKS,您可以使用Amazon 系统镜像 (AMI) 和 AWS CloudFormation 脚本预置工作节点集群,而 AWS 负责使用高可用且安全的配置来预置、扩展和管理 Kubernetes 控制平面,从而消除了运行Kubernetes 的繁重运维负担,让您能够专注于应用程序构建而非 AWS基础设施管理。

3. 准备实验环境

参照官方AWS EKS服务提供的workshop实践环境

https://github.com/aws-samples/eks-workshop-greater-china

本次Mendix app需要的软件环境有AWS cli , eksctl ,kubectl,以及AWS EKS对应操作的IAM权限。

3.1 安装 aws cli

•   利用awscli-bundle安装 linux / macOS

mkdir -p /usr/local/awsekscd  /usr/local/awsekscurl"https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"unzip awscli-bundle.zipsudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/awsaws –version

3.2  配置aws cli 角色

#配置aws cli的用户权限$aws configureAWS Access Key ID :AWS Secret Access Key :Default region name:Default output format [None]:

键入该命令时,AWS CLI 会提示您输入四条信息:访问密钥、秘密访问密钥、AWS 区域和输出格式。此信息存储在名为 default 的配置文件(一个设置集合)中。将使用此配置文件,除非您指定另一个文件。

以上Access Key ID、Secret Access Key、region name为必填字段,识别AWS账号信息可在个人账号的IAM角色的SecurityCredentials下。

保存accesskey和Secretaccess key,Aws提供的region name值可以为cn-northwest-1。

#测试AK/SK是否生效aws sts get-caller-identity #如果可以正常返回以下内容(包含account id),则表示已经正确设置角色权限{
   
      "Account":"<your account id, etc.11111111>",    "UserId":"AIDAIG42GHSYU2TYCMCZW",    "Arn":"arn:aws:iam::<your account id, etc.11111111>:user/<iam user>"}

3.3  安装 eksctl,kubectl 

目前eksctl对于China region的支持需要版本 >=eksctl 0.15.0,具体参考 https://github.com/weaveworks/eksctl。

#设置默认regionexport AWS_DEFAULT_REGION=cn-north-1export AWS_REGION=cn-north-1 #eksctl#linuxcurl -OL"https://github.com/weaveworks/eksctl/releases/download/0.15.0-rc.2/eksctl_$(uname -s)_amd64.tar.gz"tar -zxf eksctl_$(uname -s)_amd64.tar.gzsudo mv ./eksctl /usr/local/bin #kubectlhttps://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html#Linuxcurl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.15.10/2020-02-22/bin/linux/amd64/kubectl chmod +x ./kubectlsudo mv ./kubectl /usr/local/bin

检查工具的版本 eksctl (版本>=0.15.0),kubectl(版本>=1.15)

$eksctl version0.15.0-rc.2$kubectl version

由于我们的EKS还没创建,所以kubectl连接不到server端,暂时不用考虑。

 

4.  创建EKS集群

4.1  使用eksctl 创建EKS集群

(操作需要10-15分钟),该命令同时会创建一个使用t3.small的受管节点组。

详细参考手册:

  • creating-and-managing-clusters

  • managing-nodegroups

#环境变量#CLUSTER_NAME 集群名称#AWS_REGION cn-northwest-1:宁夏区;cn-north-1:北京区 AWS_REGION=cn-north-1AWS_DEFAULT_REGION=cn-north-1CLUSTER_NAME=mendix #参数说明#--node-type 工作节点类型默认为m5.large#--nodes 工作节点数量默认为2 eksctl create cluster--name=${CLUSTER_NAME} --node-type t3.medium --managed --alb-ingress-access--region=${AWS_REGION}

参考输出:

之后可以在控制台中查看相关信息,如:CloudFormation,EKS集群,EC2等。

查看EKS集群信息:

4.2  更新Kubernetes Cluster版本

默认的k8s集群是1.14,也可以不更新,我们体验一下最新的版本1.15:

Cluster的控制平面(k8s的master)大约需要5分钟更新,接下来更新节点组(k8s的node):

默认会创建2个节点,点击立即更新即可:

集群创建完毕后,查看EKS集群工作节点:kubectl get node

参考输出:

 

5.  部署Mendix app

5.1  准备源文件

新建文件夹mendix,存放5个文件分别是postgres-service.yaml、postgres-deployment.yam,mendix-app-service.yaml,mendix-app-secrets.yaml,mendix-app.yaml。

mkdir meddixcd mendixvim  postgres-service.yaml## postgres-service.yamlapiVersion: v1kind: Servicemetadata:  name: postgres-servicespec:  type: ClusterIP  ports:    - port: 5432  selector:    service: postgres vim  postgres-deployment.yaml## postgres-deployment.yaml   apiVersion: apps/v1kind: Deploymentmetadata:  name: postgresspec:  replicas: 1  selector:    matchLabels:      service: postgres  template:    metadata:      labels:        service: postgres    spec:      containers:        - name: postgres          image: postgres:10.1          ports:            - containerPort: 5432          env:            - name: POSTGRES_DB              value: db0            - name: POSTGRES_USER              value: mendix            - name: POSTGRES_PASSWORD              value: mendix          volumeMounts:            - mountPath: "/var/lib/postgresql/data"              name: "mendix-pgdata"      volumes:        - hostPath:            path: "/home/docker/pgdata"          name: mendix-pgdata    vim mendix-app-service.yaml## mendix-app-service.yaml         apiVersion: v1kind: Servicemetadata:  name: mendix-app-service  annotations:        service.beta.kubernetes.io/aws-load-balancer-type: nlbspec:  ports:  - port: 80    protocol: TCP    targetPort: 8080  selector:    app: mendix-k8s  type: LoadBalancer  vim mendix-app-secrets.yaml##  mendix-app-secrets.yamlapiVersion: v1kind: Secretmetadata:  name: mendix-app-secretstype: Opaquedata:  admin-password: UGFzc3dvcmQxIQ==   db-endpoint: cG9zdGdyZXM6Ly9tZW5kaXg6bWVuZGl4QHBvc3RncmVzLXNlcnZpY2U6NTQzMi9kYjA= vim mendix-app.yaml## mendix-app.yamlapiVersion: apps/v1kind: StatefulSetmetadata:  name: mendix-k8s-stateful  labels:    app: mendix-k8sspec:  serviceName: mendix-k8s-ss  replicas: 2  selector:    matchLabels:      app: mendix-k8s  template:    metadata:      labels:        app: mendix-k8s    spec:      containers:        - name: mendix-app          image: qs0qdd/heartracking:v1.5          ports:            - containerPort: 8080          env:            - name: ADMIN_PASSWORD              valueFrom:                secretKeyRef:                  name: mendix-app-secrets                  key: admin-password            - name: DATABASE_ENDPOINT              valueFrom:                secretKeyRef:                  name: mendix-app-secrets                  key: db-endpoint                

[root@ibsshl13 awseks]# tree mendix/mendix/├── mendix-app-secrets.yaml├── mendix-app-service.yaml├── mendix-app.yaml├── postgres-deployment.yaml​└── postgres-service.yaml

5.2 运行

##运行kubectl apply -f mendix/#查看mendix访问域名Kubectl get svc –namespaces      

service类型为LoadBalancer,需要在安全组中添加入站规则,TCP  5678

通过域名+5678即可访问:

使用mendix/Passward1!   登录:

对于mendix应用只需要修改mendix-app.yaml文件的image镜像即可。

Mendix镜像构建参考:

https://github.com/mendix/docker-mendix-buildpack


更多信息,请访问以下链接:

Mendix官网:https://www.mendix.com/zh/

Mendix行业解决方案:https://solutions.mendix.com/

Mendix平台指南:https://www.mendix.com/evaluation-guide/

Mendix动画展示:https://www.mendix.com/demos/

Mendix公众号

谢谢阅读!

猜你喜欢

转载自blog.csdn.net/Mendix/article/details/114659835