尝试在 AKS 中应用 Yaml 文件时出现验证错误
Getting a validtion error when trying to apply a Yaml file in AKS
我正在学习 this 教程。我正处于使用命令进行部署的阶段:
kubectl apply -f azure-vote-all-in-one-redis.yaml
YAML 文件如下所示:
version: '3'
services:
azure-vote-back:
image: redis
container_name: azure-vote-back
ports:
- "6379:6379"
azure-vote-front:
build: ./azure-vote
image: azure-vote-front
container_name: azure-vote-front
environment:
REDIS: azure-vote-back
ports:
- "8080:80"
但是,我收到错误消息:
error validating data: [apiVersion not set, kind not set]; if you choose to ignore these errors, turn validation off with --validate=false
如果我添加一个 apiVersion 和一个 Kind,就像这样:
apiVersion: v1
kind: Pod
然后我得到错误:
error validating data: ValidationError(Pod): unknown field "services" in io.k8s.api.core.v1.Pod
我是不是遗漏了什么?
所以首先,每个 yaml 定义都应该遵循 AKMS 规范:apiVersion、kind、metadata、spec。此外,您应该避免 pod 并使用 deployments。因为部署自己处理 pods。
这是一个示例 vote-back\front 定义:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: azure-vote-back
spec:
replicas: 1
template:
metadata:
labels:
app: azure-vote-back
spec:
containers:
- name: azure-vote-back
image: redis
ports:
- containerPort: 6379
name: redis
---
apiVersion: v1
kind: Service
metadata:
name: azure-vote-back
spec:
ports:
- port: 6379
selector:
app: azure-vote-back
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: azure-vote-front
spec:
replicas: 3
strategy:
rollingUpdate:
maxSurge: 60%
maxUnavailable: 60%
template:
metadata:
labels:
app: azure-vote-front
spec:
containers:
- name: azure-vote-front
image: aksrg.azurecr.io/azure-vote-front:voting-dev
ports:
- containerPort: 80
env:
- name: REDIS
value: "azure-vote-back"
- name: MY_POD_NAMESPACE
valueFrom: {fieldRef: {fieldPath: metadata.namespace}}
imagePullSecrets:
- name: k8s
---
apiVersion: v1
kind: Service
metadata:
name: azure-vote-front
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: azure-vote-front
您似乎正在尝试将 Docker Swarm/Compose YAML 文件应用到您的 Kubernetes 集群。如果不进行转换,这将无法直接使用。
使用像 Kompose 这样的工具将您的 Docker YAML 转换为 k8s YAML 是从一个迁移到另一个的有用步骤。
有关详细信息,请参阅 https://kubernetes.io/docs/tasks/configure-pod-container/translate-compose-kubernetes/
就我而言,我正在通过 Travis 在 GKE 上部署我的项目。在我的 travis 文件中,我调用了一个 shell 文件 (deploy.sh).
在deploy.sh文件中,我写了创建kubernetes资源的所有步骤:
### Deploy
# Apply k8s config
kubectl apply -f .
所以在这里,我将 kubectl apply -f .
替换为单独的文件名,如下所示:
### Deploy
# Apply k8s config
kubectl apply -f namespace.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
然后,错误就修复了!
我正在学习 this 教程。我正处于使用命令进行部署的阶段:
kubectl apply -f azure-vote-all-in-one-redis.yaml
YAML 文件如下所示:
version: '3'
services:
azure-vote-back:
image: redis
container_name: azure-vote-back
ports:
- "6379:6379"
azure-vote-front:
build: ./azure-vote
image: azure-vote-front
container_name: azure-vote-front
environment:
REDIS: azure-vote-back
ports:
- "8080:80"
但是,我收到错误消息:
error validating data: [apiVersion not set, kind not set]; if you choose to ignore these errors, turn validation off with --validate=false
如果我添加一个 apiVersion 和一个 Kind,就像这样:
apiVersion: v1
kind: Pod
然后我得到错误:
error validating data: ValidationError(Pod): unknown field "services" in io.k8s.api.core.v1.Pod
我是不是遗漏了什么?
所以首先,每个 yaml 定义都应该遵循 AKMS 规范:apiVersion、kind、metadata、spec。此外,您应该避免 pod 并使用 deployments。因为部署自己处理 pods。
这是一个示例 vote-back\front 定义:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: azure-vote-back
spec:
replicas: 1
template:
metadata:
labels:
app: azure-vote-back
spec:
containers:
- name: azure-vote-back
image: redis
ports:
- containerPort: 6379
name: redis
---
apiVersion: v1
kind: Service
metadata:
name: azure-vote-back
spec:
ports:
- port: 6379
selector:
app: azure-vote-back
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: azure-vote-front
spec:
replicas: 3
strategy:
rollingUpdate:
maxSurge: 60%
maxUnavailable: 60%
template:
metadata:
labels:
app: azure-vote-front
spec:
containers:
- name: azure-vote-front
image: aksrg.azurecr.io/azure-vote-front:voting-dev
ports:
- containerPort: 80
env:
- name: REDIS
value: "azure-vote-back"
- name: MY_POD_NAMESPACE
valueFrom: {fieldRef: {fieldPath: metadata.namespace}}
imagePullSecrets:
- name: k8s
---
apiVersion: v1
kind: Service
metadata:
name: azure-vote-front
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: azure-vote-front
您似乎正在尝试将 Docker Swarm/Compose YAML 文件应用到您的 Kubernetes 集群。如果不进行转换,这将无法直接使用。
使用像 Kompose 这样的工具将您的 Docker YAML 转换为 k8s YAML 是从一个迁移到另一个的有用步骤。
有关详细信息,请参阅 https://kubernetes.io/docs/tasks/configure-pod-container/translate-compose-kubernetes/
就我而言,我正在通过 Travis 在 GKE 上部署我的项目。在我的 travis 文件中,我调用了一个 shell 文件 (deploy.sh).
在deploy.sh文件中,我写了创建kubernetes资源的所有步骤:
### Deploy
# Apply k8s config
kubectl apply -f .
所以在这里,我将 kubectl apply -f .
替换为单独的文件名,如下所示:
### Deploy
# Apply k8s config
kubectl apply -f namespace.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
然后,错误就修复了!