0

我正在使用来自 docker for windows 的 kubernetes,但遇到了问题。我将 statefulset 与以下配置部分一起使用:

    spec:
      terminationGracePeriodSeconds: 300
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet

在经典的 kubernetes 中,该规范公开了节点 ip 上的 pod 的所有端口,因此可以通过它访问所有这些端口。我正在尝试从 docker for windows 在 kubernetes 上开发它,但似乎我无法通过它的 ip 访问节点(如在 minikube 或 microk8s 中),但 docker for windows 将 localhost 映射到集群。所以这里有一个问题:这个配置暴露了节点 ip 上的所有端口,例如 192.168.65.4,但我不能从 windows 访问它 - 我只能通过 localhost 访问集群,但它只暴露协议相关端口,例如 443 . 所以当我的服务在端口 10433 上运行时,无法从 localhost:10433 访问,但通常也无法通过节点 ip 访问。有什么方法可以将其配置为所有端口都暴露的经典 kubernetes?我知道可以通过NodePort暴露单个端口,

4

1 回答 1

2

一般来说,Docker 主机网络在非 Linux 平台上不起作用。它被接受为有效的 Docker 选项,但“主机”网络实际上并不是物理系统的网络。这可能也适用于 Docker Desktop 中嵌入的 Kubernetes 设置。

需要主机网络应该很少见,在 Kubernetes 中更不寻常。主机网络禁用了正常的容器间通信机制。尤其是 Kubernetes,网络环境复杂,节点通常不止一个;像这样选择退出网络设置可能会使您几乎无法从集群内部或外部访问您的服务。

您应该使用正常的 Kubernetes 网络设置,而不是主机网络。您创建的几乎每个 Deployment 都需要一个匹配的Service,如果您将该 Service 设置为 have ,type: nodePort那么它将可以从集群外部访问(尝试分配的nodePort:编号和服务的 cluster-internal port:;目前尚不清楚Docker Desktop 实际上是哪个端口使用)。

出于某些目的,最简单的方法是为服务设置本地端口转发

kubectl port-forward deployment/some-deployment 8888:3000

将设置从本地系统上的端口 8888 到由命名部署管理的某个 pod 上的端口 3000 的端口转发。这将转发到单个pod(如果您有多个副本,它只针对其中一个),它比直接连接慢,并且端口转发偶尔会失败,但这对于数据库迁移等维护任务来说已经足够了。

模仿真正的 Kubernetes 行为

在我正常工作的环境中,每个集群都有几十到几百个节点。无法从集群外部直接访问节点。将 PodSecurityPolicy 配置为禁止主机网络也是相当常见的,因为它可以被视为安全问题。

于 2021-09-13T10:29:40.427 回答