# syntax=docker/dockerfile:1
FROM golang:1.19
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux go build -o /docker-gs-ping
EXPOSE 8080
CMD [ "/docker-gs-ping" ]
# syntax=docker/dockerfile:1
FROM golang:1.19 AS build-stage
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux go build -o /docker-gs-ping
FROM gcr.io/distroless/base-debian11 AS build-release-stage
WORKDIR /
COPY --from=build-stage /docker-gs-ping /docker-gs-ping
EXPOSE 8080
USER nonroot:nonroot
ENTRYPOINT ["/docker-gs-ping"]
Кэширование сборки docker-образов
Не правильно
RUN apt update
RUN apt install -y golang
Правильно
RUN apt update && apt install -y golang
Оптимально
RUN --mount=type=cache,sharing=private,target=/var/cache/apt \
--mount=type=tmpfs,target=/tmp \
apt update && apt install -y golang && apt-get clean all
Что внутри образа?
Подведём итоги
OCI Image — вырос из Docker Image и является его развитием
Сборки порождают слои, каждый из которых используется только для чтения (overlayfs)
OCI Image содержит метаданные: переменные окружения, команда выполнения, порты и т.п., которые используются
как значения по-умолчанию при запуске контейнера
В контейнер можно передавать конфигурацию через модификацию переменных окружения и монтирования
каталогов/файлов при его запуске
kubectl get pods
kubectl describe pod nginx
kubectl logs nginx
kubectl delete pod nginx
Открытые вопросы
Какой контейнер будет использоваться для Pod-а и откуда он берётся?
Где именно будет запущен Pod?
Какие Pod-у будут выделены ресурсы?
Как достучаться до Pod-а?
Что произойдёт если удалить хост с Pod-ом?
Как передать конфигурацию в Pod?
Ресурсы в Kubernetes
Запуск приложения
Pod
Минимальный объект в Kubernetes.
ReplicaSet
Управляет количеством однотипных Pod-ов.
Deployment, StatefulSet, DaemonSet
Объекты, которые управляют жизненным циклом контейнерных приложений.
Ресурсы в Kubernetes
Конфигурация приложения
Переменные окружения
У Pod-а можно переопределить переменные окружения. Так же через них можно прокинуть часть данных о Pod-е в
контейнер
(https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/).
Параметры командной строки
Можно переопределить параметры командной строки для Pod-а.
Secret, ConfigMap
Специальные ресурсы, которые можно отобразить на файловую систему Pod-а.
Ресурсы в Kubernetes
Ресурсы для доступа к Pod-у
Service
Объект, который позволяет адресовать группу Pod-ов.
Ingress
Объект, который позволяет достучаться к Pod-у снаружи Kubernetes-кластера.
TODO: Добавить пример конфигурации через ConfigMap
Доступ к Pod-у снаружи Kubernetes-кластера
TODO: Добавить пример Service и Ingress
Подведём итоги
Ресурсами управляет Deployment
Конфигурацию можно задать через ConfigMap и переменные окружения
Обязательно надо прописывать requests для Pod-а
Обязательно надо прописывать livenessProbe, readinessProbe и startupProbe
Для адресации между Pod-ами используются Service
Для адресации снаружи Kubernetes-кластера используются Ingress
Что осталось за кадром?
Pod nodeAffinity
Pod topologySpreadConstraints
HorizontalPodAutoscaler
PodDisruptionBudget
Состояние в Kubernetes: StatefulSet, Persistent Volume.
Шпаргалки по Kubernetes
TODO: Добавить шпаргалки по Kubernetes
Deploy
Откуда берутся ресурсы для Kubernetes?
При раскатки приложения ресурсы для Kubernetes обычно генерируются каким-либо образом.
Применение ресурсов через kubectl apply имеет существенный недостаток: никто не удаляет более
ненужные ресурсы.
Стандартом де-факто для создания "приложений" в Kubernetes является Helm
Helm
Helm — менеджер пакетов для Kubernetes, который упрощает установку, обновление и управление приложениями в
кластере. Особенность — использование чартов (Helm Charts) — стандартизированных пакетов, в которых
содержатся все необходимые ресурсы и конфигурации.