ошибка применения kubectl: ошибка преобразования YAML в JSON - PullRequest
2 голосов
/ 09 июля 2019

Получение этого сообщения об ошибке после kubectl apply -f .

error: error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{"include (print $.Template.BasePath \"/configmap.yaml\") . | sha256sum":interface {}(nil)}

Я пытался поместить checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} в разные места, но я не совсем понимаю YAML или JSON, чтобы выяснить проблему.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
        - name:  demo
          image: cloudnatived/demo:hello-config-env
          ports:
            - containerPort: 8888
          env:
            - name: GREETING
              valueFrom:
                configMapKeyRef:
                  name: demo-config
                  key: greeting
      annotations:
          checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}

Я просто хочу иметь возможность обновлять свои модули при изменении конфигурации.Я должен helm upgrade где-то здесь, но я не уверен, какие аргументы дать.

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Нельзя использовать синтаксис {{ ... }} с kubectl apply. Этот синтаксис обычно соответствует диспетчеру пакетов Helm . Не зная применения синтаксиса шаблона, { ... } выглядит как синтаксис карты YAML, и синтаксический анализатор запутывается.

annotations: обычно относятся к metadata:, рядом с labels:. Аннотации в документации по Kubernetes могут быть полезны для чтения.

Я просто хочу иметь возможность обновлять свои модули без перезапуска.

Кубернетес так не работает, за некоторыми очень ограниченными исключениями.

Если вы говорите только о данных конфигурации, а не о коде, вы можете Добавить данные ConfigMap в том ; затем, если ConfigMap изменится, изменятся и файлы, которые видит модуль. Синтаксис, над которым вы спотыкаетесь, - это обходной путь, заставляющий модуль перезапускаться при изменении данных ConfigMap: он противоположен тому, что вы пытаетесь использовать, и вам следует удалить эти две строки.

Для обычных изменений кода стандартным путем является создание и отправка нового образа Docker, а затем обновление объекта Deployment новым тегом образа. (Это должна быть строка тега изображения, отличная от той, что была у вас раньше, просто недостаточно нажать новое изображение с тем же тегом.) Затем Kubernetes автоматически запустит новые модули с новым изображением, и после запуска они отключат модули. со старым изображением. При некоторых обстоятельствах Kubernetes может даже удалять и воссоздавать капсулы самостоятельно.

2 голосов
/ 09 июля 2019

Используете ли вы шлем? Попробуйте переместить annotations под метаданные верхнего уровня:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: demo
  annotations:
    checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
spec:
  replicas: 1
...

В любом случае (скользящий) перезапуск часто требуется для получения некоторых изменений, если только приложение не может обнаружить изменения во внешней конфигурации и выполнить их горячую перезагрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...