Введение: почему 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