在 play-with-k8s https://labs.play-with-k8s.com/ 搭建了一个k8s集群,部署了一个service
apiVersion: v1kind: Servicemetadata: name: my-nginx-svc labels: app: nginxspec: type: LoadBalancer ports: - port: 80 selector: app: nginx---apiVersion: apps/v1kind: Deploymentmetadata: name: my-nginx labels: app: nginxspec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
每一个pod中都有一个nginx容器,我手动进入到了每一个nginx容器中 修改index.htmll 为1111,22,333.
问题: service 是loadbalancer类型,且没有外部ip 我该如何 通过service 访问 到后端三个nginx容器, 从而看到负载均衡的情况。
尝试的方案:
1.因为没有外部ip,所以无法通过外部ip访问service,只能通过内部ip
所以我进入到了 其中的一个 nginx容器,然后执行 curl http://service-clusterip:80 端口访问,但是nginx容器中 没有curl命令, 也没有 ping 等等命令。
然后我使用你 apt install curl 安装curl,提示 无法解析域名 http://deb.debian.org/debian
然后我又修改 nginx容器的 /etc/apt/sources.list 改为 阿里源,清华源都不行,都是无法解析域名。 感觉好像是 容器被限制了无法访问到外部互联网。 但是在node节点上是可以访问百度、阿里等外部网络的。
如果你指明了必须要用loadbalancer类型的service,也是有解决方案的。
k8s默认是没有给 裸机 环境使用的负载均衡器的,默认能用的大概只有 nodeport 类型的service能实现从外部访问服务(nodeport也是可以支持负载均衡的)。
你可以试试 MetalLB 这个负载均衡器实现,部署了之后,能给locadbalance类型的service分配一个和node同内网IP,可以在局域网中访问。(这也是我自己在用的一个方案,还是挺好用的)
突然发现你用的好像是在云上的模拟环境,如果在模拟的环境中,那么大概率是服务商限制了外网访问,访问不通镜像站是正常的。
另外容器pod内DNS异常,这个大概率也和service的IP没关系。
1、要想访问nginx服务,可以新建一个类型为nodePort的service服务,或者将原来的loadblance类型的服务改为nodePort类型,这样就可以通过节点的ip和端口访问到nginx,或者可以搭建MetalLB负载均衡器,也可以自动分配loadblance ip;
2、容器无法解析外部域名,可以查看coredns的配置,看看上游域名解析配的是什么,如下是我的codedns配置,圈红部分表示上游dns服务器继承节点的dns配置,所以我的pod可以通过节点配置的dns解析到外网的域名上,这里面还有个前提就是pod能够访问外网。
在 Kubernetes 集群中,如果你有一个 LoadBalancer 类型的 Service,但是没有外部 IP 地址,那么你不能直接从外部网络访问这个 Service。不过,你仍然可以在集群内部访问它。
在你的情况下,由于你无法从 Nginx 容器的内部直接访问外部网络(可能是因为网络策略或其他安全限制),你可以尝试以下步骤来在集群内部访问 LoadBalancer 类型的 Service:
curl
命令来访问 my-nginx-svc:80
。curl
。然后,你可以从这个新 Pod 中访问 my-nginx-svc:80
来观察负载均衡的行为。例如,你可以创建一个带有 curl
的简单 Pod,如下所示:
apiVersion: v1kind: Podmetadata: name: curl-testspec: containers: - name: curl image: radial/busyboxplus:curl command: ["sh"] args: ["-c", "while true; do curl -s my-nginx-svc:80; sleep 1; done"]
这个 Pod 会持续地向 my-nginx-svc
发送 HTTP 请求,并打印响应。由于 LoadBalancer 类型的 Service 在集群内部表现为一个 ClusterIP,因此这个 Pod 应该能够访问它,即使 Service 没有外部 IP 地址。
请注意,LoadBalancer 类型的 Service 在没有云提供商支持的环境中(例如,在 minikube 或 kind 等本地环境中)可能不会分配外部 IP 地址。在这种情况下,你需要依赖 ClusterIP 或其他类型的 Service(如 NodePort)来从外部访问你的应用。
我有几个AWS EC2实例,并在它们上部署了一个Rancher实例。在Rancher上,我使用Kubernetes部署了一个网站,它使用Istio部署来处理网络,我可以通过登录。我还使用AWS路由53来使URL工作,并使用nginx来实现跨EC2实例的负载平衡。 但是我希望能够只使用登录,因此删除端口。我有办法做到这一点吗? 编辑:我在31380上访问它,因为它被设置为使用NodePort(htt
当我在一台docker主机上为同一个web映像启动两个docker容器时。 两个docker容器在同一端口监听 两个集装箱的端口映射到docker主机的不同端口:, 要从docker主机外部访问两个容器,需要通过访问docker主机ip和端口或 是否有一种解决方案可以通过ip和端口从docker主机外部访问docker容器,,而无需端口映射? 不同dock主机上的所有docker容器都可以直接相互
我在项目中定义了一个模型类。和往常一样,它有一些私有变量和公共的获取者和设置者 假设在其他类中我使用这个模型,就像 然后person的私有变量保存值“my name”,我使用类的public getter访问变量,如 所以据我所知的人。getMark()返回私有变量名的引用,因此如果我修改局部变量“localMark”,它将影响Person类的私有变量,因此它会破坏变量的私有属性 前任: 我猜大多
问题内容: 我想在Python中实现自定义列表类作为的子类。为了获得所有列表操作的完全类型兼容性,我需要从基类中重写的最少方法集是什么? 这个问题表明至少需要重写。从进一步的研究,也和是必需的。所以我有这段代码: 下列语句即使没有覆盖方法也可以按需工作: 这些语句仅与上述类定义中的覆盖方法一起使用: 我唯一不知道如何实现的是使扩展切片返回正确的类型: 我需要在类定义中添加些什么才能获得类型? 另外
问题内容: 我试图将配置(例如URLs / etc)放入资源文件夹中,以供实用程序类使用。但是,我不想从任何地方的活动中传递上下文。我希望能够通过路径名(似乎使用assess /是为此用途设计的)来访问资源,而无需使用上下文来访问资源。 在这种特殊情况下,我希望单例实例化时在配置中使用某些东西。除了实例化期间的那一次之外,它不需要任何资源。因此,每次调用getInstance()时都必须传递Con