问题描述
在将一些K8s示例从ReplicationControllers转换为Deployments时遇到了问题。这些示例是用于位于https://github.com/kubernetes/examples/tree/master/staging/selenium的Selenium网格。当按原样运行示例时,selenium-hub和selenium-nodes可以成功连接。但是,当尝试将selenium-hub-rc.yaml
和selenium-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
会修复问题。如果有人能在评论中澄清,我将不胜感激。