Запуск приложения в Google Cloud Platform при помощи Kubernetes

Posted by Pavel on Monday, January 27, 2020

Вступление

Всем привет!)

Сегодня я хотел показать вам пример того, как вы можете настроить и запустить ваше приложение (в моем примере простой вебсайт) в Google Cloud Platform. Я покажу как настроить проект, сконфигурировать билд и деплой правильно.

Здесь вы увидите пошаговую инструкцию с скриншотами и подробной информацией. Если вы новичок в Google Cloud Platform или Kubernetes, то это то, что вам нужно)

Я хочу показать, как в целом вы можете использовать Google сервисы для разных вещей. В нашем проекте мы будем использовать следующие технологии:

  • Google Kubernetes Engine
  • Google Cloud Builder
  • Google Cloud Containers
  • GitHub

Мы будем использовать GitOps стиль разработки для деплоя и управления нашем кластеров и приложением. Это в целом диаграмма того, как это работает:

Diagram

Проще говоря оно работает так: вы мержите pull request в ваш сервис и он автоматически деплоится. И затем если вы поменяете конфигурацию вашего сервиса (к примеру измените порт или количество реплик) и смержите pull request с этими изменениями: они опять автоматически применятся на вашем кластере.

Создаем новый GCloud проект и инициализируем Kubernetes кластер

Итак создадим новый проект в Google Cloud Platform. Сначала нам нужно открыть Google Cloud Platform и создать новый проект там (сейчас вы можете получить 300$ на пробное использование Google Cloud бесплатно)

https://console.cloud.google.com/home/

newProject

Назовем его “test-project” или как вы хотите:

testProject

После этого в левом меню выбираем Kubernetes Engine и нажимаем Create cluster

createCluster

Затем вам нужно выбрать конфигурацию для вашего нового кластера, вам не нужно выбирать что-то особенное, стандартного кластера будет достаточно и вы можете выбрать зону кластера:

createStandardCluster

Вам нужны утилиты kubectl и gcloud чтобы управлять вашим кластером, если у вас их нет, то посмотрите как установить здесь:

После этого мы должны подключиться с нашего компьютера к кластеру (после того как он будет готов), нажмите кнопку подключиться:

connectToCluster

И затем скопируйте и вставьте команду в свой терминал

copypast

Ваш терминал:

terminalGcloud

Затем попробуй запустить эту команду и проверить, что все работает правильно:

kubectl cluster-info

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

cloud_builder_triggers

Затем вам нужно включить триггер API:

enable_cloud_builder

И теперь вы можете добавить наше репозиторий нашего приложения для автоматического билда:

  1. Нажмите Connect repository и выбере github как источник:

connect_repository

  1. Выберите наш simpleWebApp в списке

simpleWebAppConnect

  1. И теперь нажмите Create push trigger

  2. Теперь мы должны немного изменить конфигурацию, нажмите изменить триггер справа:

editTrigger

  1. Измените триггер чтобы он реагировал только на пуши в мастер, а именно добавьте master ветку для regexp

changeTriggerToMaster

Обновите имя докер образа с:

gcr.io/test-project-XXXXXX/github.com/YOURNAME/simplewebapp:$SHORT_SHA

на

gcr.io/test-project-XXXXXX/github.com/YOURNAME/simplewebapp:production-$SHORT_SHA

dockerTrigger

  1. Нажмите кнопку Save

  2. Теперь вы можете запустить триггер нажав Run trigger

runTrigger

И вы увидите в истории как проходит ваш билд:

buildInProgress

По итогу вы должны увидеть успешный билд и url образа, мы будем использовать затем этот url позже в конфигурации kubernetes

successBuild

Настройка 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

  1. Сначала запустите команды для установки всех утилит

helm repo add fluxcd https://charts.fluxcd.io

kubectl create ns fluxcd

kubectlOne

  1. Теперь важный этап мы должны добавить url вашего репозиторий как конфигурацию нашего кластера

Вы должны запустить эту команду:

helm upgrade -i flux fluxcd/flux --wait \
--namespace fluxcd \
--set git.url=git@github.com:YOURUSER/kubernetesconf

И не забудьте заменить YOURUSER на ваше имя в github

Результат запуска этой команды:

applyKubernetesConfiguration

  1. Теперь вы можете установить утилиту 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

Результат: helm-operator

  1. Теперь вы можете проверить при помощи команды kubectl -n fluxcd get pods что все поды созданы правильно

fluxPods

  1. Теперь вам нужно добавить права на запись в ваш репозиторий для flux, для этого вы должны добавить SSH ключ в github

Сначала запустите:

fluxctl identity --k8s-fwd-ns fluxcd

И скопируйте ключ из этой команды в github, откройте свой форкнутый репозиторий: https://github.com/YOURUSER/kubernetesconf

Выберите Setting -> Deploy keys -> Add new

addNewDeployKey

Вставьте ваш ключ и поставьте галочку Allow write access (!) и нажмите Add key

addNewDeployKeyFinal

  1. Теперь вы можете открыть google cloud console и выберите там Kubernetes cluster

  2. В меню Services & Ingress вы можете увидеть simplewebapp приложение:

ServicesIngress

  1. Если вы нажмете на IP address вы увидите “Hello world” текст:

HelloWorld

Процесс разработки

Теперь вы решили что вы хотите не только показывать текст “Hello world!” для пользователей, но и пожелать им хорошего дня. Для этого вы должны изменить эти строки в нашем golang приложении

func HelloServer(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "Hello world! Have a good day!")
}

После этого закомитьте и запушьте эти изменения в ветку master и наслаждайтесь магией. Новые изменения запустят автоматически билд:

have_a_good_day

И после того как билд будет завершен, кубернетес заметит что билд поменялся и начнет автоматический деплой вашего сервиса. И он запушить обратно к вам в репозиторий кубернетуса коммит с хэшем нового докер образа (это может занять около 5 минут)

Коммит от flux:

flux_commit

Новых хэш докер образа в коммите:

docker_image_hash

Если вы откроете url снова вы увидите новый текст там:

new_text

Вывод

По итогу наша система работает прекрасно, когда новые изменения были сделаны, докер образ был автоматически собран и затем кубернетес автоматически загрузил и задеплоил его используя flux на наш продакшен.

Этот метод работы ускоряет процесс разработки в разы и упрощает его. Все изменения автоматически появляются в продакшене в течение 5 минут без нажатия каких либо клавиш.


comments powered by Disqus