Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 在AWS(EKS)上运行MySQL群集支持、支持HTTPS的Spring boot应用程序_Spring Boot_Docker_Kubernetes_Amazon Eks - Fatal编程技术网

Spring boot 在AWS(EKS)上运行MySQL群集支持、支持HTTPS的Spring boot应用程序

Spring 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

我正在看一个关于如何使用AWS EKS(Kubernetes的弹性容器服务)和现有SSL通配符证书运行spring boot、mysql支持的应用程序的分步教程,但没有找到完整的解决方案

该应用程序是一个标准的Spring boot自包含应用程序,由MySQL数据库支持,在端口8080上运行。我需要以高可用性、高冗余运行它,包括需要处理大量写入和读取的MySQL db


我决定使用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