Это пошаговое руководство.Пожалуйста, не продолжайте, пока не завершите предыдущий шаг.
СОЗДАНИЕ 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. Вы должны увидеть, что ваше приложение работает