连接到与Kubernetes集群在同一主机上运行的服务的干净方式



我有一个单节点Kubernetes集群,在裸机上使用k3s安装。我还在Kubernetes集群之外的主机上运行了一些服务。目前我使用机器的外部IP地址(192.168.200.4)从Kubernetes网络内部连接到这些服务。

有更干净的方法吗?我想避免的是,如果我决定改变主机的IP地址,就必须重新配置我的Kubernetes pod。

可能存在的魔法I: Kubernetes服务或IP,自动指向我的外部IP(192.168.200.4)或指向节点外部IP地址的DNS名称。

这就是ExternalName服务的作用(https://kubernetes.io/docs/concepts/services-networking/service/#externalname):

apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: ${my-hostname}
ports:
- port: 80

那么你就可以从kubernetes内部作为my-service.${namespace}.svc.cluster.local访问服务。

见:https://livebook.manning.com/concept/kubernetes/external-service

服务创建完成后,pod可以连接到外部服务通过external-service.default.svc.cluster.local域名(或甚至是外部服务),而不是使用服务的实际FQDN。这对pod隐藏了实际的服务名称及其位置使用服务,允许您修改服务定义并在以后的任何时间将其指向不同的服务,只需更改即可externalName属性或将类型更改回ClusterIP并为服务创建端点对象(手动或通过)在服务上指定标签选择器并创建它自动.

ExternalName服务仅在DNS级别实现-很简单CNAME为服务创建DNS记录。因此,客户连接到服务将连接到外部服务直接,完全绕过服务代理。出于这个原因,这些类型的服务甚至没有集群IP。

这依赖于使用机器的可解析主机名。在minikube上有一个DNS别名host.minikube.internal,它被设置为解析到路由到主机的IP地址,我不知道k3s是否支持类似的东西。

谢谢@GeertPt,

考虑到minikube的host.minikube.internal,我搜索了一下,发现CoreDNS对它运行的每个主机都有一个DNS条目。这似乎只适用于K3S。

检查

kubectl -n kube-system get configmap coredns -o yaml

显示有以下条目:

NodeHosts: |
192.168.200.4 my-hostname

如果主机名不变,我可以用这个代替IP。

另外,如果您正在运行普通docker,您可以使用host.docker.internal访问主机。

总结一下:

  • from minikube:host.minikube.internal
  • from docker:host.docker.internal
  • from k3s:<hostname>

相关内容

  • 没有找到相关文章