Введение: почему 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 открывают огромные возможности для построения надёжных и масштабируемых систем.
Готовы углубиться? Попробуйте добавить в приложение э