验证 Kubernetes 配置的方法

Methods of Verifying Kubernetes Configuration

我一直致力于 small side project to try and learn Kubernetes. I have a relatively simple cluster with two services, an ingress, and working on adding a Redis database now. I'm hosting this cluster in Google Kubernetes Engine (GKE), but using Minikube 到 运行 本地集群,并在我提交任何更改并将它们推送到 GKE 中的生产环境之前尝试一切。

在这个项目中,我注意到 GKE 在配置方式与 Minikube 中的工作方式方面似乎存在一些细微差别。我以前在入口看到过这种情况,现在在持久卷中看到过。

例如,对于运行Redis在GKE中有一个persistent volume,我可以使用:

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 中根本行不通,因为我不能那样创建磁盘。

相反,我需要使用:

      volumes:
      - name: chatter-db-storage
        persistentVolumeClaim:
          claimName: chatter-db-claim

我还需要为 PeristentVolumePersistentVolumeClaim 添加单独的配置。

我可以很容易地在 Minikube GKE 中获得一些东西,但我不确定获得适用于两者的配置的最佳方法是什么。理想情况下,我希望有一个部署此应用程序的 k8s.yaml 文件,并且 kubectl apply -f k8s.yaml 应该适用于两种环境,允许我使用 Minikube 在本地进行测试,然后在我满意时推送到 GKE。

我知道这两种环境之间存在差异,并且可能会在某种程度上泄漏到配置中,但是在推送配置之前必须有一种有效的方法来验证配置吗?测试配置的最佳实践是什么?我的问题主要归结为:

  1. 是否可以使用一个 Kubernetes 配置同时适用于 GKE 和 Minikube?
  2. 如果不是,是否可以主要共享 Kubernetes 配置,覆盖 GKE 和 Minikube 特定部分?
  3. 现有项目如何解决这个特定问题?
  4. 最好的方法是在 GKE 中简单地创建一个单独的 dev 集群并对其进行测试,而不是完全使用 Minikube 吗?

是的,您发现 Kubernetes 配置的某些部分从一开始就不完美。但是有更新的解决方案。

存储抽象

较新 Kubernetes 版本中的想法是您的应用程序配置是一个部署StorageClass.

引用 PersistentVolumeClaim 的卷

StorageClassPersistentVolume 更属于 基础结构配置

参见Configure a Pod to Use a PersistentVolume for Storage了解如何为 Minikube 配置持久卷。对于 GKE,您使用 GCEPersistentDisk 配置 Persistent Volume,或者如果您想将应用程序部署到 AWS,您可以使用 Persistent Volume 对于 AWSElasticBlockStore

入口和服务抽象

类型为 LoadBalancerNodePort

ServiceIngress 的组合工作方式不同云提供商和 Ingress Controllers. In addition, Services Mesh implementations like Istio have introduced VirtualService. The plan is to improve this situation with Ingress v2 我的理解。