Skip to content

Latest commit

 

History

History
119 lines (100 loc) · 3.95 KB

ЛУЧШИЕ_ПРАКТИКИ.md

File metadata and controls

119 lines (100 loc) · 3.95 KB

Сервисы DaemonSet должны принимать только локальный трафик

В Service для DaemonSet выставить internalTrafficPolicy в Local

apiVersion: v1
kind: Service
metadata:
  name: my-daemonset-service
spec:
  internalTrafficPolicy: Local

Официальная документация: https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/

Распределите ваши pod по разным node и разным зонам (датацентрам)

Добавить topologySpreadConstraints к pod:

apiVersion: v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    metadata:
      labels:
        app.kubernetes.io/name: my-app
    spec:
      topologySpreadConstraints:
      - maxSkew: 2
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app.kubernetes.io/name: my-app
      - maxSkew: 3
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: ScheduleAnyway
        labelSelector:
          matchLabels:
            app.kubernetes.io/name: my-app

В helm chart задавать maxSkew для topology.kubernetes.io/zone так: {{ divf .Values.replicaCount .Values.zones | ceil }} что поделит количество реплик на количество зон и округлит в большую сторону (как вариант использовать maxReplicas от HPA)

Официальная документация: https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/

Направлять по возможности трафик между pod в рамках одной зоны

Добавить аннотацию к Service:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  annotations:
    service.kubernetes.io/topology-mode: Auto # если версия k8s 1.27+
    service.kubernetes.io/topology-aware-hints: auto # если версия k8s меньше 1.27

Официальная документация: https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/

Выключить возможность увеличения привилегий дочерних процессов в контейнере

Для pod в Kubernetes задаем securityContext:

securityContext:
  allowPrivilegeEscalation: false

Смена пользователя с root на appuser

  1. Изменения в Dockerfile:
FROM python:3.11-slim-buster

WORKDIR /opt/apple/myapp

### Создаем пользователя, должно быть ниже чем WORKDIR ###
RUN adduser \
    --disabled-password \
    --gecos "" \
    --home "$(pwd)" \
    --no-create-home \
    --uid 1995 \
    appuser

### В инструкции COPY добавить --chown=1995:1995 ###
COPY --chown=1995:1995 requirements.txt .
RUN pip install --no-cache-dir --requirement requirements.txt \
    && rm -rfv requirements.txt
COPY --chown=1995:1995 app.py entrypoint.sh ./
COPY --chown=1995:1995 static ./

### Изменяем пользователя с root на appuser ###
RUN chown 1995:1995 -R /opt
USER appuser

ENTRYPOINT ["/bin/sh", "-c", "/entrypoint.sh"]
CMD ["-s", "all"]
  1. Для pod в Kubernetes задаем securityContext:
securityContext:
  runAsNonRoot: true
  runAsUser: 1995
  runAsGroup: 1995
  fsGroup: 1995
  1. Протестированно в образах:
    • alpine:3.18
    • node:16.20.0-alpine
    • golang:alpine3.18
    • python:3.11
    • python:3.11-slim-buster
    • nginx:1.25
    • golang:1.20.5

Дополнительные официальные рекомендации: https://kubernetes.io/docs/concepts/configuration/overview/