由於Pod和Service是kubernetes集羣範圍內的虛擬概念,所以集羣外的客戶端系統無法通過Pod的IP地址或者Service的虛擬IP地址和虛擬端口號訪問到它們。爲了讓外部客戶端可以訪問這些服務,可以將Pod或Service的端口號映射到宿主機,以使得客戶端應用能夠通過物理機訪問容器應用。
將容器應用的端口號映射到物理機
(1) 通過設置容器級別的hostPort,將容器應用的端口號映射到物理機上:
apiVersion: v1
kind: Pod
metadata:
name: webapp
labels:
app: webapp
spec:
containers:
- name: webapp
image: tomcat
ports:
- containerPort: 8080
hostPort: 8081 # 通過物理機的IP地址和8081端口訪問Pod的tomcat服務
(2) 通過設置Pod級別的hostNetwork=true,改Pod中所有容器的端口號都將被直接映射到物理機上。設置hostNetwork=true時需要注意,在容器的ports定義部分如果不指定hostPort,則默認hostPort等於containerPort,如果制定了hostPort,則hostPort必須等於containerPort的值。
apiVersion: v1
kind: Pod
metadata:
name: webapp
labels:
app: webapp
spec:
hostNetwork: true
containers:
- name: webapp
image: tomcat
ports:
- containerPort: 8080 # 通過物理機的IP地址和8080端口訪問Pod的tomcat服務
將Service的端口號映射到物理機
(1) 通過設置nodePort映射到物理機,同時設置Service的類型爲NodePort:
apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
type: NodePort
ports:
- port: 8080 # service 所需的端口號
targetPort: 8080 # 後端pod的端口號
nodePort: 8081 # 與service端口號映射的物理節點的端口號,通過物理機的IP地址和8081端口訪問Pod的tomcat服務
selector:
app: webapp
(2) 通過設置LoadBalancer映射到雲服務商提供的LoadBalancer地址。這種方法僅用於在公有云服務提供商的雲平臺上設置Service的場景。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targerPort: 9376
nodePort: 30001
clusterIP: 10.0.171.239
loadBalancerIP: 78.11.24.19
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 146.148.47.155 # 雲服務商提供的負載均衡器的IP地址