昨天我們提到了如何存取容器的服務,在(容器運行的)邊緣節點上存取。但如果所有的服務都只有運行容器的節點自己可以存取的話,使用上會有很大的限制。所以今天來說明一種方法讓其他節點也能存取到不同節點的服務。
在YAML檔中有關容器port的設定我比較常用到兩個,一個是昨天講的containerPort,一個是今天要用的hostPort。containerPort負責將容器服務port對應出來,hostPort負責將對應出來的port再對應到節點的port上。
# 在24行處新增 hostPort:80
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
labels:
app: nginx-deploy
spec:
replicas: 1
selector:
matchLabels:
app: nginx-deploy
template:
metadata:
labels:
app: nginx-deploy
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
hostPort: 80
nodeSelector:
name: edge
# apply
kubectl apply -f nginx-deploy.yaml
從上面的結果可以發現,我們可以在同一網域的其他節點上透過運行容器的節點IP對應的實體機port進行存取。
當然一樣能夠從運行容器的邊緣節點上直接存取服務,像昨天的方法:
此外也可以利用這種方式更改對應出來的port,意思是實體機對應出來的port可以跟container對應出來的port不同,像是下面這樣:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
labels:
app: nginx-deploy
spec:
replicas: 1
selector:
matchLabels:
app: nginx-deploy
template:
metadata:
labels:
app: nginx-deploy
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
hostPort: 30001
nodeSelector:
name: edge
將hostPort改成30001。
重新apply後改成透過curl 192.168.0.9:30001存取,仍然是可以使用的。
同樣的在邊緣節點上直接存取服務:
仍然是透過container-ip的80 port存取,因為我們只有修改實體機對應出來的port並沒有修改container對應出來的port。
小結一下昨天跟今天兩種port設定的影響。簡單來說如果只有給定container port的話,想要存取服務只能在邊緣節點上透過docker分配的容器IP以及container port進行存取;而今天使用的設定方式,透過給定Host port的方式,讓容器服務能被叢集外的使用者存取,但缺點就是一個節點的對外port有限,同一個port無法讓多個容器共享。