Spring boot 在AWS(EKS)上运行MySQL群集支持、支持HTTPS的Spring boot应用程序
我正在看一个关于如何使用AWS EKS(Kubernetes的弹性容器服务)和现有SSL通配符证书运行spring boot、mysql支持的应用程序的分步教程,但没有找到完整的解决方案 该应用程序是一个标准的Spring boot自包含应用程序,由MySQL数据库支持,在端口8080上运行。我需要以高可用性、高冗余运行它,包括需要处理大量写入和读取的MySQL dbSpring boot 在AWS(EKS)上运行MySQL群集支持、支持HTTPS的Spring boot应用程序,spring-boot,docker,kubernetes,amazon-eks,Spring Boot,Docker,Kubernetes,Amazon Eks,我正在看一个关于如何使用AWS EKS(Kubernetes的弹性容器服务)和现有SSL通配符证书运行spring boot、mysql支持的应用程序的分步教程,但没有找到完整的解决方案 该应用程序是一个标准的Spring boot自包含应用程序,由MySQL数据库支持,在端口8080上运行。我需要以高可用性、高冗余运行它,包括需要处理大量写入和读取的MySQL db 我决定使用EKS托管的集群,将自定义Docker映像保存到AWS自己的ECR私有Docker repo,以对抗EKS托管的MyS
我决定使用EKS托管的集群,将自定义Docker映像保存到AWS自己的ECR私有Docker repo,以对抗EKS托管的MySQL集群。并使用AWS颁发的SSL证书通过HTTPS进行通信。下面是我的解决方案,但我很想看看如何以不同的方式来完成这项工作这是一个循序渐进的教程。在上一步完成之前,请不要继续 创建EKS集群 按照以下步骤创建EKS集群。不要做第四步。完成后,您应该拥有一个工作的EKS群集,并且必须能够使用
kubectl
实用程序与群集通信。从命令行执行时,您应该可以看到使用
kubectl get all--all名称空间
命令
安装MYSQL集群
我使用helm
安装MySQL集群,步骤如下。以下是步骤
安装头盔
由于我将Macbook Pro与homebrew
一起使用,因此我使用了brew安装kubernetes helm
命令
部署MySQL集群
注意,在MySQL集群和Kubernetes(EKS)集群中,“集群”一词指的是两种不同的东西。基本上,您将集群安装到集群中,就像俄罗斯的Matryoshka玩偶一样,所以您的MySQL集群最终运行在EKS集群节点上
我使用了第二部分(忽略kops部分)来准备helm
图表并安装MySQL集群。引用舵配置:
$ kubectl create serviceaccount -n kube-system tiller
serviceaccount "tiller" created
$ kubectl create clusterrolebinding tiller-crule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
clusterrolebinding.rbac.authorization.k8s.io "tiller-crule" created
$ helm init --service-account tiller --wait
$HELM_HOME has been configured at /home/presslabs/.helm.
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!
$ helm repo add presslabs https://presslabs.github.io/charts
"presslabs" has been added to your repositories
$ helm install presslabs/mysql-operator --name mysql-operator
NAME: mysql-operator
LAST DEPLOYED: Tue Aug 14 15:50:42 2018
NAMESPACE: default
STATUS: DEPLOYED
我完全按照上面引用的方式运行所有命令
在创建集群之前,您需要一个包含ROOT_密码密钥的密钥
创建一个名为example cluster secret.yaml
的文件,并将以下yaml代码复制到其中
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
# root password is required to be specified
ROOT_PASSWORD: Zm9vYmFy
但是那是什么ROOT\u密码
?事实证明,这是您计划用于MySQL根用户的base64编码密码。说你想要root/foobar
(请不要实际使用foobar
)。对密码进行编码的最简单方法是使用其中一个网站,例如将foobar
编码为Zm9vYmFy
准备好后执行kubectl apply-f示例cluster secret.yaml,它将创建一个新的秘密
然后,您需要创建一个名为example cluster.yaml
的文件,并将以下yaml代码复制到其中:
apiVersion: mysql.presslabs.org/v1alpha1
kind: MysqlCluster
metadata:
name: my-cluster
spec:
replicas: 2
secretName: my-secret
请注意secretName
与您刚才创建的秘密名称的匹配情况。只要它在两个文件中都匹配,就可以将其更改为更有意义的内容。现在运行kubectl apply-f example cluster.yaml
最终创建一个MySQL集群。测试一下
$ kubectl get mysql
NAME AGE
my-cluster 1m
请注意,我没有按照本文其余部分所述配置备份。数据库运行时不需要这样做。但是如何访问数据库呢?此时mysql服务已经存在,但它没有外部IP。在我的情况下,我甚至不希望,只要我的应用程序将运行在同一EKS集群可以访问它
但是,您可以使用kubectl
端口转发从运行kubectl
的dev box访问数据库。键入以下命令:kubectl端口转发服务/mycluster mysql 8806:3306
。现在,您可以使用用户root
和非编码密码(foobar
)从127.0.0.1:8806
访问数据库。在单独的命令提示符下键入:mysql-uroot-h127.0.0.1-p8806-P
。有了它,您还可以使用MySQL Workbench来管理您的数据库,只是别忘了运行port-forward
。当然,您也可以将8806更改为您选择的其他端口
将应用程序打包为DOCKER映像并部署
要将Spring boot应用程序部署到EKS集群中,您需要将其打包到Docker映像并部署到Docker repo中。让我们从Docker图像开始。关于这方面有很多教程,但步骤很简单:
将生成的、自包含的spring boot jar文件放入目录中,并在同一目录中创建一个具有以下确切名称的文本文件:Dockerfile
,并向其中添加以下内容:
FROM openjdk:8-jdk-alpine
MAINTAINER me@mydomain.com
LABEL name="My Awesome Docker Image"
# Add spring boot jar
VOLUME /tmp
ADD myapp-0.1.8.jar app.jar
EXPOSE 8080
# Database settings (maybe different in your app)
ENV RDS_USERNAME="my_user"
ENV RDS_PASSWORD="foobar"
# Other options
ENV JAVA_OPTS="-Dverknow.pypath=/"
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
现在只需从同一文件夹运行Docker命令即可创建图像。当然,这需要在您的开发设备上安装Docker客户端
$docker build-t myapp:0.1.8--force rm=true--no cache=true。
如果一切顺利,您应该可以通过docker ps
命令看到您的图像
部署到私人ECR回购协议
将您的新映像部署到ECR回购非常简单,而且ECR可直接与EKS配合使用。登录AWS控制台并导航到。我发现很困惑,显然每个图像需要一个存储库,但当您单击“创建存储库”按钮时,将图像名称(例如myapp
)放入文本字段。现在,您需要复制图像的丑陋URL并返回命令提示符
标记并推送您的图像。我使用了一个假URL作为示例:901237695701.dkr.ecr.us-west-2.amazonaws.com
您需要从上一步复制自己的URL
$ docker tag myapp:0.1.8 901237695701.dkr.ecr.us-west-2.amazonaws.com/myapp:latest
$ docker push 901237695701.dkr.ecr.us-west-2.amazonaws.com/myapp:latest
此时,图像应该显示在您创建的ECR存储库中
将应用部署到EKS群集
现在,您需要为应用程序的Docker映像创建Kubernetes部署。创建一个包含以下内容的myapp deployment.yaml
文件
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: myapp-deployment
spec:
selector:
matchLabels:
app: myapp
replicas: 2
template:
metadata:
labels:
app: myapp
spec:
containers:
- image: 901237695701.dkr.ecr.us-west-2.amazonaws.com/myapp:latest
name: myapp
ports:
- containerPort: 8080
name: server
env:
# optional
- name: RDS_HOSTNAME
value: "10.100.98.196"
- name: RDS_PORT
value: "3306"
- name: RDS_DB_NAME
value: "mydb"
restartPolicy: Always
status: {}
注浩
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://${RDS_HOSTNAME}:${RDS_PORT}/${RDS_DB_NAME}?autoReconnect=true&zeroDateTimeBehavior=convertToNull
spring.datasource.username=${RDS_USERNAME}
spring.datasource.password=${RDS_PASSWORD}
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
ports:
- port: 443
targetPort: 8080
protocol: TCP
name: http
selector:
app: myapp
type: LoadBalancer