1. 程式人生 > >kubernetes學習記錄(3)——叢集外部訪問Pod或Service

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的場景。