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

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

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

Начать курс

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

Go (Golang) и Kubernetes (K8s) созданы друг для друга. Сам Kubernetes написан на Go, поэтому нативный инструментарий, производительность и простота развертывания делают эту связку стандартом для современных микросервисов. Если вы только начинаете свой путь в DevOps или хотите автоматизировать деплой своего Go-приложения, это руководство поможет вам пройти все этапы: от написания простого HTTP-сервера на Go до запуска его в кластере Kubernetes.

В этой статье мы разберем:

  • Сборку Go-приложения в Docker-образ
  • Создание минимальных манифестов Kubernetes (Deployment, Service, Ingress)
  • Деплой и проверку работоспособности

Предполагается, что у вас уже установлены docker, kubectl и minikube (или доступ к любому кластеру K8s).

Шаг 1: Пишем простое Go-приложение

Создадим базовый HTTP-сервер, который будет отвечать на запросы. Создайте файл main.go:

package main

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

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Привет из Go! Версия: %s", os.Getenv("APP_VERSION"))
    })

    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
    }

    fmt.Printf("Сервер запущен на порту %s\n", port)
    http.ListenAndServe(":"+port, nil)
}

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

go run main.go
# Откройте браузер на http://localhost:8080

Создаем модуль Go

Инициализируйте модуль для удобной сборки:

go mod init my-go-app

Шаг 2: Контейнеризация с Docker

Для деплоя в Kubernetes нужно упаковать приложение в Docker-образ. Используем многоступенчатую сборку (multi-stage build), чтобы образ был минимальным.

Создайте файл Dockerfile:

# Этап сборки
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod ./
COPY main.go ./
RUN go build -o my-app .

# Финальный образ
FROM alpine:3.19
WORKDIR /app
COPY --from=builder /app/my-app .
EXPOSE 8080
CMD ["./my-app"]

Соберите образ и проверьте:

docker build -t my-go-app:v1 .
docker run -p 8080:8080 my-go-app:v1
# http://localhost:8080

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

Теперь подготовим YAML-файлы для развертывания в кластере. Мы создадим три ресурса: Deployment (управление подами), Service (сетевой доступ) и Ingress (внешний доступ).

3.1. Deployment

Создайте файл deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-app-deployment
  labels:
    app: go-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: go-app
  template:
    metadata:
      labels:
        app: go-app
    spec:
      containers:
      - name: go-app
        image: my-go-app:v1
        ports:
        - containerPort: 8080
        env:
        - name: APP_VERSION
          value: "1.0.0"
        - name: PORT
          value: "8080"
        livenessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10

Здесь мы задали 2 реплики, пробу готовности (liveness probe) и переменные окружения.

3.2. 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: ClusterIP

Сервис будет перенаправлять трафик с порта 80 на порт 8080 контейнеров.

3.3. Ingress (опционально)

Для доступа извне (например, через localhost в Minikube) создайте ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-app-ingress
spec:
  rules:
  - host: go-app.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: go-app-service
            port:
              number: 80

В Minikube потребуется включить аддон ingress и добавить запись 127.0.0.1 go-app.local в файл /etc/hosts.

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

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

# Загрузите образ в Minikube (если используете локальный образ)
minikube image load my-go-app:v1

# Примените манифесты
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml

# Проверьте статус
kubectl get pods
kubectl get svc
kubectl get ingress

Если всё прошло успешно, вы увидите два работающих пода. Теперь протестируйте приложение:

# Через Minikube
minikube service go-app-service

# Или через Ingress (если настроили)
curl http://go-app.local

В ответ вы должны получить: Привет из Go! Версия: 1.0.0.

Заключение

Мы разобрали полный цикл деплоя Go-приложения на Kubernetes: от написания кода до запуска в кластере с несколькими репликами и автоматическим восстановлением. Вы узнали:

  • Как создать минимальный HTTP-сервер на Go

Блоги

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