Разрешить несколько ресурсов K8s в JSON

#json #kubernetes #yaml

#json #кубернетес #yaml #kubernetes

Вопрос:

У меня есть файл YAML, который содержит развертывание и обслуживание нескольких ресурсов.

 apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: petclinic
  name: petclinic
spec:
  replicas: 1
  selector:
    matchLabels:
      app: petclinic
  strategy: {}
  template:
    metadata:
      labels:
        app: petclinic
    spec:
      containers:
        - image: arey/springboot-petclinic
          name: springboot-petclinic
          resources: {}
          ports:
            - containerPort: 8080
status: {}
---
apiVersion: v1
kind: Service
metadata:
  name: petclinic
spec:
  type: LoadBalancer
  selector:
    app: petclinic
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
      name: http
  

Я создаю аналогичный файл в формате JSON. Мне удалось создать ресурс развертывания с помощью JSON и успешно развернуть, но когда я пытаюсь включить ресурс службы, это не удается. Буду очень признателен за любую помощь в том, где я ошибаюсь. Вот приведенный ниже фрагмент для JSON.

 {
   "apiVersion": "apps/v1",
   "kind": "Deployment",
   "metadata": {
      "creationTimestamp": null,
      "labels": {
         "app": "petclinic"
      },
      "name": "petclinic"
   },
   "spec": {
      "replicas": 2,
      "selector": {
         "matchLabels": {
            "app": "petclinic"
         }
      },
      "strategy": {},
      "template": {
         "metadata": {
            "labels": {
               "app": "petclinic"
            }
         },
         "spec": {
            "containers": [
               {
                  "image": "arey/springboot-petclinic",
                  "name": "springboot-petclinic",
                  "resources": {},
                  "ports": [
                     {
                        "containerPort": 8080
                     }
                  ]
               }
            ]
         }
      }
   },
   "status": {}
}

{
   "apiVersion": "v1",
   "kind": "Service",
   "metadata": {
        "name": "petclinic"
   },
   "spec": {
      "type": "LoadBalancer",
      "selector": {
       
            "app": "petclinic"
         
      },
        
            "ports": [
               {
                  "port": 8080,
                  "targetPort": 8080,
                  "protocol": "TCP",
                  "name": "http"                   
                  ]
             }     
   }    
}
  

Ответ №1:

В вашем сервисном ресурсе имеется синтаксическая ошибка (закрывающая скобка массива в ports ). Это должно быть:

 {
  "apiVersion": "v1",
  "kind": "Service",
  "metadata": {
    "name": "petclinic"
  },
  "spec": {
    "type": "LoadBalancer",
    "selector": {
      "app": "petclinic"
    },
    "ports": [
      {
        "port": 8080,
        "targetPort": 8080,
        "protocol": "TCP",
        "name": "http"
      }
    ]
  }
}
  

Чтобы сделать файл допустимым файлом JSON, вы можете поместить определения в List ресурс:

 {
  "apiVersion": "v1",
  "kind": "List",
  "items": [
    {
      "apiVersion": "v1",
      "kind": "Deployment",
      ...
    },
    {
      "apiVersion": "v1",
      "kind": "Service",
      ...
    }
  ]
}
  

Комментарии:

1. Спасибо, у меня есть вопрос. Возможно ли заключить два корневых объекта (deployment и services) в массив, чтобы синтаксис JSON был удовлетворен? Могу ли я использовать синтаксис?

2. @Coolbreeze в самом массиве JSON нет, но вы можете обернуть их List ресурсом. Смотрите отредактированный ответ

3. Огромное спасибо за отредактированный ответ. Это было именно то, что я искал. Ценю время, потраченное на то, чтобы помочь мне в этом.

Ответ №2:

Вы могли бы сначала применить yaml с помощью kubectl , а затем получить json обратно с помощью kubectl get deploy,services -o json > example.json

Правильный синтаксис для json — это иметь , между двумя ресурсами, а не --- как вы используете в yaml

 ...
    // deployment
},
{
    // service
...