Считывание меток развертывания k8s из запущенного экземпляра python

#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-файлов или файлов, см.

Пример с одной меткой:

 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