kubernetes學習記錄(3)——叢集外部訪問Pod或Service
學習閱讀的書籍為《kubernetes權威指南:從Docker到Kubernetes實踐全接觸》,書中有不少地方講的比較模糊,故在此做下學習過程中的梳理。
Pod和Service是Kubernetes叢集範圍內的虛擬概念。叢集外的客戶端系統無法通過Pod的IP地址或者Service的虛擬IP地址和虛擬埠號訪問到它們。
解決措施:
1.將容器應用的埠號對映到物理機上,包括兩種方式
通過設定容器級別的hostPort,將容器應用的埠號對映到物理機上。
建立Pod的yaml為:pod-hostport.yaml。需要注意,在yaml中不要使用tab,同時縮排會影響yaml中的資料結構,注意檢查縮排。
apiVersion: v1
kind: Pod
metadata:
name: webapp
labels:
app: webapp
spec:
containers:
- name: webapp
image: kubeguide/tomcat-app:v2
ports:
- containerPort: 8080
hostPort: 8081
需要注意!當指定hostPort之後,同一臺宿主機將無法啟動該容器的第2份副本。後面會有例子進行測試。
kubectl create -f pod-hostport.yaml
建立Pod時,需要下載基礎映象,推薦在nodes伺服器上先下載好基礎映象,或者搭建本地docker映象倉庫,速度會快很多。
kubectl get pods -o wide
可以看到webapp被分配到了192.168.121.139這臺node上。
curl 192.168.121.139:8081
使用curl訪問該IP地址上的8081埠,可以獲得返回值。
再建立pod-hostport-rc.yaml,對“當指定hostPort之後,同一臺宿主機將無法啟動該容器的第2份副本”這句話進行驗證。
apiVersion: v1
kind: ReplicationController
metadata:
name: hostporttest
labels:
app: hostporttest
spec:
replicas: 5
selector:
app: hostporttest
template:
metadata:
labels:
app: hostporttest
spec:
containers:
- name: hostporttest
image: kubeguide/tomcat-app:v2
ports:
- containerPort: 8080
hostPort: 8081
刪除上文建立的pod。建立RC,檢視pods的自動建立情況。
kubectl delete -f pod-hostport.yaml
kubectl create -f pod-hostport-rc.yaml
我的node伺服器一共有兩臺,IP地址分別為192.168.121.139和192.168.121.140。從上圖可以看出,RC本來需要自動建立5個pod,但由於pod設定hostPort,所以每臺node只能建立該容器的一個副本,最終只建立了2個Pod。
執行指令,檢視處於Pending狀態的Pod,以hostporttest-0krbs為例。
kubectl describe pod hostporttest-0krbs
可以看見,由於所有nodes都已建立了該容器的副本,所以該Pod沒有可供分配的nodes。
設定Pod級別的hostNetwork=true。
該Pod中所有容器的埠號都將直接被對映到物理機上。如果容器的ports定義部分如果不指定hostPort,則預設hostPort等於containerPort。否則,指定的hostPort必須等於containerPort的值。
在此,直接編寫pod-hostnetwork-rc.yaml,驗證同一臺宿主機上能否建立多個該pod。
apiVersion: v1
kind: ReplicationController
metadata:
name: hostnetwork
labels:
app: hostnetwork
spec:
replicas: 5
selector:
app: hostnetwork
template:
metadata:
labels:
app: hostnetwork
spec:
hostNetwork: true
containers:
- name: hostnetwork
image: kubeguide/tomcat-app:v2
ports:
- containerPort: 8080
kubectl create -f pod-hostnetwork-rc.yaml
結果顯示每臺宿主機仍是隻能建立一個該pod。
2.將Service的埠號對映到物理機上,包括兩種方式
通過設定nodePort對映到物理機,同時設定Service的型別為NodePort。
建立webapp-svc-nodeport.yaml。
apiVersion: v1
kind: Service
metadata:
name: hostnetwork
labels:
app: hostnetwork
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 30003
selector:
app: hostnetwork
kubectl create -f webapp-svc-nodeport.yaml
curl 192.168.121.139:30003
可以獲得返回結果。
通過設定LoadBalancer對映到雲服務商提供的LoadBalancer地址。
這種用法僅用在公有云服務提供商的雲平臺上設定Service的場景。