Структурированный курс для освоения Kubernetes с практическими примерами на Go.
Для кого: Go разработчики
Длительность: 4-5 недель
Формат: Теория → Практика → Проект
Аспект | Преимущество |
---|---|
Производительность | В 10-50x быстрее Python/Node.js |
Память | В 5-10x меньше потребление |
Startup | <2 секунды (vs 10-30 сек) |
Размер образа | 10-20 MB (vs 200+ MB) |
Интеграция | Kubernetes написан на Go |
k8s/
├── 01-basics/ # Pods
├── 02-deployments/ # Управление приложениями
├── 03-services/ # Сетевое взаимодействие
├── 04-configmaps-secrets/ # Конфигурация
├── 05-volumes/ # Хранение данных
├── 06-ingress/ # HTTP маршрутизация
├── 07-namespaces/ # Изоляция ресурсов
├── 08-resource-management/ # Лимиты и HPA
├── 09-health-checks/ # Health probes
├── 10-statefulsets/ # Stateful приложения
├── 11-jobs-cronjobs/ # Задачи по расписанию
├── 12-rbac/ # Безопасность
│
├── demo-apps/
│ ├── hello-web/ # 🟢 Простое
│ ├── counter-app/ # 🟡 Среднее (Go + Redis)
│ └── multi-tier/ # 🔴 Сложное (Go + PostgreSQL)
│
├── scripts/
│ ├── start-minikube.sh
│ └── cleanup.sh
│
└── setup/
├── minikube-setup.md
└── timeweb-cloud-setup.md
Отмечайте пройденные этапы:
- Установка и настройка окружения
- 01-basics - Pods и Labels
- 02-deployments - Deployments и Scaling
- 03-services - Services и DNS
- 🎯 Проект: hello-web
- 04-configmaps-secrets - ConfigMaps и Secrets
- 05-volumes - PersistentVolume и PVC
- 07-namespaces - Namespaces и ResourceQuota
- 🎯 Проект: counter-app (Go + Redis)
- 06-ingress - Ingress и маршрутизация
- 08-resource-management - Limits и HPA
- 09-health-checks - Health probes
- 10-statefulsets - StatefulSets
- 11-jobs-cronjobs - Jobs и CronJobs
- 12-rbac - RBAC и безопасность
- 🎯 Проект: multi-tier (Go + PostgreSQL)
- Деплой в облако (Timeweb Cloud)
- CI/CD с GitHub Actions
- Мониторинг (Prometheus + Grafana)
- Service Mesh (Istio)
# macOS
brew install kubectl minikube
# Проверка
kubectl version --client
minikube version
📖 Подробная инструкция: setup/minikube-setup.md
./scripts/start-minikube.sh
cd 01-basics
kubectl apply -f pod-simple.yaml
kubectl get pods
🎉 Готово! Вы запустили первый Pod в Kubernetes!
cd 01-basics
kubectl apply -f pod-simple.yaml
kubectl get pods
kubectl logs pod-simple
kubectl exec -it pod-simple -- /bin/sh
Что изучите: Pod, Labels, Multi-container, Logs, Exec
Время: 2-3 часа
📖 Материалы: 01-basics/README.md | commands.md | exercise.md
cd 02-deployments
kubectl apply -f deployment-simple.yaml
kubectl scale deployment nginx-deployment --replicas=5
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
kubectl rollout undo deployment/nginx-deployment
Что изучите: ReplicaSet, Scaling, Rolling updates, Rollback
Время: 3-4 часа
📖 Материалы: 02-deployments/README.md
cd 03-services
kubectl apply -f service-clusterip.yaml
kubectl get svc
kubectl run test --image=curlimages/curl -it --rm -- curl http://nginx-service
Что изучите: ClusterIP, NodePort, LoadBalancer, DNS
Время: 2-3 часа
📖 Материалы: 03-services/README.md
Примените знания на реальном приложении:
cd demo-apps/hello-web
kubectl apply -f deployment.yaml
minikube service hello-web
📖 Инструкции: demo-apps/hello-web/README.md
cd 04-configmaps-secrets
kubectl create configmap app-config --from-literal=key=value
kubectl create secret generic db-secret --from-literal=password=secret
kubectl apply -f configmap-env.yaml
Что изучите: Управление конфигурацией, Secrets, Environment
Время: 2 часа
📖 Материалы: 04-configmaps-secrets/README.md
cd 05-volumes
kubectl apply -f pvc-simple.yaml
kubectl get pvc
kubectl get pv
Что изучите: PersistentVolume, PVC, StorageClass
Время: 2-3 часа
📖 Материалы: 05-volumes/README.md
cd 07-namespaces
kubectl create namespace development
kubectl get namespaces
kubectl config set-context --current --namespace=development
Что изучите: Изоляция, ResourceQuota, LimitRange
Время: 1-2 часа
📖 Материалы: 07-namespaces/README.md
Go приложение с Redis:
cd demo-apps/counter-app
kubectl apply -f deployment.yaml
minikube service counter-app
📖 Инструкции: demo-apps/counter-app/README.md
minikube addons enable ingress
cd 06-ingress
kubectl apply -f ingress-simple.yaml
Что изучите: Ingress Controller, Routing, TLS
Время: 2-3 часа
📖 Материалы: 06-ingress/README.md
cd 08-resource-management
kubectl apply -f hpa-cpu.yaml
kubectl top pods
Что изучите: Requests/Limits, HPA, QoS
Время: 2 часа
📖 Материалы: 08-resource-management/README.md
cd 09-health-checks
kubectl apply -f deployment-with-probes.yaml
kubectl describe pod <pod-name>
Что изучите: Liveness, Readiness, Startup probes
Время: 2 часа
📖 Материалы: 09-health-checks/README.md
cd 10-statefulsets
kubectl apply -f statefulset-nginx.yaml
kubectl get statefulsets
Что изучите: StatefulSet, Headless Service, Volumes
Время: 3 часа
📖 Материалы: 10-statefulsets/README.md
cd 11-jobs-cronjobs
kubectl apply -f job-simple.yaml
kubectl apply -f cronjob-simple.yaml
kubectl get jobs
kubectl get cronjobs
Что изучите: Batch задачи, Расписания
Время: 2 часа
📖 Материалы: 11-jobs-cronjobs/README.md
cd 12-rbac
kubectl apply -f serviceaccount-with-role.yaml
kubectl auth can-i list pods
Что изучите: Roles, ServiceAccounts, Security
Время: 2-3 часа
📖 Материалы: 12-rbac/README.md
📖 Инструкции: demo-apps/multi-tier/README.md
# Build stage
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o app .
# Runtime stage
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/app .
EXPOSE 8080
CMD ["./app"]
Результат: образ ~10-15 MB (vs 300+ MB без multi-stage)
func healthHandler(w http.ResponseWriter, r *http.Request) {
// Проверить зависимости (БД, Redis и т.д.)
if err := db.Ping(); err != nil {
w.WriteHeader(http.StatusServiceUnavailable)
json.NewEncoder(w).Encode(map[string]string{
"status": "unhealthy",
"error": err.Error(),
})
return
}
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(map[string]string{"status": "healthy"})
}
Kubernetes манифест:
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
func main() {
server := &http.Server{Addr: ":8080", Handler: router}
go func() {
if err := server.ListenAndServe(); err != nil {
log.Printf("Server error: %v", err)
}
}()
// Ждём сигнал завершения
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("Shutting down...")
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
log.Fatal("Forced shutdown:", err)
}
log.Println("Server stopped")
}
type Config struct {
Port string
DatabaseURL string
RedisHost string
}
func loadConfig() *Config {
return &Config{
Port: getEnv("PORT", "8080"),
DatabaseURL: os.Getenv("DATABASE_URL"),
RedisHost: getEnv("REDIS_HOST", "localhost"),
}
}
func getEnv(key, fallback string) string {
if value := os.Getenv(key); value != "" {
return value
}
return fallback
}
import "log/slog"
func main() {
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
}))
logger.Info("server starting",
"port", port,
"version", version,
"env", environment,
)
}
# Просмотр
kubectl get pods
kubectl get deployments
kubectl get services
kubectl get all
# Детали
kubectl describe pod <name>
kubectl logs <pod-name>
kubectl logs -f <pod-name>
# Выполнение
kubectl exec -it <pod-name> -- /bin/sh
# Применение
kubectl apply -f file.yaml
kubectl delete -f file.yaml
# Масштабирование
kubectl scale deployment <name> --replicas=3
# Обновление
kubectl set image deployment/<name> container=image:tag
kubectl rollout status deployment/<name>
kubectl rollout undo deployment/<name>
# Отладка
kubectl get events
kubectl top pods
kubectl port-forward <pod> 8080:80
# Очистить учебные ресурсы
./scripts/cleanup.sh
# Остановить кластер
minikube stop
# Удалить кластер
minikube delete
После завершения курса:
- Деплой в облако - Timeweb Cloud
- CI/CD - GitHub Actions, ArgoCD
- Мониторинг - Prometheus + Grafana
- Service Mesh - Istio, Linkerd
- Helm Charts (Terraform + Ansible + Helm)
- Сертификация - CKA, CKAD
MIT License - см. LICENSE
🎉 Удачи в изучении!
Kubernetes написан на Go не случайно - это идеальная пара для облачных приложений!