为什么我应该在部署Kubernetes配置文件之前指定服务?

时间:2018-05-18 10:33:54

标签: kubernetes kubectl

我试图了解为什么kubernetes docs recommend在部署之前在一个配置文件中指定服务:

  

资源将按照它们在文件中出现的顺序创建。因此,最好先指定服务,因为这样可以确保调度程序可以扩展与服务关联的pod,因为它们是由控制器创建的,例如部署。

是否意味着在kubernetes集群节点之间传播pod?

我使用以下配置进行测试,其中部署位于服务之前,并且在nod之间分配pod而没有任何问题。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: incorrect-order
  namespace: test
spec:
  selector:
    matchLabels:
      app: incorrect-order
  replicas: 2
  template:
    metadata:
      labels:
        app: incorrect-order
    spec:
      containers:
      - name: incorrect-order
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: incorrect-order
  namespace: test
  labels:
    app: incorrect-order
spec:
  type: NodePort
  ports:
  - port: 80
  selector:
    app: incorrect-order

另一个explanation是在这种情况下,不会为pod设置一些带有服务URL的环境变量。但是,如果配置在一个文件中,如上例所示,它也可以正常工作。

您能解释为什么在部署配置文件的情况下在部署之前指定服务更好吗?或者可能是一些过时的推荐。

2 个答案:

答案 0 :(得分:2)

如果您使用DNS作为服务发现,则创建顺序无关紧要。

如果是Environment Vars(K8S提供服务发现的第二种方式),则该订单很重要,因为一旦该vars传递到起始窗格,如果该服务稍后将无法修改定义变化。

因此,如果您的服务部署之前,则启动您的广告连播,服务环境将被注入链接的广告连播中。

如果使用标签创建Pod / Deployment资源,则在创建最后一个服务后,将通过服务公开此资源(使用适当的选择器指示要公开的资源)。

答案 1 :(得分:1)

您是正确的,因为它会影响工作节点之间的传播。

不带服务的部署将简单地安排到CPU /内存分配最少的节点上。例如,一个全新的空节点将从新部署中获取所有新的Pod。

对于具有服务的Deployment,调度程序将尝试在节点之间散布pod,而忽略cpu /内存负载(在限制范围内),以帮助服务更好地生存。

让我感到困惑的是,单独部署并不会导致最佳传播,但至少直到现在还没有。