k8s 中向外界提供服务的几种方法port-forward
、NodePort
,以及 更加常用的提供服务的资源ingress。
1 kubectl port-forward service/redis 6379:6379 现在k8s中有一个pod运行在6379,本机访问映射到6379上,它可以针对部署,服务,pod类型,效果相同
启用后会占用当前终端的标准输出,可以在后面添加&
来指定后台运行:
kubectl port-forward service/redis 6379:6379 &
如图在前台运行情况:它会监听虚拟机的127.0.0.1的6379端口转发到port中去从而能访问资源,但没有NodePoint使用的多
更改收听地址:
Kubectl 默认绑定127.0.0.1(IPv4) 和::1(IPv6) 地址上的本地端口。您可以通过在运行命令–address时提供标志来指定自己的 IP 集:port-forward2 NodePort 映射服务到节点端口。
kubectl port-forward deployment/mysql :3306 --address 127.0.0.1,192.168.0.1
该标志只接受 IP 地址和localhost关键字。后者被解释为包含127.0.0.1and ,当省略::1时匹配命令的默认值。–address、port-forward
可以将 pod 临时映射出来,一般用于测试资源是否可用,在生产环境并不会大规模应用。
2 服务非代理模式NodePort
相对于上一种port-forward
来说,这一种要正式的多,NodePort
可以将其 转发到所有 k8s 节点的指定端口上,并且不会像port-forward
一样在前台运行。
kubectl create deployment redis --image=redis 创建一个部署
kubectl expose deployment redis --type=NodePort --port=6379 暴露一个服务,并且它能实现负载均衡根据集群ip访问不同主机下的指定端口,可以查看服务详情minikube service 加服务名如
,其中url中的ip是pod所在的上层虚拟环境ip地址,虚拟机可以根据这个虚拟ip环境中的port进行资源访问,问题?现在虚拟机加pod所在的虚拟ip才能访问,现在我想虚拟机直接访问下层的虚拟ip的环境,这就用到上面的第一个,使用kubelctl将本地ip和pod资源直接绑定,假设虚拟机环境ip为192.168.56.2,kubectl在该环境下,连接的其他环境的pod,环境ip地址是192.168.67.2,现在使用nodepoint的映射单口加ip直接就能访问,要kubectl访问它所连接到的远程资源,就把它当成代理,监听本地请求然后转发响应,方式如上默认监听是127.0.01的地址如果ip想对外使用可以监听多个,如下:kubectl port-forward service/redis 6379:6379 --address 127.0.0.1,192.168.56.1
kubectl port-forward --address 0.0.0.0 service/redis 6379:6379 使更多虚拟机的ip地址,只要物理机对虚拟机ip能ping通就能访问到目标,前提是虚拟机的防火墙要关闭,本人之前就是没关闭物理机无法访问。systemctl status/stop firewalld 它是centos7以后的默认防火墙。
由于防火墙会被用来实现k8s的网络代理服务如kube-peoxy中就是以防火前模块实现所以这里关闭防火墙可以让物理机访问到虚拟机和minikube中的pod,当如果关闭防火墙就意味着minikube环境失去了对虚拟宿主机的依赖,就无法使用网络,更不可能拉取镜像。
这样你在虚拟机中就可以telnet +ip+端口 物理机也能访问该虚拟机
但是这里有个问题,假如我的 k8s 里运行了多个 web 应用服务器,我总不能让用户通过端口号http://domain:8081
、http://domain:8082
来访问不同的 web 服务吧。能不能处理成http://domain/web1
、http://domain/web2
...这种形式呢?当然可以,这个就是接下来要说的Ingress
。
4 使用ssh连接,密钥对或者使用密码连接,直接访问目标服务
minikube dashboard开启了之后生成有一个虚拟机的可访问地址,如果不使用代理通过物理机ssh -f -N -L 35967:localhost:35967 vagrant@虚拟ip,输入密码会在前台阻塞运行,此时就能访问,它也不能能绕过防火墙,因为它需要kubectl在虚拟机暴露的端口,但也可以物理机直接连接minikube虚拟机来绕过防火墙直接访问docker中的服务,不需要绕来绕去,转来转去。
另外一种不适用默认生成的,查看服务的运行端口通过
kubectl get service kubernetes-dashboard -n kubernetes-dashboa
服务运行在80端口上,内部容器运行在9090端口上可以查看pod的详细信息
kubectl get describe pod -n kubernetes-dashboard kubernetes-dashboard-695b
有了这些信息可以通过代理直接让过给的访问地址,物理机通过虚拟机ip地址直接访问,这本质上和生成的url是一样的道理,只是在鉴定和绑定的ip范围变大了,更有利于外部访问,如果使用ssh来与连接到的主机建立一对一请求还需要外部物理机定义,而且物理机访问的路径不定可以多个ip。当使用转发时物理机会创建一个端口号来监听物理的请求路径,然后转发到虚拟机
虚拟机杀死进程后物理机也删除端口的占用。
防火墙开启路由转发:
#临时开启
[root@snat zones]# echo 1 > /proc/sys/net/ipv4/ip_forward#永久开启
[root@snat zones]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@snat zones]# sysctl -p
firewalld防火墙开启masquerade, 实现地址转换
设置默认区域的SNAT的IP伪装
[root@snat zones]# firewall-cmd --add-masquerade --permanent
[root@snat zones]# firewall-cmd --reload
#################################下面部分不用执行#################################
查看默认区域的SNAT是否允许
[root@snat zones]# firewall-cmd --query-masquerade --permanent删除默认区域的SNAT功能
[root@snat zones]# firewall-cmd --remove-masquerade --permanent
3 通过 Ingress 暴露服务:nblogs.com/gaoyanbing/p/14031522✌
4 扩展 :端口状态 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT详解,以及三次握手,滑动窗口_established状态-CSDN博客
《Linux运维总结:firewalld防火墙使用教程》_firewalld教程-CSDN博客