Networking 将外部IP分配给Kubernetes服务
编辑:我的设置的全部目的是(如果可能)实现以下目标:Networking 将外部IP分配给Kubernetes服务,networking,kubernetes,kubeadm,Networking,Kubernetes,Kubeadm,编辑:我的设置的全部目的是(如果可能)实现以下目标: 我有多个k8s节点 当我联系一个IP地址(从我公司的网络),它应该被路由到我的一个容器/吊舱/服务/任何东西 我应该能够轻松设置该IP(如在我的service.yml定义中) 我正在运行一个小型Kubernetes集群(使用kubeadm构建),以评估是否可以将Docker(旧)Swarm设置移动到k8s。我绝对需要的功能是能够将IP分配给容器,就像我对MacVlan所做的那样 在我当前的docker设置中,我使用MacVlan将公司网络
- 我有多个k8s节点
- 当我联系一个IP地址(从我公司的网络),它应该被路由到我的一个容器/吊舱/服务/任何东西
- 我应该能够轻松设置该IP(如在我的service.yml定义中)
- 我必须使用服务
- 我不能使用LoadBalancer类型,因为它只适用于兼容的云提供商(如GCE或AWS)
- 我应该用
- 入口资源是某种反向代理吗
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
nodeSelector:
kubernetes.io/hostname: k8s-slave-3
---
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
externalIPs:
- A.B.C.D
我希望我的服务能够获得IP A.B.C.D(这是我公司的网络之一)。我的部署工作正常,因为我可以使用k8s集群的ClusterIP从k8s集群内部访问我的nginx容器
我错过了什么?或者至少,我在哪里可以找到关于我的网络流量的信息,以便查看是否有数据包到来
编辑:
$ kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.96.0.1 <none> 443/TCP 6d
nginx-service 10.102.64.83 A.B.C.D 80/TCP 23h
$kubectl获得svc
名称CLUSTER-IP EXTERNAL-IP端口年龄
kubernetes 10.96.0.1 443/TCP 6d
nginx服务10.102.64.83 A.B.C.D 80/TCP 23h
谢谢。您可以尝试kube Keepalive vip配置来路由流量 您可以尝试在服务的yaml文件中添加“type:NodePort”,然后您将拥有一个端口,可以通过web浏览器或从外部访问它。对我来说,这很有帮助 如果这只是为了测试,那么试试看
kubectl port-forward service/nginx-service 80:80
那你可以
curl http://localhost:80
只需包括附加选项
kubectl expose deployment hello-world --type=LoadBalancer --name=my-service --external-ip=1.1.1.1
我不知道这对您的特定情况是否有帮助,但我所做的(我在裸机集群上)是使用
LoadBalancer
并在您这样做时将loadBalancerIP
以及externalIPs
设置到我的服务器IP
之后,负载平衡器显示了正确的外部IP。一个可行的解决方案(不仅适用于测试,,尽管它也有缺点)是将Pod设置为映射主机网络,并将
主机网络
规范字段设置为true
这意味着您不需要服务来公开Pod,因为它始终可以通过单个端口(您在清单中指定的containerPort
)在主机上访问。在这种情况下,不需要保留DNS映射记录
这也意味着您只能在给定节点上运行此Pod的单个实例(谈论缺点…)。因此,它是对象的良好候选对象
如果Pod仍然需要访问/解析内部Kubernetes主机名,则需要将dnsPolicy
spec字段设置为ClusterFirstWithNoHostNet
。此设置将使您的pod能够访问K8S DNS服务
例如:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx
spec:
template:
metadata:
labels:
app: nginx-reverse-proxy
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
tolerations: # allow a Pod instance to run on Master - optional
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- image: nginx
name: nginx
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
编辑:多亏了你只需修补一个外部IP就可以了,我被放到这条轨道上 CMD:
$kubectl patch svc svc_name-p'{“spec”:{“externalIPs”:[“您的外部ip”]}'
例如:-
$kubectl patch svc kubernetes-p'{“spec”:{“externalIPs”:[“10.2.8.19”]}
首先运行以下命令:
kubectl get -n namespace services
上述命令将返回如下输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend NodePort 10.100.44.154 <none> 9400:3003/TCP 13h
frontend NodePort 10.107.53.39 <none> 3000:30017/TCP 13h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend NodePort 10.100.44.154 192.168.0.194 9400:3003/TCP 13h
frontend NodePort 10.107.53.39 192.168.0.194 3000:30017/TCP 13h
要将外部IP分配给前端服务,请运行此命令
kubectl patch svc frontend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'
现在获取命名空间服务以检查外部IPs分配:
kubectl get -n namespace services
我们得到如下输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend NodePort 10.100.44.154 <none> 9400:3003/TCP 13h
frontend NodePort 10.107.53.39 <none> 3000:30017/TCP 13h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend NodePort 10.100.44.154 192.168.0.194 9400:3003/TCP 13h
frontend NodePort 10.107.53.39 192.168.0.194 3000:30017/TCP 13h
干杯!!!Kubernetes外部IP现在已分配。您确定提到的外部IP路由到k8s群集节点吗?另外,当运行kubectl get service时,您会看到什么?您是否可以尝试不指定
type:ClusterIP
I addedkubectl get svc
output as EDIT。删除type:ClusterIP
不会更改任何内容,因为它是默认值。如何检查流量是否到达我的群集?在kube proxy
中,已为您的服务分配了外部IP。为什么不点击80端口的外部IP?我点击了,但它不工作。这就是重点。我的容器可以从集群内部访问,但不能从外部访问。这是我遇到的一个非常老的问题。但当时我无法使用LoadBalancer类型,因为它是一个裸机集群。另外,在本例中使用--external ip=1.1.1.1
并不是最好的主意,因为此ip地址现在是Cloudflare的公共DNS。我使用kubectl port forward--address 0.0.0.0 pod/6666:6666
将pod上的端口6666公开给外部世界curl http://:6666
工作正常,但如果我尝试在浏览器中访问相同的链接,则会出现无法访问此站点的错误。知道是什么导致了这个问题吗?@rakesh使用公共地址测试“端口转发”的最简单方法是,使用类似ngrok()的东西启动代理kubectl-port-forward-po/myapp 8080:3000
Start-ngrok-proxyngrok-htp 8080
ngrok将提供两个公共URL(http/https)将请求路由到您机器的8080端口这是我需要的,您能用示例扩展答案吗?