#python #kubernetes
Вопрос:
У меня есть развертывание k8s, в котором запущено приложение Flask, и я требую, чтобы это приложение теперь имело собственное имя приложения (которое находится внутри metadata.labels.app
). Тогда я хотел бы получить эту информацию из запущенного модуля, возможно ли это ?
Я уже пытался bash
войти в работающий модуль и запустить printenv
его, но не было никакой информации об этом точном развертывании.
Я также проверил клиент kubernetes для python, но, похоже, невозможно получить только информацию о текущем развертывании.
Я что-то упускаю ? Возможно ли это вообще ?
Спасибо за вашу помощь
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: my-app
env: production
name: my-app
namespace: production
spec:
replicas: 1
selector:
matchLabels:
app: my-app
env: production
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: my-app
env: production
spec:
containers:
- image: gcr.io/github.com/my-company/my-app
imagePullPolicy: IfNotPresent
name: my-app-1
resources:
limits:
cpu: 100m
memory: 200Mi
requests:
cpu: 10m
memory: 100Mi
Комментарии:
1. Я бы, вероятно, передал эту информацию в качестве переменной среды приложению flask вместо того, чтобы приложение flask пыталось прочитать информацию о своем собственном модуле. Общая идея контейнера состоит в том, чтобы сделать его похожим на настоящую виртуальную машину, поэтому я не удивлен, что эта информация недоступна внутри модуля. Но , если вы действительно хотите пойти по этому пути, то есть способ подключить docker sock к контейнеру, тем самым позволяя вам взаимодействовать с сервером docker. Возможно, вам потребуется посмотреть, есть ли способ подключить носок kubelet в качестве тома к контейнеру, чтобы вы могли запросить сервер.
Ответ №1:
Вы можете предоставить информацию с помощью env-файлов или файлов, см.
- https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/
- https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/
Пример с одной меткой:
apiVersion: v1
kind: Pod
metadata:
name: label-as-var
labels:
app: my-app
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: ["sh", "-c"]
args:
- while true; do
echo "$MY_APP";
sleep 10;
done;
env:
- name: MY_APP
valueFrom:
fieldRef:
fieldPath: metadata.labels['app']
Результат:
kubectl logs label-as-var
my-app
Пример с нисходящим api из документов, где все метки доступны в файле /etc/podinfo/метки
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-downwardapi-volume-example
labels:
zone: us-est-coast
cluster: test-cluster1
rack: rack-22
annotations:
build: two
builder: john-doe
spec:
containers:
- name: client-container
image: k8s.gcr.io/busybox
command: ["sh", "-c"]
args:
- while true; do
if [[ -e /etc/podinfo/labels ]]; then
echo -en 'nn'; cat /etc/podinfo/labels; fi;
if [[ -e /etc/podinfo/annotations ]]; then
echo -en 'nn'; cat /etc/podinfo/annotations; fi;
sleep 5;
done;
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations