В 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/
Добавить 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/
Добавить аннотацию к 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
- Изменения в
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"]
- Для pod в Kubernetes задаем securityContext:
securityContext:
runAsNonRoot: true
runAsUser: 1995
runAsGroup: 1995
fsGroup: 1995
- Протестированно в образах:
- 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