Methods of Verifying Kubernetes Configuration
我一直在做一个小型项目,尝试学习Kubernetes。我有一个相对简单的群集,其中包含两个服务(一个入口),现在正在添加Redis数据库。我将这个集群托管在Google Kubernetes Engine(GKE)中,但是使用Minikube在本地运行该集群并尝试所有操作,然后再提交任何更改并将其推送到GKE的产品环境中。
在此项目中,我注意到GKE在配置方式和Minikube中的工作方式上似乎有些许差异。我以前在入口中已经看到了这一点,现在在持久卷中已经看到了这一点。
例如,要在GKE中使用持久卷运行Redis,我可以使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| apiVersion: apps/v1
kind: Deployment
metadata:
name: chatter-db-deployment
labels:
app: chatter
spec:
replicas: 1
selector:
matchLabels:
app: chatter-db-service
template:
metadata:
labels:
app: chatter-db-service
spec:
containers:
- name: master
image: redis
args: [
"--save","3600","1","300","100","60","10000",
"--appendonly","yes",
]
ports:
- containerPort: 6379
volumeMounts:
- name: chatter-db-storage
mountPath: /data/
volumes:
- name: chatter-db-storage
gcePersistentDisk:
pdName: chatter-db-disk
fsType: ext4 |
最后的gcePersistentDisk部分指的是我使用gcloud compute disks create创建的磁盘。但是,这在Minikube中根本行不通,因为我无法以这种方式创建磁盘。
相反,我需要使用:
1 2 3 4
| volumes:
- name: chatter-db-storage
persistentVolumeClaim:
claimName: chatter-db-claim |
我还需要为PeristentVolume和PersistentVolumeClaim包括单独的配置。
我可以轻松地在Minikube或GKE中使某些东西正常工作,但是我不确定获得同时适用于两者的配置的最佳方法是什么。理想情况下,我希望有一个用于部署此应用程序的k8s.yaml文件,并且kubectl apply -f k8s.yaml应该在两种环境下都可以工作,从而允许我在Minikube上进行本地测试,然后在满意时推送到GKE。
我知道这两种环境之间存在差异,并且可能会在某种程度上泄漏到配置中,但是在推出之前必须有一种有效的方法来验证配置吗?测试配置的最佳实践是什么?我的问题主要归结为:
拥有一个可以同时适用于GKE和Minikube的Kubernetes配置是否可行?
如果不是,拥有一个几乎共享的Kubernetes配置是否可行,该配置将覆盖GKE和Minikube的特定部分?
现有项目如何解决这个特定问题?
最好的方法是在GKE中简单地创建一个单独的dev集群并对其进行测试,而不是完全不理会Minikube吗?
是的,您发现Kubernetes配置的某些部分从一开始就并不完美。但是有更新的解决方案。
存储抽象
Kubernetes较新版本中的想法是,您的应用程序配置是带有卷的部署,该部署指的是StorageClass的PersistentVolumeClaim。
StorageClass和PersistentVolume属于基础结构配置。
有关如何为Minikube配置持久卷,请参阅配置Pod以使用PersistentVolume进行存储。对于GKE,您可以使用GCEPersistentDisk配置一个持久卷,或者如果您要将应用程序部署到AWS,则可以将持久卷用于AWSElasticBlockStore。
入口和服务抽象
类型为LoadBalancer的
Service和NodePort与Ingress结合使用时,在云提供商和Ingress Controller之间的工作方式不同。此外,Istio之类的Services Mesh实现还引入了VirtualService。按照我的理解,计划是使用Ingress v2改善这种情况。
- 感谢您在此处提供的其他详细信息,使该问题更加清晰明了,尽管我不确定在这里是否可以找到解决方案。应用程序配置和基础结构配置之间有什么区别?您是否建议我可以在常规应用程序配置中使用一个配置,而对Minikube / GKE特定部件使用一个单独的配置?还是这仅仅是Kubernetes中一个已知的设计缺陷,该缺陷将在某个时候被"修复"?
-
@DouglasParker所有平台的应用程序配置都相同,例如Minikube和GKE。但是基础架构配置取决于平台,例如Minikube和GKE有所不同,希望这只是您配置的一小部分。
-
@DouglasParker是的,每个平台上的服务和Ingress可能有所不同...如果您可以在每个平台上使用相同的Ingress Controller,这是最简单的...但是有时候您想使用云提供商的设置....因此这取决于什么对您最重要。
-
但是我有关Persistent Volume的链接说明了如何为Minikube执行PersistenVolumes ...因此,最好在您的平台上配置通用的StorageClass ...,但要使用依赖于平台的PersistentVolume。
-
我想我已经开始理解这个概念,但是我正在为实现而苦苦挣扎。为了现在特别专注于PV,我会为Minikube使用一个StorageClass,为GKE使用另一个StorageClass,然后仅引用我的PersistentVolume中的StorageClass吗?如果是这样,如何获得使用正确的StorageClass的配置?我看到的唯一方法是让app.yaml,minikube.yaml和gke.yaml具有相同的StorageClass名称,但实现方式不同。然后只需kubectl apply - f我想要的两个。有没有更好的方法可以做到这一点?
-
@DouglasParker是的。您的应用程序使用引用StorageClassName的PersistentVolumeClaim ...在Minikube和GKE上名称均相同,但是StorageClass对象绑定到不同的基础实现...但是在各个平台上名称均相同。参见我的链接示例,他们使用StorageClassName: manual。
-
因此,是的,您对Minikube使用一个StorageClass,对GKE使用另一个StorageClass,但是名称相同...因此,应用程序将绑定到在同一storageClassName下为平台定义的卷类型。
-
以下是适用于SSD的GKE的示例:cloud.google.com/kubernetes-engine/docs/how-to / ... ...并且,如果您在Minikube上定义,也可以使用名称faster来兼容。
-
@DouglasParker是的,您所做的一切都正确。但是StorageClass您只需要为每个平台创建一次即可。对于您创建的每个应用程序项目,只需使用app1.yaml,app2.yaml等等...现在,您将获得三个文件,因为在创建第一个应用程序的同时要初始化两个不同的平台。
-
感谢您在这里的讨论!我可以拆分成单独的Minikube和GKE文件,其中包含特定于基础架构的配置,同时可以从常见的app.yaml引用它们。我实际上是通过拆分PersistentVolumeClaim来实现的,因为我找不到仅使用StorageClass来实现Minikube的好方法。这似乎足以满足我的需求。我将不得不重构入口配置以使用相同的技巧。我致力于解决这个问题。