Как развернуть устойчивое приложение Go в DigitalOcean Kubernetes

_ Автор выбрал Girls Who Code, чтобы получить пожертвование в рамках программы Write for DOnations ._

Вступление

Docker - это инструмент containerization, используемый для предоставления приложениям файловой системы, содержащей все необходимое для работы, обеспечивая программное обеспечение будет иметь согласованную среду выполнения и будет вести себя одинаково независимо от того, где оно развернуто. Kubernetes - облачная платформа для автоматизации развертывания, масштабирования и управления контейнерными приложениями.

Используя Docker, вы можете развернуть приложение в любой системе, поддерживающей Docker, с уверенностью, что оно всегда будет работать так, как задумано. Тем временем Kubernetes позволяет вам развертывать ваше приложение на нескольких узлах в кластере. Кроме того, он выполняет ключевые задачи, такие как запуск новых контейнеров в случае сбоя любого из ваших контейнеров. Вместе эти инструменты упрощают процесс развертывания приложения, позволяя вам сосредоточиться на разработке.

В этом руководстве вы создадите пример приложения, написанного на Go, и запустите его локально на своей машине для разработки. Затем вы будете контейнеризировать приложение с помощью Docker, развернуть его в кластере Kubernetes и создать балансировщик нагрузки, который будет служить общедоступной точкой входа в ваше приложение.

Предпосылки

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

  • Сервер разработки или локальный компьютер, с которого вы будете развертывать приложение. Хотя инструкции в этом руководстве будут в основном работать для большинства операционных систем, в этом руководстве предполагается, что у вас есть доступ к системе Ubuntu 18.04, настроенной для пользователя без полномочий root с привилегиями sudo, как описано в нашем https://www.digitalocean.com / community / tutorials / initial-server-setup-with-ubuntu-18-04 Учебное пособие [Начальная настройка сервера для Ubuntu 18.04].

  • Инструмент командной строки + docker + установлен на вашем компьютере разработчика. Чтобы установить это, выполните * шаги 1 и 2 * нашего учебного руководства на How установить и использовать Docker в Ubuntu 18.04.

  • Инструмент командной строки + kubectl + установлен на вашем компьютере разработчика. Чтобы установить это, следуйте this руководству из официальной документации Kubernetes.

  • Бесплатная учетная запись на Docker Hub, в которую вы будете помещать свой образ Docker. Для этого посетите веб-сайт Docker Hub, нажмите кнопку «Начало работы» в правом верхнем углу страницы и следуйте инструкциям по регистрации.

  • Кубернетский кластер. Вы можете предоставить DigitalOcean Kubernetes cluster, следуя нашему Kubernetes Руководству по быстрому старту. Вы по-прежнему можете пройти это руководство, если подготовите кластер от другого облачного провайдера. Везде, где вы приобретаете свой кластер, обязательно настройте файл конфигурации и убедитесь, что вы можете подключиться к кластеру с вашего сервера разработки.

Шаг 1. Создание примера веб-приложения на Go

На этом этапе вы создадите пример приложения, написанного на Go. Как только вы создадите контейнер для этого приложения с помощью Docker, оно будет обслуживать + My Awesome Go App + в ответ на запросы на IP-адрес вашего сервера в порту + 3000 +.

Начните с обновления списков пакетов вашего сервера, если вы еще этого не сделали:

sudo apt update

Затем установите Go, запустив:

sudo apt install golang

Затем убедитесь, что вы находитесь в своем домашнем каталоге и создайте новый каталог, который будет содержать все файлы вашего проекта:

cd && mkdir go-app

Затем перейдите в этот новый каталог:

cd go-app/

Используйте + nano + или предпочитаемый вами текстовый редактор, чтобы создать файл с именем + main.go +, который будет содержать код для вашего приложения Go:

nano main.go

Первая строка в любом исходном файле Go - это всегда оператор + package +, который определяет, к какому пакету кода принадлежит файл. Для таких исполняемых файлов оператор + package должен указывать на пакет` + main`:

гоу-приложение / main.go

После этого добавьте оператор + import +, в котором вы можете перечислить все библиотеки, которые понадобятся приложению. Здесь включают + fmt +, который обрабатывает ввод и вывод форматированного текста, и + net / http +, который обеспечивает реализацию клиента и сервера HTTP:

гоу-приложение / main.go

package main

Затем определите функцию + homePage +, которая будет принимать два аргумента: + http.ResponseWriter + и указатель на + http.Request +. В Go интерфейс + ResponseWriter используется для создания ответа HTTP, а` + http.Request` - это объект, представляющий входящий запрос. Таким образом, этот блок читает входящие HTTP-запросы и затем создает ответ:

гоу-приложение / main.go

. . .

import (
 "fmt"
 "net/http"
)

После этого добавьте функцию + setupRoutes +, которая будет сопоставлять входящие запросы с назначенными им функциями-обработчиками HTTP. В теле этой функции + setupRoutes + добавьте отображение маршрута + / + в вашу недавно определенную функцию + homePage +. Это заставляет приложение печатать сообщение «+ My Awesome Go App +» даже для запросов к неизвестным конечным точкам:

гоу-приложение / main.go

. . .

func homePage(w http.ResponseWriter, r *http.Request) {
 fmt.Fprintf(w, "My Awesome Go App")
}

И наконец, добавьте следующую функцию + main +. Это выведет строку, указывающую, что ваше приложение запущено. Затем он вызовет функцию + setupRoutes + перед прослушиванием и обслуживанием приложения Go на порту + 3000 +.

гоу-приложение / main.go

. . .

func setupRoutes() {
 http.HandleFunc("/", homePage)
}

После добавления этих строк вот так будет выглядеть финальный файл:

гоу-приложение / main.go

package main

import (
 "fmt"
 "net/http"
)

func homePage(w http.ResponseWriter, r *http.Request) {
 fmt.Fprintf(w, "My Awesome Go App")
}

func setupRoutes() {
 http.HandleFunc("/", homePage)
}

func main() {
 fmt.Println("Go Web App Started on Port 3000")
 setupRoutes()
 http.ListenAndServe(":3000", nil)
}

Сохраните и закройте этот файл. Если вы создали этот файл с помощью + nano +, сделайте это, нажав + CTRL + X +, + Y +, затем + ENTER +.

Затем запустите приложение, используя следующую команду + go run +. Это скомпилирует код в вашем файле + main.go + и запустит его локально на вашей машине разработки:

go run main.go
OutputGo Web App Started on Port 3000

Этот вывод подтверждает, что приложение работает должным образом. Однако он будет работать бесконечно, поэтому закройте его, нажав + CTRL + C +.

В этом руководстве вы будете использовать этот пример приложения для экспериментов с Docker и Kubernetes. Для этого продолжайте чтение, чтобы узнать, как создать контейнер для вашего приложения с помощью Docker.

Шаг 2 - Докеризация вашего приложения Go

В своем текущем состоянии приложение Go, которое вы только что создали, работает только на вашем сервере разработки. На этом этапе вы сделаете это новое приложение переносимым, заключив его в контейнер с Docker. Это позволит ему работать на любой машине, которая поддерживает контейнеры Docker. Вы создадите образ Docker и отправите его в центральный общедоступный репозиторий на Docker Hub. Таким образом, ваш кластер Kubernetes может перенести образ обратно и развернуть его как контейнер внутри кластера.

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

Создайте новый файл с именем + Dockerfile +:

nano Dockerfile

В верхней части файла укажите базовое изображение, необходимое для приложения Go:

гоу-приложение / Dockerfile

Затем создайте каталог + app + внутри контейнера, в котором будут находиться исходные файлы приложения:

гоу-приложение / Dockerfile

FROM golang:1.12.0-alpine3.9

Ниже добавьте следующую строку, которая копирует все из каталога + root + в каталог + app +:

гоу-приложение / Dockerfile

FROM golang:1.12.0-alpine3.9
RUN mkdir /app

Затем добавьте следующую строку, которая изменит рабочий каталог на + app +, означая, что все следующие команды в этом Dockerfile будут выполняться из этого места:

гоу-приложение / Dockerfile

FROM golang:1.12.0-alpine3.9
RUN mkdir /app
ADD . /app

Добавьте строку, инструктирующую Docker о запуске команды + go build -o main +, которая компилирует двоичный исполняемый файл приложения Go:

гоу-приложение / Dockerfile

FROM golang:1.12.0-alpine3.9
RUN mkdir /app
ADD . /app
WORKDIR /app

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

гоу-приложение / Dockerfile

FROM golang:1.12.0-alpine3.9
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN go build -o main .

Сохраните и закройте файл после добавления этих строк.

Теперь, когда у вас есть этот + Dockerfile + в корне вашего проекта, вы можете создать образ Docker на его основе, используя следующую команду + docker build +. Эта команда включает флаг + -t +, который при передаче значения + go-web-app + назовет образ Docker + go-web-app + и tag.

Последний аргумент, который вы передадите, - это путь: +. +. Это указывает, что вы хотите построить образ Docker из содержимого текущего рабочего каталога. Также обязательно обновите ++ до вашего имени пользователя Docker Hub:

docker build -t /go-web-app .

Эта команда сборки прочитает все строки в вашем + Dockerfile +, выполнит их по порядку, а затем кеширует, что позволит будущим сборкам работать намного быстрее:

Output. . .
Successfully built
Successfully tagged go-web-app:latest

Как только эта команда закончит сборку, вы сможете увидеть свое изображение, когда запустите команду + docker images + следующим образом:

docker images
OutputREPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
/go-web-app   latest                      3 seconds ago       355MB

Затем используйте следующую команду create и запустите контейнер на основе только что созданного вами изображения. Эта команда включает флаг + -it +, который указывает, что контейнер будет работать в интерактивном режиме. Он также имеет флаг + -p +, который отображает порт, на котором запущено приложение Go на вашей машине разработки - порт + 3000 + -, на порт + 3000 + в вашем контейнере Docker:

docker run -it -p 3000:3000 /go-web-app
OutputGo Web App Started on Port 3000

Если на этом порту больше ничего не работает, вы сможете увидеть приложение в действии, открыв браузер и перейдя по следующему URL:

http://:3000

изображение: https: //assets.digitalocean.com/articles/resilient_go_kubernetes/resilient_screenshot_1.png [Ваше приложение Go в контейнере]

Убедившись, что приложение работает должным образом в вашем браузере, остановите его, нажав + CTRL + C + в вашем терминале.

При развертывании приложения в контейнере в кластере Kubernetes вам необходимо иметь возможность извлекать образ из централизованного расположения. Для этого вы можете перенести только что созданный образ в ваш репозиторий Docker Hub.

Выполните следующую команду, чтобы войти в Docker Hub с вашего терминала:

docker login

Это запросит у вас имя пользователя и пароль Docker Hub. После их правильного ввода вы увидите + Login Succeeded + в выводе команды.

После входа в систему переместите ваш новый образ в Docker Hub с помощью команды + docker push +, например так:

docker push /go-web-app

После успешного выполнения этой команды вы сможете открыть свою учетную запись Docker Hub и увидеть там свой образ Docker.

Теперь, когда вы перенесли свой образ в центральное место, вы готовы развернуть его в своем кластере Kubernetes. Однако сначала мы пройдем небольшой процесс, который сделает выполнение команд + kubectl + намного менее утомительным.

Шаг 3 - Улучшение юзабилити для + kubectl +

К этому моменту вы создали работающее приложение Go и контейнировали его с помощью Docker. Тем не менее, приложение все еще не является общедоступным. Чтобы решить эту проблему, вы развернете свой новый образ Docker в своем кластере Kubernetes, используя инструмент командной строки + kubectl +. Однако перед этим сделаем небольшое изменение в файле конфигурации Kubernetes, которое поможет сделать выполнение команд + kubectl + менее трудоемким.

По умолчанию, когда вы запускаете команды с помощью инструмента командной строки + kubectl +, вы должны указать путь к файлу конфигурации кластера, используя флаг + - kubeconfig +. Однако, если ваш файл конфигурации называется + config + и хранится в каталоге с именем + ~ / .kube +, + kubectl + будет знать, где искать файл конфигурации, и сможет найти его без ` + - kubeconfig + `флаг, указывающий на него.

Для этого, если вы еще этого не сделали, создайте новый каталог с именем + ~ / .kube +:

mkdir ~/.kube

Затем переместите файл конфигурации вашего кластера в этот каталог и переименуйте его + config + в процессе:

mv .yaml ~/.kube/config

В дальнейшем вам не нужно указывать расположение файла конфигурации вашего кластера при запуске + kubectl +, поскольку команда сможет найти его сейчас, когда он находится в расположении по умолчанию. Проверьте это поведение, выполнив следующую команду + get node +:

kubectl get nodes

Это отобразит все nodes, которые находятся в вашем кластере Kubernetes. В контексте Kubernetes, узел - это сервер или рабочий компьютер, на котором могут быть развернуты один или несколько модулей:

OutputNAME                                        STATUS    ROLES     AGE       VERSION
k8s-1-13-5-do-0-nyc1-1554148094743-1-7lfd   Ready     <none>    1m        v1.13.5
k8s-1-13-5-do-0-nyc1-1554148094743-1-7lfi   Ready     <none>    1m        v1.13.5
k8s-1-13-5-do-0-nyc1-1554148094743-1-7lfv   Ready     <none>    1m        v1.13.5

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

Шаг 4 - Создание развертывания

RESTful resources составляют все постоянные сущности в системе Kubernetes, и в этом контексте их обычно называют Kubernetes objects. Полезно рассматривать объекты Kubernetes как рабочие задания, которые вы отправляете в Kubernetes: вы перечисляете, какие ресурсы вам нужны и как они должны работать, а затем Kubernetes будет постоянно работать, чтобы убедиться, что они существуют в вашем кластере.

Один вид объекта Kubernetes, известный как deployment, представляет собой набор идентичных, неотличимых модулей. В Kubernetes pod представляет собой группу из одного или нескольких контейнеров, которые могут взаимодействовать через одну и ту же общую сеть и взаимодействовать с одним и тем же общим хранилищем. , Развертывание запускает более одной реплики родительского приложения за раз и автоматически заменяет любые экземпляры, которые дают сбой, гарантируя, что ваше приложение всегда доступно для обслуживания пользовательских запросов.

На этом шаге вы создадите файл описания объекта Kubernetes, также известный как manifest, для развертывания. Этот манифест будет содержать все сведения о конфигурации, необходимые для развертывания приложения Go в кластере.

Начните с создания манифеста развертывания в корневом каталоге вашего проекта: + go-app / +. Для небольших проектов, таких как этот, хранение их в корневом каталоге минимизирует сложность. Однако для более крупных проектов может оказаться полезным хранить ваши манифесты в отдельном подкаталоге, чтобы все было организовано.

Создайте новый файл с именем + deploy.yml +:

nano deployment.yml

Различные версии API Kubernetes содержат разные определения объектов, поэтому в верхней части этого файла вы должны определить «+ apiVersion », который вы используете для создания этого объекта. В этом руководстве вы будете использовать группировку ` apps / v1 `, так как она содержит множество основных определений объектов Kubernetes, которые вам понадобятся для создания развертывания. Добавьте поле ниже ` apiVersion `, описывающее ` kind ` объекта Kubernetes, который вы создаете. В этом случае вы создаете ` Deployment +`:

гоу-приложение / deployment.yml

Затем определите + metadata + для вашего развертывания. Поле + metadata + обязательно для каждого объекта Kubernetes, поскольку оно содержит такую ​​информацию, как уникальное + name + объекта. Это + name + полезно, поскольку оно позволяет вам отличать различные развертывания друг от друга и идентифицировать их, используя имена, которые могут быть восприняты человеком:

гоу-приложение / deployment.yml

---
apiVersion: apps/v1
kind: Deployment

Затем вы создадите блок + spec + вашего + deploy.yml +. Поле + spec + является обязательным для каждого объекта Kubernetes, но его точный формат отличается для каждого типа объекта. В случае развертывания он может содержать такую ​​информацию, как число replicas, которое вы хотите запустить. В Kubernetes реплика - это количество модулей, которые вы хотите запустить в своем кластере. Здесь установите число + реплик + в + 5 +:

гоу-приложение / deployment.yml

. . .
metadata:
   name: go-web-app

Затем создайте блок + selector +, вложенный в блок + spec +. Это послужит label selector для ваших стручков. Kubernetes использует селекторы меток, чтобы определить, как развертывание находит модули, которыми оно должно управлять.

Внутри этого блока + selector определите` + matchLabels` и добавьте метку + name. По сути, поле + matchLabels + сообщает Kubernetes, к каким модулям относится развертывание. В этом примере развертывание будет применяться к любым модулям с именем + go-web-app +:

гоу-приложение / deployment.yml

. . .
spec:
 replicas: 5

После этого добавьте блок + template +. Каждое развертывание создает набор модулей, используя метки, указанные в блоке + template +. Первое подполе в этом блоке - + metadata +, которое содержит + метки +, которые будут применены ко всем модулям в этом развертывании. Эти метки являются парами ключ / значение, которые используются как идентифицирующие атрибуты объектов Kubernetes. Когда вы определите свою службу позже, вы можете указать, что вы хотите, чтобы все модули с этой меткой + name + были сгруппированы под этой службой. Установите эту метку + name на` + go-web-app`:

гоу-приложение / deployment.yml

. . .
spec:
 replicas: 5
 selector:
   matchLabels:
     name: go-web-app

Вторая часть этого блока + template + является блоком + spec +. Это отличается от блока + spec +, который вы добавили ранее, поскольку он применяется только к модулям, созданным блоком + template +, а не ко всему развертыванию.

В этом блоке + spec + добавьте поле + Containers + и еще раз определите атрибут + name +. Это поле + name + определяет имя любых контейнеров, созданных этим конкретным развертыванием. Ниже определите + image +, который вы хотите развернуть и развернуть. Обязательно измените ++ на ваше собственное имя пользователя Docker Hub:

гоу-приложение / deployment.yml

. . .
 template:
   metadata:
     labels:
       name: go-web-app



       sammy

После этого добавьте поле + imagePullPolicy +, установленное в + IfNotPresent +, которое будет указывать на развертывание только для извлечения образа, если это еще не было сделано ранее. Затем, наконец, добавьте блок + ports +. Там определите + containerPort +, который должен соответствовать номеру порта, который слушает ваше приложение Go. В этом случае номер порта + 3000 +:

гоу-приложение / deployment.yml

. . .
   spec:
     containers:
     - name: application
       image: /go-web-app

Полная версия вашего + deploy.yml + будет выглядеть так:

гоу-приложение / deployment.yml

---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: go-web-app
spec:
 replicas: 5
 selector:
   matchLabels:
     name: go-web-app
 template:
   metadata:
     labels:
       name: go-web-app
   spec:
     containers:
     - name: application
       image: /go-web-app
       imagePullPolicy: IfNotPresent
       ports:
         - containerPort: 3000

Сохраните и закройте файл.

Затем примените новое развертывание с помощью следующей команды:

kubectl apply -f deployment.yml

На следующем шаге вы создадите объект Kubernetes другого типа, который будет управлять доступом к модулям, которые существуют в вашем новом развертывании. Эта служба создаст балансировщик нагрузки, который затем предоставит один IP-адрес, и запросы на этот IP-адрес будут распределены по репликам в вашем развертывании. Эта служба также будет обрабатывать правила переадресации портов, чтобы вы могли получить доступ к своему приложению через HTTP.

Шаг 5 - Создание сервиса

Теперь, когда у вас есть успешное развертывание в Kubernetes, вы готовы представить свое приложение для внешнего мира. Для этого вам нужно определить другой тип объекта Kubernetes: service. Эта служба будет предоставлять один и тот же порт на всех узлах вашего кластера. Затем ваши узлы перенаправят любой входящий трафик с этого порта на модули, на которых работает ваше приложение.

Создайте новый файл с именем + service.yml +:

nano service.yml

Запустите этот файл, снова определив поля + apiVersion + и + kind + аналогично вашему файлу + deploy.yml +. На этот раз в поле + apiVersion + укажите + v1 +, API Kubernetes, обычно используемый для сервисов:

гоу-приложение / service.yml

Затем добавьте имя вашей службы в блок + metadata +, как вы это делали в + deploy.yml +. Это может быть что угодно, но для ясности мы назовем это + go-web-service +:

гоу-приложение / service.yml

---
apiVersion: v1
kind: Service

Затем создайте блок + spec +. Этот блок + spec + будет отличаться от блока, включенного в ваше развертывание, и он будет содержать + type + этой службы, а также конфигурацию переадресации портов и + selector +.

Добавьте поле, определяющее этот сервис + type, и установите его в` + Load Balancer`. Это автоматически обеспечит балансировщик нагрузки, который будет служить основной точкой входа в ваше приложение.

гоу-приложение / service.yml

---
apiVersion: v1
kind: Service
metadata:
 name: go-web-service

Затем добавьте блок + ports +, где вы определите, как вы хотите, чтобы ваши приложения были доступны. Вложенные в этот блок, добавьте следующие поля:

  • + name +, указывая на + http

  • + port +, указывая на порт + 80 +

  • + targetPort +, указывающий на порт + 3000 +

Это будет принимать входящие HTTP-запросы на порт + 80 + и перенаправлять их на + targetPort + из + 3000 +. Этот + targetPort + - это тот же порт, на котором запущено ваше приложение Go:

гоу-приложение / service.yml

---
apiVersion: v1
kind: Service
metadata:
 name: go-web-service
spec:
 type: LoadBalancer

Наконец, добавьте блок + selector, как вы это делали в файле` + deploy.yaml`. Этот блок + selector важен, поскольку он отображает все развернутые модули с именем` + go-web-app` на этот сервис:

гоу-приложение / service.yml

---
apiVersion: v1
kind: Service
metadata:
 name: go-web-service
spec:
 type: LoadBalancer
 ports:
 - name: http
   port: 80
   targetPort: 3000

После добавления этих строк сохраните и закройте файл. После этого примените этот сервис к вашему кластеру Kubernetes, еще раз используя команду + kubectl apply + следующим образом:

kubectl apply -f service.yml

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

Для просмотра приложения вам понадобится новый IP-адрес балансировщика нагрузки. Найдите его, выполнив следующую команду:

kubectl get services
OutputNAME             TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)        AGE
go-web-service   LoadBalancer   10.245.107.189      80:30533/TCP   10m
kubernetes       ClusterIP      10.245.0.1       <none>            443/TCP        3h4m

У вас может быть запущено более одного сервиса, но найдите тот, который помечен как + go-web-service +. Найдите столбец + EXTERNAL-IP + и скопируйте IP-адрес, связанный с + go-web-service +. В этом примере вывода этот IP-адрес является ++. Затем вставьте IP-адрес в адресную строку браузера, чтобы просмотреть приложение, запущенное в вашем кластере Kubernetes.

Балансировщик нагрузки примет запрос на порт + 80 + и перенаправит его на один из модулей, работающих в вашем кластере.

изображение: https: //assets.digitalocean.com/articles/resilient_go_kubernetes/resilient_screenshot_2.png [Ваше рабочее приложение Go!]

Таким образом, вы создали сервис Kubernetes в сочетании с балансировщиком нагрузки, предоставляя вам единую стабильную точку входа в приложение.

Заключение

В этом руководстве вы создали приложение Go, поместили его в контейнер с помощью Docker, а затем развернули в кластере Kubernetes. Затем вы создали балансировщик нагрузки, который обеспечивает эластичную точку входа для этого приложения, гарантируя, что оно останется высокодоступным даже в случае сбоя одного из узлов в кластере. Вы можете использовать это руководство для развертывания своего собственного приложения Go в кластере Kubernetes или продолжить изучение других концепций Kubernetes и Docker с помощью примера приложения, созданного на шаге 1.

Продвигаясь вперед, вы можете map IP-адрес своего балансировщика нагрузки на доменное имя, которое вы контролируете, чтобы вы могли получить доступ к приложению через удобочитаемый веб-адрес, а не IP-адрес балансировщика нагрузки. Кроме того, следующие уроки Kubernetes могут быть вам интересны:

Наконец, если вы хотите узнать больше о Go, рекомендуем вам ознакомиться с нашей серией на How To Code in Идти.

Related