Вступление
Всем привет!)
Сегодня я хотел показать вам пример того, как вы можете настроить и запустить ваше приложение (в моем примере простой вебсайт) в Google Cloud Platform. Я покажу как настроить проект, сконфигурировать билд и деплой правильно.
Здесь вы увидите пошаговую инструкцию с скриншотами и подробной информацией. Если вы новичок в Google Cloud Platform или Kubernetes, то это то, что вам нужно)
Я хочу показать, как в целом вы можете использовать Google сервисы для разных вещей. В нашем проекте мы будем использовать следующие технологии:
- Google Kubernetes Engine
- Google Cloud Builder
- Google Cloud Containers
- GitHub
Мы будем использовать GitOps стиль разработки для деплоя и управления нашем кластеров и приложением. Это в целом диаграмма того, как это работает:
Проще говоря оно работает так: вы мержите pull request в ваш сервис и он автоматически деплоится. И затем если вы поменяете конфигурацию вашего сервиса (к примеру измените порт или количество реплик) и смержите pull request с этими изменениями: они опять автоматически применятся на вашем кластере.
Создаем новый GCloud проект и инициализируем Kubernetes кластер
Итак создадим новый проект в Google Cloud Platform. Сначала нам нужно открыть Google Cloud Platform и создать новый проект там (сейчас вы можете получить 300$ на пробное использование Google Cloud бесплатно)
https://console.cloud.google.com/home/
Назовем его “test-project” или как вы хотите:
После этого в левом меню выбираем Kubernetes Engine и нажимаем Create cluster
Затем вам нужно выбрать конфигурацию для вашего нового кластера, вам не нужно выбирать что-то особенное, стандартного кластера будет достаточно и вы можете выбрать зону кластера:
Вам нужны утилиты kubectl
и gcloud
чтобы управлять вашим кластером, если у вас их нет,
то посмотрите как установить здесь:
После этого мы должны подключиться с нашего компьютера к кластеру (после того как он будет готов), нажмите кнопку подключиться:
И затем скопируйте и вставьте команду в свой терминал
Ваш терминал:
Затем попробуй запустить эту команду и проверить, что все работает правильно:
kubectl cluster-info
Отлично!) Теперь мы присоединились к нашему кластеру
Подготовка Golang приложения для деплоя
Теперь нам нужно подготовить наше приложение. В моем примере мы будем использовать простое веб приложение.
Сначала вам нужно форкнуть этот проект, который мы затем будем запускать на нашем кластере:
http://github.com/pcherednichenko/simpleWebApp
Внутри этого проекта вы найдете простой main файл:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", HelloServer)
http.ListenAndServe(":80", nil)
}
func HelloServer(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello world!")
}
и Dockerfile для сборки нашего go приложения:
FROM golang:1.13 as builder
WORKDIR /go/src/github.com/pcherednichenko/simpleWebApp
ADD . .
ENV GO111MODULE=on
RUN CGO_ENABLED=0 GOOS=linux go build -o simpleWebApp
FROM alpine:3.10.2
RUN apk --no-cache add ca-certificates
COPY --from=builder /go/src/github.com/pcherednichenko/simpleWebApp/simpleWebApp simpleWebApp
CMD ["./simpleWebApp"]
Настройка автоматический сборки нашего приложения в Cloud Build
Kubernetes деплоит docker образы вашего приложения и автоматически проверяет каждые 5 минут появился ли новый образ в репозитории. Поэтому первое, что нам нужно сделать, это настроить автоматический билд нашего приложения для master ветки, которое затем будет проверять кубернетус
Сначала слева выберите Cloud Builder
-> Triggers
Затем вам нужно включить триггер API:
И теперь вы можете добавить наше репозиторий нашего приложения для автоматического билда:
- Нажмите
Connect repository
и выбере github как источник:
- Выберите наш
simpleWebApp
в списке
-
И теперь нажмите
Create push trigger
-
Теперь мы должны немного изменить конфигурацию, нажмите изменить триггер справа:
- Измените триггер чтобы он реагировал только на пуши в мастер, а именно добавьте master ветку для regexp
Обновите имя докер образа с:
gcr.io/test-project-XXXXXX/github.com/YOURNAME/simplewebapp:$SHORT_SHA
на
gcr.io/test-project-XXXXXX/github.com/YOURNAME/simplewebapp:production-$SHORT_SHA
-
Нажмите кнопку
Save
-
Теперь вы можете запустить триггер нажав
Run trigger
И вы увидите в истории как проходит ваш билд:
По итогу вы должны увидеть успешный билд и url образа, мы будем использовать затем этот url позже в конфигурации kubernetes
Настройка kubernetes кластера
Теперь нам нужно создать новую kubernetes конфигурацию с параметрами нашего приложения
Сначала вам нужно сделать форк базовой конфигурации нашего нового кластера:
https://github.com/pcherednichenko/kubernetesconf
Это базовых пример конфигурации, и мы должны обновить ее, чтобы использовать с нашим проектом.
В папке kubernetesconf/releases/simplewebapp.yaml
вы найдете конфигурацию нашего приложения.
Вам нужно обновить строку 13 с:
git: git@github.com/pcherednichenko/kubernetesconf
path: charts/simplewebapp
ref: master
на ваш репозиторий:
git@github.com/YOURNAME/kubernetesconf
кроме того измените строки 18-19:
image:
repository: gcr.io/test-project-266218/github.com/pcherednichenko/simplewebapp
tag: "production-8262df2"
replicaCount: 1
Мой докер образ имел адрес, поэтому я указал его в строках выше:
gcr.io/test-project-266218/github.com/pcherednichenko/simplewebapp:production-8262df2
вам нужно указать ваш проект:
image:
repository: gcr.io/YOURPROJECT/github.com/YOURREPO/simplewebapp
tag: "production-YOUR_IMAGE_SHORT_SHA"
replicaCount: 1
Обновите файлы используя ваши данные и запушьте изменения в мастер форкнутого репозитория
Применение конфигурации на Google Cloud Kubernetes Cluster
Пришло время поместить всю эту конфигурацию в наш Google Kubernetes кластер и запустить наш сайт Сначала нам нужно добавить flux и helm для нашего кластера Flux и helm будут обновлять конфигурацию и проверять наличие новых образов в репозитории. Они выполняют роль менеджеров нашего кластера.
В целом дальше я буду просто следовать этой инструкции по установке, указывая свои параметры
https://github.com/fluxcd/helm-operator-get-started
- Сначала запустите команды для установки всех утилит
helm repo add fluxcd https://charts.fluxcd.io
kubectl create ns fluxcd
- Теперь важный этап мы должны добавить url вашего репозиторий как конфигурацию нашего кластера
Вы должны запустить эту команду:
helm upgrade -i flux fluxcd/flux --wait \
--namespace fluxcd \
--set git.url=git@github.com:YOURUSER/kubernetesconf
И не забудьте заменить YOURUSER на ваше имя в github
Результат запуска этой команды:
- Теперь вы можете установить утилиту helm использую эти команды:
kubectl apply -f https://raw.githubusercontent.com/fluxcd/helm-operator/master/deploy/flux-helm-release-crd.yaml
и
helm upgrade -i helm-operator fluxcd/helm-operator --wait \
--namespace fluxcd \
--set git.ssh.secretName=flux-git-deploy \
--set helm.versions=v3
Результат:
- Теперь вы можете проверить при помощи команды
kubectl -n fluxcd get pods
что все поды созданы правильно
- Теперь вам нужно добавить права на запись в ваш репозиторий для flux, для этого вы должны добавить SSH ключ в github
Сначала запустите:
fluxctl identity --k8s-fwd-ns fluxcd
И скопируйте ключ из этой команды в github, откройте свой форкнутый репозиторий: https://github.com/YOURUSER/kubernetesconf
Выберите Setting
-> Deploy keys
-> Add new
Вставьте ваш ключ и поставьте галочку Allow write access
(!) и нажмите Add key
-
Теперь вы можете открыть google cloud console и выберите там Kubernetes cluster
-
В меню
Services & Ingress
вы можете увидеть simplewebapp приложение:
- Если вы нажмете на IP address вы увидите “Hello world” текст:
Процесс разработки
Теперь вы решили что вы хотите не только показывать текст “Hello world!” для пользователей, но и пожелать им хорошего дня. Для этого вы должны изменить эти строки в нашем golang приложении
func HelloServer(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello world! Have a good day!")
}
После этого закомитьте и запушьте эти изменения в ветку master и наслаждайтесь магией. Новые изменения запустят автоматически билд:
И после того как билд будет завершен, кубернетес заметит что билд поменялся и начнет автоматический деплой вашего сервиса. И он запушить обратно к вам в репозиторий кубернетуса коммит с хэшем нового докер образа (это может занять около 5 минут)
Коммит от flux:
Новых хэш докер образа в коммите:
Если вы откроете url снова вы увидите новый текст там:
Вывод
По итогу наша система работает прекрасно, когда новые изменения были сделаны, докер образ был автоматически собран и затем кубернетес автоматически загрузил и задеплоил его используя flux на наш продакшен.
Этот метод работы ускоряет процесс разработки в разы и упрощает его. Все изменения автоматически появляются в продакшене в течение 5 минут без нажатия каких либо клавиш.
comments powered by Disqus