首页 > 解决方案 > Kubernetes命名空间中部署定义的唯一性

问题描述

我们有多个环境,如 dev、qa、prepod 等。我们有基于环境的命名空间。现在我们以环境为后缀命名服务。例如,

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: k8s-order-service-develop-deployment
      namespace: dev
      labels:
        k8s-app: k8s-order-service-develop
    spec:
      selector:
        matchLabels:
          k8s-app: k8s-order-service-develop

相反,我可以在所有命名空间中使用以下内容吗?即deployment每个命名空间是否唯一?

在开发环境中:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: k8s-order-service-deployment
      namespace: dev
      labels:
        k8s-app: k8s-order-service
    spec:
      selector:
        matchLabels:
          k8s-app: k8s-order-service

在 QA 环境中:

apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: k8s-order-service-deployment
      namespace: qa
      labels:
        k8s-app: k8s-order-service
    spec:
      selector:
        matchLabels:
          k8s-app: k8s-order-service

标签: kubernetesnamespaces

解决方案


从部署定义中删除命名空间并将其命名为 deploy.yaml

 apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: k8s-order-service-develop-deployment
      labels:
        k8s-app: k8s-order-service-develop
    spec:
      selector:
        matchLabels:
          k8s-app: k8s-order-service-develop

然后您可以使用以下命令将其部署在特定命名空间中

kubectl create -f deploy.yaml -n <namespace-name>

ex: 
kubectl create -f deploy.yaml -n dev
kubectl create -f deploy.yaml -n qa

您可以查看kustomize以获得更多选项和灵活性

这样您就可以为不同的环境使用相同的部署文件。并且每个环境都相互隔离


推荐阅读