Запустите загрузочное приложение Spring с поддержкой кластера MySQL и поддержкой HTTPS на AWS (EKS) - PullRequest
0 голосов
/ 20 февраля 2019

Я просматривал пошаговое руководство по запуску моего весеннего загрузочного приложения с поддержкой mysql с помощью AWS EKS (служба Elastic Container для Kubernetes) с использованием существующего подстановочного сертификата SSL и не смог найти полныйрешение.

Это стандартное автономное загрузочное приложение Spring, поддерживаемое базой данных MySQL, работающее на порту 8080. Мне нужно запускать его с высокой доступностью и высокой избыточностью, включая базу данных MySQL, которая должна обрабатывать большое количество записей какхорошо, как читает.

Я решил использовать кластер, размещенный на EKS, сохранив собственный образ Docker в частном репозитории Docker собственного ECR AWS, идущем против кластера MySQL, размещенного на EKS.И с помощью AWS выдан сертификат SSL для связи по HTTPS.Ниже мое решение, но мне будет очень любопытно посмотреть, как это можно сделать по-другому

1 Ответ

0 голосов
/ 20 февраля 2019

Это пошаговое руководство.Пожалуйста, не продолжайте, пока не завершите предыдущий шаг.

СОЗДАНИЕ EKS CLUSTER

Следуйте стандартному руководству для создания кластера EKS.Не выполняйте шаг 4. Когда вы закончите, у вас должен быть работающий кластер EKS, и вы должны иметь возможность использовать утилиту kubectl для связи с кластером.При выполнении из командной строки вы должны увидеть рабочие узлы и другие элементы кластера, используя команду kubectl get all --all-namespaces

INSTALL MYSQL CLUSTER

Я использовал helm для установки MySQLкластеризация следующих шагов из этого урока .Вот шаги

Установка руля

Поскольку я использую Macbook Pro с homebrew, я использовал brew install kubernetes-helm команду

Развертывание кластера MySQL

Обратите внимание, что в кластер MySQL и кластер Kubernetes (EKS) слово «кластер» означает две разные вещи.По сути, вы устанавливаете кластер в кластер, как русская кукла Матрешка, поэтому ваш кластер MySQL работает на узлах кластера EKS.

Я использовал 2-ую часть этого урока (игнорируйте часть с копиями) подготовить диаграмму 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_PASSWORD.

Создатьфайл с именем 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_PASSWORD?Оказывается, это пароль в кодировке base64, который вы планируете использовать с вашим корневым пользователем MySQL.Скажем, вы хотите root/foobar (пожалуйста, не используйте foobar).Самый простой способ кодирования пароля - использовать один из веб-сайтов, например https://www.base64encode.org/, который кодирует foobar в Zm9vYmFy

Когда все будет готово, выполните kubectl apply -f example-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.Введите в этой команде: kubectl port-forward services/my-cluster-mysql 8806:3306.Теперь вы можете получить доступ к вашей базе данных с 127.0.0.1:8806, используя пользователя root и незашифрованный пароль (foobar).Введите это в отдельную командную строку: mysql -u root -h 127.0.0.1 -P 8806 -p.При этом вы также можете использовать MySQL Workbench для управления вашей базой данных, просто не забудьте запустить port-forward.И, конечно, вы можете изменить 8806 на другой порт по вашему выбору

УПАКОВКА ВАШЕГО ПРИЛОЖЕНИЯ В КАЧЕСТВЕ ИЗОБРАЖЕНИЯ DOCKER И DEPLOY

Чтобы развернуть загрузочное приложение Spring в кластере EKS, вынужно упаковать его в образ Docker и развернуть в репозитории Docker.Давайте начнем с изображения Docker.На этом есть множество учебных пособий, подобных этому , но шаги очень просты:

Поместите свой сгенерированный автономный файл 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 и перейдите к разделу ECR .Меня смущает, что, очевидно, вам нужно иметь один репозиторий для каждого изображения, но когда вы нажимаете кнопку «Создать репозиторий», введите название вашего изображения (например, myapp) в текстовое поле.Теперь вам нужно скопировать некрасивый URL для вашего изображения и вернуться в командную строку

Отметить и нажать на изображение.Я использую поддельный URL в качестве примера: 901237695701.dkr.ecr.us-west-2.amazonaws.com вам нужно скопировать свой собственный с предыдущего шага

$ 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

Теперь вам нужно создать развертывание Kubernetes для образа Docker вашего приложения.Создайте файл 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: {}

Обратите внимание, как я использую полный URL-адрес для параметра image.Я также использую частный CLUSTER-IP кластера mysql, который вы можете получить с помощью команды kubectl get svc my-cluster-mysql.Это будет отличаться для вашего приложения, включая любые имена env, но вы должны как-то предоставить эту информацию своему приложению.Затем в вашем приложении вы можете установить что-то вроде этого в файле application.properties:

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}

После сохранения myapp-deployment.yaml вам нужно запустить эту команду

kubectl apply -f myapp-deployment.yaml

Который развернет ваше приложение в кластере EKS.Это создаст 2 модуля в кластере, которые вы можете увидеть с помощью команды kubectl get pods

. Вместо того, чтобы пытаться получить прямой доступ к одному из модулей, мы можем создать службу, расположенную перед модулями приложений.Создайте myapp-service.yaml с этим содержанием:

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  ports:
  - port: 443
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: myapp
  type: LoadBalancer

Вот где происходит волшебство!Просто установив порт на 443 и набрав LoadBalancer, система создаст классический балансировщик нагрузки для вашего приложения.

Кстати, если вам не нужно запускать приложение через HTTPS, вы можете установить порт на80, и у вас все получится!

После запуска kubectl apply -f myapp-service.yaml служба в кластере будет создана, и если вы перейдете в раздел «Балансировщики нагрузки» в разделе «EC2» консоли AWS, вы увидите, чтоновый балансировщик создан для вас.Вы также можете запустить команду kubectl get svc myapp-service, которая выдаст вам значение EXTERNAL-IP, например, bl3a3e072346011e98cac0a1468f945b-8158249.us-west-2.elb.amazonaws.com.Скопируйте это, потому что нам нужно использовать его дальше.

Стоит отметить, что если вы используете порт 80, то просто вставив этот URL в браузер, вы увидите приложение

ДоступВаше приложение по HTTPS

В следующем разделе предполагается, что у вас есть сертификат SSL, выданный AWS.Если вы этого не сделаете, перейдите в консоль AWS «Диспетчер сертификатов» и создайте подстановочный сертификат для своего домена

Прежде чем ваш балансировщик нагрузки сможет работать, вам нужно получить доступ к AWS console -> EC2 -> Load Balancers -> My new balancer -> Listeners и нажать ссылку «Изменить» в SSL Certificate столбец.Затем во всплывающем окне выберите выданный AWS SSL-сертификат и сохраните.

Перейдите в раздел Route-53 консоли AWS и выберите зону размещения для своего домена, скажем, myapp.com..Затем нажмите «Создать набор записей» и создайте запись CNAME - Canonical name с Name, установленным на любой псевдоним, который вы хотите, скажем, cluster.myapp.com и Value, установленным для ВНЕШНЕГО IP-адреса сверху.После того, как вы «Сохранить набор записей», перейдите в браузер и введите https://cluster.myapp.com. Вы должны увидеть, что ваше приложение работает

...