在K8s YAML配置中使用Deployment主机名

42次阅读
没有评论

问题描述

在将一些K8s示例从ReplicationControllers转换为Deployments时遇到了问题。这些示例是用于位于https://github.com/kubernetes/examples/tree/master/staging/selenium的Selenium网格。当按原样运行示例时,selenium-hub和selenium-nodes可以成功连接。但是,当尝试将selenium-hub-rc.yamlselenium-node-chrome-rc.yaml转换为Deployments时,selenium-nodes无法连接到selenium-hub。在selenium-node-chrome-rc.yaml中有以下变量:

...
env:
- name: HUB_PORT_4444_TCP_ADDR
  value: "selenium-hub"
- name: HUB_PORT_4444_TCP_PORT
  value: "4444"
...

HUB_PORT_4444_TCP_ADDR是selenium-hub的IP/主机名。selenium-hub-rc.yaml在许多位置显示了selenium-hub问题1:这些位置中哪一个实际上定义了主机名?(.metadata.name, .spec.selector.app, …?)

现在,我将selenium-hub-rc.yaml更改为Deployment:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: selenium-hub-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: selenium-grid
    spec:
      containers:
      - name: selenium-hub
        image: selenium/hub
        ports:
        - containerPort: 4444

但是现在selenium-node无法连接,我认为这是由于HUB_PORT_4444_TCP_ADDR。我尝试过:

- name: HUB_PORT_4444_TCP_ADDR
  value: "selenium-hub"

- name: HUB_PORT_4444_TCP_ADDR
  value: "selenium-hub-deployment"

都没有成功。问题2:Deployment的主机名是什么?在ReplicationController的yaml中,这似乎很简单,例如selenium-hub,但我无法将其作为Deployment工作。

注意,我没有以任何方式更改服务。实际上,我确实更改了它,这部分导致了我的初始问题。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据Kubernetes文档,每个在集群中定义的Service(包括DNS服务器本身)都被分配了一个DNS名称。而当创建一个Pod时,它的主机名是Pod的metadata.name值。所以主机名实际上是服务的名称。我在问题中说我没有以任何方式更改服务,这是一个无意的谎言。我确实更改了服务名称,否则selenium-hub作为主机名将起作用。

HUB_PORT_4444_TCP_ADDR更改为服务的.metadata.name将使我更接近目标。然而,连接超时了。我认为我的服务yaml中的一些配置是错误的。所以,我没有使用我的yaml文件,而是通过以下方式创建了服务:

kubectl expose deployment <deployment name here>

这将创建一个服务,我检查了selenium-hub,节点终于连接上了。所以我的服务yaml中有问题。为了获得正确的配置,我导出了当前正在工作的服务:

kubectl get svc <service name here> -o yaml --export

我将导出的配置复制到我的服务yaml文件中,它也起作用了。以下是服务yaml文件之间的差异:

旧的yaml(从GitHub示例中复制)
---
apiVersion: v1
kind: Service
metadata:
  name: selenium-hub-service
  labels:
    app: selenium-grid
spec:
  ports:
  - port: 4444
    targetPort: 4444
    protocol: TCP
    name: port0
  selector:
    app: selenium-hub
  type: NodePort
  sessionAffinity: None

我不确定为什么添加.spec.ports[0].protocol并删除.spec.type.spec.ports[0].name会修复问题。如果有人能在评论中澄清,我将不胜感激。

正文完