问题
客户端在外部访问容器怎么实现呢?
1.HostPort/HostNetwork
通过宿主机的iptables给每个容器设置映射访问,如容器里面的80端口映射到宿主机的8080端口,缺点是:当你的容器非常多,而且每个容器都有服务要对外映射的时候,你会写很多iptables,不易于维护,致命点是宿主机挂掉了,而你没做冗余,那么你的服务就下线了
2.NodePort
这个是基于老版k8s的基础上做的,提供了一个service服务,即给你的容器做浮动IP<VIP>,不使用docker自带的网络,自己设置子网,在docker集群内部,通过该VIP就可以访问到你的服务;在对外提供服务的时候,只需要将该VIP与宿主机映射端口即可,缺点:需要在每一台宿主机上都写上一样的iptables
oc edit svc myapp
spec:
clusterIP: 172.30.207.79
ports:
- name: 8080-tcp
port: 8080
protocol: TCP
targetPort: 8080
nodePort: 30800 #端口范围:30000-32767
selector:
app: hello
deploymentconfig: myapp
sessionAffinity: None
type: NodePort
通过上述配置后,既可通过访问集群任意一台宿主机的30800端口去获取服务
3.Openshift Routes
这种方式是Openshift首选的方式,这种方式将service与一个全局唯一的域名绑定,使用oc expose命令实现,Router使用的是Haproxy容器。缺点:只能支持http协议,这一点是红帽设计初衷的时候决定,他们觉得容器对外只提供web访问就好了,其他的容器内部自己实现交互
oc expose svc myapp
oc get svc myapp
通过上述命令,客户端可以通过访问域名的方式获取服务