在 Kubernetes 中部署时验证错误

时间:2021-03-21 13:36:53

标签: spring-boot kubernetes kubectl

我尝试在 Kubernetes 集群中部署带有 MySQL 数据库的 producer-service 应用程序。当我尝试部署 producer app 时,抛出了以下验证错误。

error: error validating "producer-deployment.yml": error validating data: apiVersion not set; if you choose to ignore these errors, turn validation off with --validate=false

producer-deployment.yml

apiVerion: v1
kind: Service
metadata:
  name: producer-app
  labels:
    name: producer-app
spec:
  ports:
    -nodePort: 30163
    port: 9090
    targetPort: 9090
    protocol: TCP
  selector:
    app: producer-app
  type: NodePort

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: producer-app
spec:
  selector:
    matchLabels:
      app: producer-app
  replicas: 3
  template:
    metadata:
      labels:
        app: producer-app
    spec:
      containers:
        - name: producer
          image: producer:1.0
          ports:
            - containerPort: 9090
          env:
            - name: DB_HOST
              valueFrom:
               configMapKeyRef:
                name: db-config
                key: host
            - name: DB_NAME
              valueFrom:
               configMapKeyRef:
                name: db-config
                key: name
            - name: DB_USERNAME
              valueFrom:
               secretKeyRef:
                name: db-user
                key: username
            - name: DB_PASSWORD
              valueFrom:
               secretKeyRef:
                name: db-user
                key: password

我试图在配置文件中找到错误或拼写错误,但仍然无法找到。 producer-deployment.yml 文件有什么问题

4 个答案:

答案 0 :(得分:2)

多个问题:

  1. apiVersion: v1 中应该是 apiVerion: v1 而不是 Service

  2. 错误的 Spec.ports 格式 Service。由于 nodePortporttargetPortprotocol 作为列表位于 ports 下,但您的编队错误。

您的服务 yaml 应如下所示:

apiVersion: v1
kind: Service
metadata:
  name: producer-app
  labels:
    name: producer-app
spec:
  ports:
    - nodePort: 30163
      port: 9090
      targetPort: 9090
      protocol: TCP
  selector:
    app: producer-app
  type: NodePort

所以你的整体 yaml 应该是:

apiVersion: v1
kind: Service
metadata:
  name: producer-app
  labels:
    name: producer-app
spec:
  ports:
    - nodePort: 30163
      port: 9090
      targetPort: 9090
      protocol: TCP
  selector:
    app: producer-app
  type: NodePort

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: producer-app
spec:
  selector:
    matchLabels:
      app: producer-app
  replicas: 3
  template:
    metadata:
      labels:
        app: producer-app
    spec:
      containers:
        - name: producer
          image: producer:1.0
          ports:
            - containerPort: 9090
          env:
            - name: DB_HOST
              valueFrom:
                configMapKeyRef:
                  name: db-config
                  key: host
            - name: DB_NAME
              valueFrom:
                configMapKeyRef:
                  name: db-config
                  key: name
            - name: DB_USERNAME
              valueFrom:
                secretKeyRef:
                  name: db-user
                  key: username
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-user
                  key: password

答案 1 :(得分:1)

  • 请更改 producer-deployment.yml 中的第一行。缺少字母 s。

来自

apiVerion: v1

apiVersion: v1

答案 2 :(得分:0)

第一行有一个错字:“apiVerion”应该是“apiVersion”。

答案 3 :(得分:0)

您的第一个错误(超过 1 个)只是将您指向应该开始调查的地方..

error validating data: apiVersion not set;

众所周知,kubernetes 中的每个对象都有自己的 apiVersion。 检查 Understanding Kubernetes Objects,尤其是 Required Fields 部分:

<块引用>

在要创建的 Kubernetes 对象的 .yaml 文件中,您将 需要为以下字段设置值:

apiVersion - 您使用的 Kubernetes API 版本 创建这个对象

kind - 你想创建什么样的对象

metadata - 有助于唯一识别对象的数据,包括 名称字符串、UID 和可选的命名空间

spec - 你想要什么状态 对于对象对象规范的精确格式是不同的 每个 Kubernetes 对象,并包含特定于该对象的嵌套字段 对象。

Kubernetes API 参考可以帮助您找到 spec 格式 对于您可以使用 Kubernetes 创建的所有对象。

您可以查看Latest 1.20 API here

这些值是强制性的,没有它们您将无法创建对象。所以,下次请仔细阅读您收到的错误。