Разбор Kubernetes ConfigMap в смешанных форматах данных - PullRequest
0 голосов
/ 10 июля 2020

Рассмотрим эту текущую конфигурацию пространства имен в формате JSON:

$ kubectl get configmap config -n metallb-system -o json
{
    "apiVersion": "v1",
    "data": {
        "config": "address-pools:\n- name: default\n  protocol: layer2\n  addresses:\n  - 192.168.0.105-192.168.0.105\n  - 192.168.0.110-192.168.0.111\n"
    },
    "kind": "ConfigMap",
    "metadata": {
        "annotations": {
            "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"data\":{\"config\":\"address-pools:\\n- name: default\\n  protocol: layer2\\n  addresses:\\n  - 192.168.0.105-192.168.0.105\\n  - 192.168.0.110-192.168.0.111\\n\"},\"kind\":\"ConfigMap\",\"metadata\":{\"annotations\":{},\"name\":\"config\",\"namespace\":\"metallb-system\"}}\n"
        },
        "creationTimestamp": "2020-07-10T08:26:21Z",
        "managedFields": [
            {
                "apiVersion": "v1",
                "fieldsType": "FieldsV1",
                "fieldsV1": {
                    "f:data": {
                        ".": {},
                        "f:config": {}
                    },
                    "f:metadata": {
                        "f:annotations": {
                            ".": {},
                            "f:kubectl.kubernetes.io/last-applied-configuration": {}
                        }
                    }
                },
                "manager": "kubectl",
                "operation": "Update",
                "time": "2020-07-10T08:26:21Z"
            }
        ],
        "name": "config",
        "namespace": "metallb-system",
        "resourceVersion": "2086",
        "selfLink": "/api/v1/namespaces/metallb-system/configmaps/config",
        "uid": "c2cfd2d2-866c-466e-aa2a-f3f7ef4837ed"
    }
}

Меня интересуют только настроенные пулы адресов. Согласно шпаргалке по kubectl , я могу сделать что-то вроде этого, чтобы получить требуемый диапазон адресов:

$ kubectl get configmap config -n metallb-system -o jsonpath='{.data.config}'
address-pools:
- name: default
  protocol: layer2
  addresses:
  - 192.168.0.105-192.168.0.105
  - 192.168.0.110-192.168.0.111

Однако мое требование - использовать только парсер JSON во всем, и я не могу проанализировать приведенный выше вывод, так как он находится в YAML.

Поскольку я не хочу размещать приведенный выше вывод yaml для прямого использования (или с помощью операции преобразования формата), есть ли какой-либо подходящий способ вместо этого получить диапазон адресов из интерфейса kubectl в формате JSON?

1 Ответ

1 голос
/ 10 июля 2020

Вам понадобится yq вместе с kubectl ...

После проверки вашей карты конфигурации я понял структуру, когда преобразовал ее в YAML:

---
apiVersion: v1
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.0.105-192.168.0.105
      - 192.168.0.110-192.168.0.111
kind: ConfigMap
metadata:
 name: config

И вы можете ясно видеть, что .data.config - многострочная строка .. но ее также можно преобразовать в YAML.

  • проанализируйте многострочную строку с помощью kubectl
  • обрабатывать эту строку как yaml с помощью yq.

Итак, это то, что вы ищете:

# all addresses
kubectl -n metallb-system get cm config -o 'go-template={{index .data "config" }}' | \
    yq -r '.["address-pools"][0].addresses'

# first address only
kubectl -n metallb-system get cm config -o 'go-template={{index .data "config" }}' | \
    yq -r '.["address-pools"][0].addresses[0]'

# second address only
kubectl -n metallb-system get cm config -o 'go-template={{index .data "config" }}' | \
    yq -r '.["address-pools"][0].addresses[1]'

# so on ...
...