問題
客戶端在外部訪問容器怎么實現(xiàn)呢?
1.HostPort/HostNetwork
通過宿主機的iptables給每個容器設(shè)置映射訪問,如容器里面的80端口映射到宿主機的8080端口,缺點是:當(dāng)你的容器非常多,而且每個容器都有服務(wù)要對外映射的時候,你會寫很多iptables,不易于維護,致命點是宿主機掛掉了,而你沒做冗余,那么你的服務(wù)就下線了
2.NodePort
這個是基于老版k8s的基礎(chǔ)上做的,提供了一個service服務(wù),即給你的容器做浮動IP<VIP>,不使用docker自帶的網(wǎng)絡(luò),自己設(shè)置子網(wǎng),在docker集群內(nèi)部,通過該VIP就可以訪問到你的服務(wù);在對外提供服務(wù)的時候,只需要將該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端口去獲取服務(wù)
3.Openshift Routes
這種方式是Openshift首選的方式,這種方式將service與一個全局唯一的域名綁定,使用oc expose命令實現(xiàn),Router使用的是Haproxy容器。缺點:只能支持http協(xié)議,這一點是紅帽設(shè)計初衷的時候決定,他們覺得容器對外只提供web訪問就好了,其他的容器內(nèi)部自己實現(xiàn)交互
oc expose svc myapp
oc get svc myapp
通過上述命令,客戶端可以通過訪問域名的方式獲取服務(wù)