我有一个单节点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>