У цьому посібнику показано, як упакувати веб-програму в образ контейнера Docker і запустити цей образ контейнера в кластері Google Kubernetes Engine (GKE). Потім ви розгортаєте веб-програму як набір реплік із збалансованим навантаженням, які можна масштабувати відповідно до потреб ваших користувачів ## Цілі - Упакуйте приклад веб-програми в образ Docker - Завантажте образ Docker до реєстру артефактів - Створіть кластер GKE - Розгорніть зразок програми в кластері - Керуйте автомасштабуванням для розгортання - Опублікуйте зразок програми в Інтернеті - Розгорніть нову версію зразка програми ## Витрати У цьому посібнику використовуються такі платні компоненти Google Cloud: Щоб створити оцінку вартості на основі прогнозованого використання, скористайтеся калькулятором ціноутворення Коли ви завершите цей підручник, ви зможете уникнути подальшого виставлення рахунків, видаливши створені вами ресурси. Для отримання додаткової інформації див. Очищення ## Перш ніж почати Виконайте такі дії, щоб увімкнути API Kubernetes Engine: - Увійдіть у свій обліковий запис Google Cloud. Якщо ви новачок у Google Cloud, створіть обліковий запис, щоб оцінити ефективність наших продуктів у реальних умовах. Нові клієнти також отримують 300 доларів США у вигляді безкоштовних кредитів для запуску, тестування та розгортання робочих навантажень - У консолі Google Cloud на сторінці вибору проекту виберіть або створіть проект Google Cloud - Переконайтеся, що виставлення рахунків увімкнено для вашого хмарного проекту. Дізнайтеся, як перевірити, чи ввімкнено виставлення рахунків у проекті - Увімкніть API реєстру артефактів і Google Kubernetes Engine - У консолі Google Cloud на сторінці вибору проекту виберіть або створіть проект Google Cloud - Переконайтеся, що виставлення рахунків увімкнено для вашого хмарного проекту. Дізнайтеся, як перевірити, чи ввімкнено виставлення рахунків у проекті - Увімкніть API реєстру артефактів і Google Kubernetes Engine Варіант A: Використовуйте Cloud Shell Ви можете стежити за цим підручником за допомогою Cloud Shell, яка постачається попередньо встановлений з gcloud, докер, і використовувані інструменти командного рядка kubectl у цьому посібнику. Якщо ви використовуєте Cloud Shell, вам не потрібно їх встановлювати інструменти командного рядка на робочій станції Щоб використовувати Cloud Shell: - Перейдіть до консолі Google Cloud Натисніть на Активуйте Cloud Shell у верхній частині вікна консолі Google Cloud Сеанс Cloud Shell відкривається в новому фреймі внизу консолі Google Cloud і відображає підказку командного рядка Варіант Б: використовуйте засоби командного рядка локально Якщо ви віддаєте перевагу цьому підручнику на своїй робочій станції, виконайте ці кроки, щоб інсталювати необхідні інструменти Установіть Google Cloud CLI За допомогою gcloud CLI встановіть інструмент командного рядка Kubernetes kubectlis використовується для зв’язку з Kubernetes, яка є системою оркестровки кластерів GKE: компоненти gcloud інсталювати kubectl Встановіть Docker Community Edition (CE) на свою робочу станцію. Ви використовуєте це для створення образу контейнера для програми Установіть інструмент керування джерелами Git, щоб отримати приклад програми з GitHub ## Створіть репозиторій У цьому посібнику ви збережете зображення в реєстрі артефактів і розгорнете його з реєстру. Реєстр артефактів — рекомендований реєстр контейнерів Google Cloud. Для цього швидкого старту ви створите сховище під назвою привіт-репо Встановіть Змінна PROJECT_IDenvironment до вашого ідентифікатора проекту Google Cloud ( ). Ви використовуватимете цю змінну середовища під час створення образу контейнера та надсилання його до свого сховища PROJECT_ID експорт PROJECT_ID= PROJECT_ID Підтвердьте, що Змінна PROJECT_IDenvironment має правильне значення: echo $PROJECT_ID Установіть свій ідентифікатор проекту для Google Cloud CLI: gcloud config set project $PROJECT_ID Вихід: Оновлена ​​властивість [core/project] Створити hello-reporepository за допомогою такої команди: репозиторії артефактів gcloud створюють hello-repo \ --repository-format=docker \ --location= РЕГІОН\ --description="сховище Docker"Замінити з регіоном для сховища, наприклад РЕГІОН нас-захід1. Щоб переглянути список доступних місць, виконайте команду: список розташувань артефактів gcloud ## Створення образу контейнера У цьому підручнику ви розгортаєте зразок мережі програма викликана hello-app, написаний веб-сервер у Go, який відповідає повідомленням на всі запити Привіт Світ! на порт 8080 GKE приймає зображення Docker як формат розгортання програми Перед розгортанням hello-app до GKE, ви повинні запакувати в вихідний код програми hello-app як зображення Docker Щоб створити образ Docker, вам потрібен вихідний код і файл Docker. Файл Docker містить інструкції щодо створення образу Завантажити hello-appsource code та Dockerfile, виконавши такі команди: git clone httpsgithub.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/hello-app Створіть і позначте зображення Docker для hello-app: docker build -t REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 Ця команда наказує Docker створити образ за допомогою Dockerfile у поточному каталозі, збережіть його у своєму локальному середовищі та позначте його назвою, наприклад us-west1-docker.pkg.dev/my-project/hello-repo/hello-app:v1. Зображення надсилається до реєстру артефактів у наступному розділі - The PROJECT_IDvariable пов’язує зображення контейнера з hello-reporepository у вашому проекті Google Cloud - The us-west1-docker.pkg.devprefix посилається на реєстр артефактів, регіональний хост для вашого сховища - The Запустіть Команда docker images для перевірки успішності збірки: зображення докерів Вихід: РЕПОЗИТОРІЙ ТЕГ ЗОБРАЖЕННЯ ID СТВОРЕНО РОЗМІР us-west1-docker.pkg.dev/my-project/hello-repo/hello-app v1 25cfadb1bf28 10 секунд тому 54 MB ## Запуск вашого контейнера локально (необов'язково) Перевірте свій образ контейнера за допомогою локальної системи Docker: запуск докера --rm -p 8080:8080 REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 Якщо ви використовуєте Cloud Shell, натисніть Кнопка веб-перегляду а потім виберіть номер порту 8080. GKE відкриває URL-адресу попереднього перегляду на своїй проксі-службі в новому вікні браузера В іншому випадку відкрийте нове вікно терміналу (або вкладку Cloud Shell) і виконайте наведену нижче команду, щоб переконатися, що контейнер працює та відповідає на запити "Hello, World"curl httplocalhost:8080 Коли ви побачите успішну відповідь, ви можете опустити контейнер, натиснувши Ctrl+C у вкладці, де знаходиться виконується команда запуску докера ## Надсилання образу Docker до реєстру артефактів Ви повинні завантажити образ контейнера до реєстру, щоб ваш кластер GKE міг завантажити та запустити образ контейнера. У цьому посібнику ви збережете свій контейнер у реєстрі артефактів Налаштуйте інструмент командного рядка Docker для автентифікації в реєстрі артефактів: gcloud auth configure-docker REGION-docker.pkg.dev Надішліть щойно створений образ Docker у сховище: докер натискання REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 ## Створення кластера GKE Тепер, коли образ Docker зберігається в реєстрі артефактів, створіть GKE кластер бігти привіт-додаток. Кластер GKE складається з пулу екземплярів Compute Engine VM запуск Kubernetes, кластерної оркестровки з відкритим кодом система, яка живить GKE Cloud Shell Укажіть зону або регіон Compute Engine. Залежно від режиму роботи, який ви вибрали для використання в GKE, укажіть зону або регіон за замовчуванням. Якщо ви використовуєте стандартний режим, ваш кластер є зональним (для цього підручника), тому встановіть обчислювальну зону за умовчанням. Якщо ви використовуєте режим автопілота, ваш кластер є регіональним, тому встановіть обчислювальний регіон за умовчанням. Виберіть зону чи регіон, які є найближчими до створеного вами сховища реєстру артефактів Стандартний кластер, наприклад us-west1-a: конфігурація gcloud встановлює обчислення/зону COMPUTE_ZONE Autopilotcluster, наприклад us-west1: gcloud config set compute/region COMPUTE_REGION - Створіть кластер з назвою привіт-кластер: Стандартний кластер: кластери контейнерів gcloud створюють hello-cluster Кластер автопілота: gcloud контейнерні кластери create-auto hello-cluster Для створення та перевірки працездатності кластера GKE потрібно кілька хвилин - Після завершення команди виконайте таку команду, щоб побачити три вузли кластера: kubectl отримати вузли Вихід: ІМ'Я СТАТУС РОЛЬ ВІК ВЕРСІЯ gke-hello-cluster-default-pool-229c0700-cbtd Готово 92s v1.18.12-gke.1210 gke-hello-cluster-default-pool-229c0700-fc5j Ready 91s v1.18.12-gke.1210 gke-hello-cluster-default-pool-229c0700-n9l7 Ready 92s v1.18.12-gke.1210 Console Go to the Google Kubernetes Enginepage in the Google Cloud console Go to Google Kubernetes Engine Click Create Choose Standard or Autopilot mode and click Configure In the Namefield, enter the name hello-cluster Select a zone or region: Standardcluster: Under Location type, select Zonaland then select a Compute Engine zone from the Zonedrop-down list, such as us-west1-a Autopilotcluster: Select a Compute Engine region from the Regiondrop-down list, such as us-west1 - Click Create. This creates a GKE cluster Wait for the cluster to be created. When the cluster is ready, a green check mark appears next to the cluster name ## Deploying the sample app to GKE You are now ready to deploy the Docker image you built to your GKE cluster Kubernetes represents applications as Pods, which are scalable units holding one or more containers. The Pod is the smallest deployable unit in Kubernetes. Usually, you deploy Pods as a set of replicas that can be scaled and distributed together across your cluster. One way to deploy a set of replicas is through a Kubernetes Deployment In this section, you create a Kubernetes Deployment to run hello-app on your cluster. This Deployment has replicas (Pods). One Deployment Pod contains only one container: the hello-app Docker image You also create a HorizontalPodAutoscaler resource that scales the number of Pods from 3 to a number between 1 and 5, based on CPU load Cloud Shell Ensure that you are connected to your GKE cluster gcloud container clusters get-credentials hello-cluster --zone COMPUTE_ZONE Create a Kubernetes Deployment for your hello-appDocker image kubectl create deployment hello-app --image= REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 Set the baseline number of Deployment replicas to 3 kubectl scale deployment hello-app --replicas=3 Create a HorizontalPodAutoscalerresource for your Deployment kubectl autoscale deployment hello-app --cpu-percent=80 --min=1 --max=5 To see the Pods created, run the following command: kubectl get pods Output: NAME READY STATUS RESTARTS AGE hello-app-784d7569bc-hgmpx 1/1 Running 0 10s hello-app-784d7569bc-jfkz5 1/1 Running 0 10s hello-app-784d7569bc-mnrrl 1/1 Running 0 15s Console Go to the Workloadspage in the Google Cloud console Click Deploy In the Specify containersection, select Existing container image In the Image pathfield, click Select In the Select container imagepane, select the hello-appimage you pushed to Artifact Registry and click Select In the Containersection, click Done, then click Continue In the Configurationsection, under Labels, enter appfor Keyand hello-appfor Value Under Configuration YAML, click View YAML. This opens a YAML configuration file representing the two Kubernetes API resources about to be deployed into your cluster: one Deployment, and one HorizontalPodAutoscalerfor that Deployment Click Close, then click Deploy When the Deployment Pods are ready, the Deployment detailspage opens Under Managed pods, note the three running Pods for the hello-appDeployment ## Exposing the sample app to the internet While Pods do have individually-assigned IP addresses, those IPs can only be reached from inside your cluster. Also, GKE Pods are designed to be ephemeral, starting or stopping based on scaling needs. And when a Pod crashes due to an error, GKE automatically redeploys that Pod, assigning a new Pod IP address each time What this means is that for any Deployment, the set of IP addresses corresponding to the active set of Pods is dynamic. We need a way to 1) group Pods together into one static hostname, and 2) expose a group of Pods outside the cluster, to the internet Kubernetes Services solve for both of these problems Services group Pods into one static IP address, reachable from any Pod inside the cluster GKE also assigns a DNS hostname to that static IP. For example, hello-app.default.svc.cluster.local The default Service type in GKE is called ClusterIP, where the Service gets an IP address reachable only from inside the cluster To expose a Kubernetes Service outside the cluster, create a Service of type LoadBalancer This type of Service spawns an External Load Balancer IP for a set of Pods, reachable through the internet In this section, you expose the hello-app Deployment to the internet using a Service of type LoadBalancer Cloud Shell Use the kubectl exposecommand to generate a Kubernetes Service for the hello-appdeployment: kubectl expose deployment hello-app --name=hello-app-service --type=LoadBalancer --port 80 --target-port 8080 Here, the --portflag specifies the port number configured on the Load Balancer, and the --target-portflag specifies the port number that the hello-appcontainer is listening on Run the following command to get the Service details for hello-app-service: kubectl get service Output: NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-app-service 10.3.251.122 203.0.113.0 80:30877/TCP 10s Copy the EXTERNAL_IPaddress to the clipboard (for instance: 203.0.113.0) Console Go to the Workloadspage in the Google Cloud console Click hello-app From the Deployment details page, click Actions > Expose In the Exposedialog, set the Target portto 8080. This is the port the hello-appcontainer listens on From the Service typedrop-down list, select Load balancer Click Exposeto create a Kubernetes Service for hello-app When the Load Balancer is ready, the Service detailspage opens Scroll down to the External endpointsfield, and copy the IP address Now that the hello-app Pods are exposed to the internet through a Kubernetes Service, you can open a new browser tab, and navigate to the Service IP address you copied to the clipboard. A Hello, World! message appears, along with a Hostname field. The Hostname corresponds to one of the three hello-app Pods serving your HTTP request to your browser ## Deploying a new version of the sample app In this section, you upgrade hello-app to a new version by building and deploying a new Docker image to your GKE cluster GKE's rolling update feature lets you update your Deployments without downtime. During a rolling update, your GKE cluster incrementally replaces the existing hello-app Pods with Pods containing the Docker image for the new version During the update, your load balancer service routes traffic only into available Pods Return to Cloud Shell, where you have cloned the hello app source code and Dockerfile. Update the function hello()in the main.gofile to report the new version 2.0.0 Build and tag a new hello-appDocker image docker build -t REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 Push the image to Artifact Registry docker push REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 Now you're ready to update your hello-app Kubernetes Deployment to use a new Docker image Cloud Shell Apply a rolling update to the existing hello-appDeployment with an image update using the kubectl set imagecommand: kubectl set image deployment/hello-app hello-app= REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 Watch the running Pods running the v1image stop, and new Pods running the v2image start watch kubectl get pods Output: NAME READY STATUS RESTARTS AGE hello-app-89dc45f48-5bzqp 1/1 Running 0 2m42s hello-app-89dc45f48-scm66 1/1 Running 0 2m40s In a separate tab, navigate again to the hello-app-serviceExternal IP. You should now see the Versionset to 2.0.0 Console Go to the Workloadspage in the Google Cloud console Click hello-app On the Deployment detailspage, click Actions > Rolling update In the Rolling updatedialog, set the Image of hello-appfield to REGION-docker.pkg.dev/ PROJECT_ID/hello-repo/hello-app:v2 Click Update On the Deployment detailspage, inspect the Active Revisionssection. You should now see two Revisions, 1 and 2. Revision 1 corresponds to the initial Deployment you created earlier. Revision 2 is the rolling update you just started After a few moments, refresh the page. Under Managed pods, all of the replicas of hello-appnow correspond to Revision 2 In a separate tab, navigate again to the Service IP address you copied. The Versionshould be 2.0.0 ## Clean up To avoid incurring charges to your Google Cloud account for the resources used in this tutorial, either delete the project that contains the resources, or keep the project and delete the individual resources Delete the Service:This deallocates the Cloud Load Balancer created for your Service: kubectl delete service hello-app-service Delete the cluster:This deletes the resources that make up the cluster, such as the compute instances, disks, and network resources: gcloud container clusters delete hello-cluster --zone COMPUTE_ZONE Delete your container images:This deletes the Docker images you pushed to Artifact Registry gcloud artifacts docker images delete REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 \ --delete-tags --quiet gcloud artifacts docker images delete \ REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 \ --delete-tags --quiet ## What's next Learn about Pricing for GKE and use the Pricing Calculator to estimate costs Read the Load Balancers tutorial, which demonstrates advanced load balancing configurations for web applications Configure a static IP and domain name for your application Explore other Kubernetes Engine tutorials Explore reference architectures, diagrams, tutorials, and best practices about Google Cloud. Take a look at our Cloud Architecture Center ## Try it for yourself If you're new to Google Cloud, create an account to evaluate how GKE performs in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.Try GKE free