Деплой Go приложения на Kubernetes: базовое руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: почему Go и Kubernetes — идеальная пара

Go (Golang) и Kubernetes — два ключевых инструмента в современной разработке. Go, созданный в Google, — это компилируемый, статически типизированный язык, который идеально подходит для создания высокопроизводительных микросервисов. Kubernetes, в свою очередь, является стандартом де-факто для оркестрации контейнеров. Их объединение даёт мощную экосистему: вы пишете лёгкий, быстрый код на Go, упаковываете его в Docker-образ, а Kubernetes управляет его запуском, масштабированием и восстановлением.

В этом руководстве мы шаг за шагом развернём простое Go-приложение на Kubernetes. Вы узнаете, как написать Dockerfile, создать манифесты Deployment и Service, а также применить их в кластере. Статья рассчитана на разработчиков, которые уже знакомы с основами Go и имеют базовое представление о Docker.

Шаг 1: Создание и контейнеризация Go-приложения

Начнём с простого HTTP-сервера на Go. Создайте файл main.go:

package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
    }
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello from Go on Kubernetes!")
    })
    http.ListenAndServe(":"+port, nil)
}

Этот код слушает порт, заданный переменной окружения PORT (по умолчанию 8080), и возвращает простое сообщение.

Сборка Docker-образа

Теперь создадим Dockerfile для мультистадийной сборки — это уменьшит размер финального образа:

# Этап сборки
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /app/server .

# Финальный образ
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/server .
EXPOSE 8080
CMD ["./server"]

Соберите образ и отправьте его в реестр (например, Docker Hub):

docker build -t yourusername/go-k8s-app:v1 .
docker push yourusername/go-k8s-app:v1

Шаг 2: Манифест Deployment

Kubernetes использует YAML-манифесты для описания желаемого состояния кластера. Создайте файл deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-app-deployment
  labels:
    app: go-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: go-app
  template:
    metadata:
      labels:
        app: go-app
    spec:
      containers:
      - name: go-app
        image: yourusername/go-k8s-app:v1
        ports:
        - containerPort: 8080
        env:
        - name: PORT
          value: "8080"
        readinessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 20

Разбор ключевых полей:

  • replicas: 3 — Kubernetes будет поддерживать 3 работающих экземпляра (пода) приложения.
  • readinessProbe — проверяет, готов ли под принимать трафик (запросы на /).
  • livenessProbe — проверяет, жив ли под; если нет — Kubernetes перезапустит его.

Шаг 3: Манифест Service

Чтобы сделать приложение доступным внутри кластера или извне, нужен Service. Создайте service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: go-app-service
spec:
  selector:
    app: go-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer
  • selector — связывает сервис с подами, у которых есть метка app: go-app.
  • port: 80 — порт, на котором сервис слушает трафик.
  • targetPort: 8080 — перенаправляет трафик на порт 8080 контейнера.
  • type: LoadBalancer — создаёт внешний балансировщик (если ваш кластер поддерживает это, например в облаке).

Шаг 4: Деплой в кластер Kubernetes

Убедитесь, что у вас настроен доступ к кластеру (например, minikube или облачный кластер). Выполните команды:

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

Проверьте статус:

kubectl get pods
kubectl get services

Если вы используете Minikube, получите доступ к приложению через:

minikube service go-app-service

После этого в браузере откроется ваше приложение, и вы увидите сообщение "Hello from Go on Kubernetes!".

Масштабирование и обновление

Одно из главных преимуществ Kubernetes — простое масштабирование. Чтобы увеличить количество реплик, выполните:

kubectl scale deployment/go-app-deployment --replicas=5

Для обновления образа (например, до версии v2) измените тег в deployment.yaml и примените изменения снова — Kubernetes выполнит rolling update без даунтайма.

Заключение

Мы развернули Go-приложение на Kubernetes за четыре простых шага: написали код, упаковали его в Docker, создали манифесты Deployment и Service, и применили их в кластере. Теперь ваше приложение автоматически масштабируется, восстанавливается при сбоях и готово к production-нагрузке.

Это базовое руководство — лишь первый шаг. На практике вы можете добавить ConfigMap для конфигурации, Ingress для маршрутизации, PersistentVolume для данных и многое другое. Go и Kubernetes открывают огромные возможности для построения надёжных и масштабируемых систем.

Готовы углубиться? Попробуйте добавить в приложение э

Блоги

Рекомендаций по книгам