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/awseks
cd /usr/local/awseks
curl"https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
unzip awscli-bundle.zip
sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
aws –version
3.2 配置aws cli 角色
#配置aws cli的用户权限
$aws configure
AWS 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。
#设置默认region
export AWS_DEFAULT_REGION=cn-north-1
export AWS_REGION=cn-north-1
#eksctl
#linux
curl -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.gz
sudo mv ./eksctl /usr/local/bin
#kubectl
https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html
#Linux
curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.15.10/2020-02-22/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin
检查工具的版本 eksctl (版本>=0.15.0),kubectl(版本>=1.15)
$eksctl version
0.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-1
AWS_DEFAULT_REGION=cn-north-1
CLUSTER_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 meddix
cd mendix
vim postgres-service.yaml
## postgres-service.yaml
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
type: ClusterIP
ports:
- port: 5432
selector:
service: postgres
vim postgres-deployment.yaml
## postgres-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
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: v1
kind: Service
metadata:
name: mendix-app-service
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: mendix-k8s
type: LoadBalancer
vim mendix-app-secrets.yaml
## mendix-app-secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: mendix-app-secrets
type: Opaque
data:
admin-password: UGFzc3dvcmQxIQ==
db-endpoint: cG9zdGdyZXM6Ly9tZW5kaXg6bWVuZGl4QHBvc3RncmVzLXNlcnZpY2U6NTQzMi9kYjA=
vim mendix-app.yaml
## mendix-app.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mendix-k8s-stateful
labels:
app: mendix-k8s
spec:
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/