kube 服务域名不起作用,但 clusterIP 可以与 Jupyter Enterprise Gateway 配合使用

use*_*040 5 kubernetes jupyter jupyter-notebook jupyter-kernel

jupyter我在kubernetes 集群的命名空间中设置了 Jupyter 笔记本,并enterprise-gateway在同一集群中的命名空间中设置了 Jupyter Enterprise Gateway 作为服务。

如果我将笔记本配置为enterprise-gateway使用 clusterIP 连接到服务,则它可以正常工作。

--gateway-url=http://172.20.186.249:8888
Run Code Online (Sandbox Code Playgroud)

但如果我切换到使用服务域名,笔记本电脑会收到 503 Connection Refused 错误

--gateway-url=http://enterprise-gateway.enterprise-gateway.svc.cluster.local:8888
Run Code Online (Sandbox Code Playgroud)

当我使用 busybox check 检查 kubernetes dns 时,域按预期解析。

kubectl -n default exec -ti busybox nslookup enterprise-gateway.enterprise-gateway
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Server:    172.20.0.10
Address 1: 172.20.0.10 kube-dns.kube-system.svc.cluster.local

Name:      enterprise-gateway.enterprise-gateway
Address 1: 172.20.186.249 enterprise-gateway.enterprise-gateway.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

如何让域名发挥作用?

JEG 的服务配置如下所示......

kubectl describe svc enterprise-gateway --namespace enterprise-gateway
Name:                     enterprise-gateway
Namespace:                enterprise-gateway
Labels:                   app=enterprise-gateway
                          app.kubernetes.io/managed-by=Helm
                          chart=enterprise-gateway-2.6.0
                          component=enterprise-gateway
                          heritage=Helm
                          release=enterprise-gateway
Annotations:              meta.helm.sh/release-name: enterprise-gateway
                          meta.helm.sh/release-namespace: enterprise-gateway
Selector:                 app=enterprise-gateway
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       172.20.250.15
IPs:                      172.20.250.15
Port:                     http  8888/TCP
TargetPort:               8888/TCP
NodePort:                 http  31366/TCP
Endpoints:                10.1.16.136:8888,10.1.2.228:8888,10.1.30.90:8888
Port:                     response  8877/TCP
TargetPort:               8877/TCP
NodePort:                 response  31201/TCP
Endpoints:                10.1.16.136:8877,10.1.2.228:8877,10.1.30.90:8877
Session Affinity:         ClientIP
External Traffic Policy:  Cluster
Events:                   <none>
Run Code Online (Sandbox Code Playgroud)

jmv*_*tor 0

好吧,我不知道从哪里开始,我有很多发现。我将从引人注目的一个开始,我有一个工作测试项目,我可以稍后分享,如果需要,我必须在这个答案中详细说明。

步骤1

1- 我发现您的 IP 不匹配。DNS 查找未将服务 DNS 解析为正确的 IP。地址 1:172.20.186.249 与 IP:172.20.250.15 不同

调试 DNS:

  1. kubectl exec“YOURPODNAME”cat /etc/resolv.conf

  2. 验证搜索路径和名称服务器是否设置正确

    名称服务器 10.96.0.10 搜索 default.svc.cluster.local svc.cluster.local cluster.local 选项 ndots:5

  3. 检查 kubedns/coredns pod 是否正在运行

    kubectl get pods --namespace=kube-system 名称就绪状态重新启动年龄 .... kube-dns-86f4d74b45-2qkfd 3/3 运行 232 133d kube-proxy-b2frq 1/1 运行 0 15m ...

如果 Pod 正在运行,则全局 DNS 服务可能出现问题

kubectl get svc --namespace=kube-system
NAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE kube-dns ClusterIP   10.96.0.10       <none>   53/UDP,53/TCP
Run Code Online (Sandbox Code Playgroud)

您可能还需要检查 DNS 端点是否公开:

kubectl get ep kube-dns --namespace=kube-system
NAME       ENDPOINTS                     AGE
kube-dns   172.17.0.5:53,172.17.0.5:53   133d
Run Code Online (Sandbox Code Playgroud)

这些调试操作通常会表明您的 DNS 配置存在问题,或者只会显示您应该在集群配置中启用 DNS 插件。

第2步

使用 busybox 检查 kubernetes dns 时,查看地址 1 时这似乎不正确:172.20.186.249 我希望获得 IP 10.XXX 在 pod 上安装 dnsutils,如下所示

  1. kubectl exec --stdin --tty "YOURPODNAME" -- apt update && sudo apt-get -y install dnsutils

  2. kubectl exec -it "YOURPODNAME" -- /bin/bash

  3. 在 Pod 内再次(奇怪)运行 apt-get install dnsutils

  4. 留在 Pod 内并运行 nslookup“YOURSERVICENAME”,您将获得 IP 和名称 (DNS)。 检查此 IP,因为它需要与服务描述的 IP 匹配。

  5. kubectl描述svc“YOURSERVICENAME”,IP应与#4相同

  6. 你必须看到的:

IP匹配、DNS解析

步骤3

  1. 解决第 2 步后,您将能够使用第 2 步第 4 项中返回的服务名称 (FQDN)

待续...