iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
0
DevOps

從開源雲到邊緣運算系列 第 19

[Day 19]K3s 部署 - Pod 與 Service 功能校驗

  • 分享至 

  • xImage
  •  

上篇介紹了 k3s基礎指令Pod派送指令的功能實戰體驗,各位是否對於整體 k3s 環境更加熟悉了呢?,本篇我們再來實戰一下 k3s 的 Pod 與 Service 的功能串接,確認一下 k3s 與 kubernetes 是復否有設計落差,並從未使用過 Service 功能的同學們的角度切入,教學一下 Service 的功能方案與實際訴求,透過從 Pod建構實作Service方案 的方式,校驗目前的 k3s 在 Service 上的功能。

Service 方案簡介

參考網址:https://kubernetes.io/docs/concepts/services-networking/service/

Service 功能的方案具有Cluster IPNode Port為主要使用方案,其訴求為將服務進行導向,在服務連線時將連線,提供一個對外埠號或是內部虛擬IP提供存取,當後端導向的服務 Pod 服務異常時,等待叢集將服務 Pod 重新啟動進行導向,或是再透過 ReplicaSet(後續介紹)的多重副本機制,將連線導向到另一個已正常運行該服務的 Pod 之上,藉以達成零時差的服務維護。

cluster IP

cluster IP 方案為內部 IP Mapping 方案,透過指定 Pod Label 的方式,將網路連線導向到具有指定的 Pod 標籤的叢集Pod Network 的 IP之上,並對於該轉換服務入口分配一個叢集連線的虛擬IP,在叢集中所有的 Pod 皆可向同一個 Service 轉換服務的入口 IP 取得該服務鏈結,此方案僅使用於叢集內部 Pod 連線使用,為其他相依服務提供一個可存取的虛擬IP對該服務進行使用。

Node Port

Node Port 方案為提供給外部服務使用的埠號進行暴露,一樣是透過指定 Pod Label 的方式,將網路連線導向到具有指定的 Pod 標籤的叢集Pod Network 的 IP之上,但是 Node Port 方案是以 Port 轉發機制 執行,並將服務埠號進行類似於 port Forwording 的功能協助轉換,對於叢集內部服務埠號進行分配並提供轉換導向服務,對外分配出一個 30000 埠以上的埠號(port),提供叢集之外的服務與使用者進行存取,將外部網路所導向的叢集對外埠號(port)轉換成內部的服務埠號(port),藉以完成服務連線的功能。


Service 實作

cluster 方案

Pod 設計

  • Pod 描述檔案內容
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - image: nginx:latest
    name: nginx
  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071AbW38kr5Bt.png

Pod 派送

  • Pod 派送指令
k3s kubectl create -f ${pod-file}
  • Pod 派送驗證指令
k3s kubectl get pod -o wide
  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071b5iUN6GSrf.png

Service 設計

  • Service 描述檔案內容

spec.type 個欄位如果沒有填,預設使用 clusterIP 方案
spec.selector 為針對Pod標籤(參考一下Pod描述檔label)選擇的功能
spec.ports.port 為叢集內部開放連線埠號 (給予內部Pod連線使用的埠號)
spec.ports.targetPort 為Pod的佔用埠號 (nginx => 80)

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 3000
    targetPort: 80
  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071mzUSkgjxRp.png

Service 派送

  • Service 派送指令
k3s kubectl create -f ${service-file}
  • Service 派送驗證指令

叢集內部會 Assign 一個**虛擬 IP (10.43.199.231)指向 Label 為 app=nginx 的 Pod
內部 Pod 則需要對該
虛擬IP (10.43.199.231)**請求連線,逕而在叢集內部使用 Nginx 服務

k3s kubectl get svc -o wide
  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071pKlQyEAhCI.png

Service 驗證

輔助 Pod 設計

  • Service 描述檔案內容
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-pod
spec:
  containers:
  - name: ubuntu
    image: ubuntu:19.04
    args: [bash, -c, 'for ((i = 0; ; i++)); do echo "$i: $(date)"; sleep 100; done']
  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071oiecNeR5EH.png

輔助 Pod 派送

  • Pod 派送指令
k3s kubectl create -f ${pod-file}
  • Pod 派送驗證指令
k3s kubectl get pod -o wide

https://ithelp.ithome.com.tw/upload/images/20191005/20121071NGDj5685Jv.png

輔助 Pod 登入驗證

  • Server 端登入
k3s kubectl exec -ti ${pod-name} bash
  • Agent 端登入
k3s crictl exec -ti ${pod-name} bash
  • 驗證 Service 指令
curl ${cluster-ip}:${port}
  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071S9m2DxVJsJ.png

Node Port 方案

Pod 設計

  • Pod 描述檔案內容
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - image: nginx:latest
    name: nginx

https://ithelp.ithome.com.tw/upload/images/20191005/2012107146Gm7nBvcP.png

Pod 派送

  • Pod 派送指令
k3s kubectl create -f ${pod-file}
  • Pod 派送驗證指令

叢集內部會 Assign 一個對外暴露的 port (32262) 指向 Pod Label 為 app=nginx 的 Pod
外部連線會透過 **暴露埠號(32262)**轉發到 Nginx Pod 上的服務埠號(80)

k3s kubectl get pod -o wide
  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071AuhiYhKSHO.png

Service 設計

  • Service 描述檔案內容

spec.type 為設定 Service 方案
spec.selector 為針對Pod標籤(參考一下Pod描述檔label)選擇的功能
spec.ports.portocol 為叢集內部開放連線方式 (給予內部Pod連線使用的埠號)
spec.ports.port 為叢集內部開放連線埠號 (給予內部Pod連線使用的埠號)

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 80
  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071NCFleo50gd.png

Service 派送

  • Service 派送指令
k3s kubectl create -f ${service-file}
  • Service 派送驗證指令
k3s kubectl get svc -o wide
  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071rKzyhMjOgE.png

Service 驗證

  • 找一個叢集內的節點連線 IP ,協助後續測試服務連線使用
ifconfig ${network-interface-name}
  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071xyCDFRySTN.png

curl 測試

  • 驗證 Service 指令

cluster-node-ip 為叢集中任意節點IP

curl ${cluster-node-ip}:${assign-port}
  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071CoP0b5nd44.png

browser 驗證

  • 執行結果
    https://ithelp.ithome.com.tw/upload/images/20191005/20121071vthLAV2x4v.png

今天實作了一下 Service 的基礎功能,並給予想要直接從k3s起步搞輕量化叢集的捧油一個 Service 的簡介與測試方案,相信經過一連串的 Service 測試,對於 k3s 的 Service 架構應該有個底了,基本上就是與 kubernetes 的功能設計相同,有興趣的可以往 Load Balance / High Ability 切下去,Service 簡介目前就到這邊做個了結,後續幾篇將以 Deployment 為主軸實作 ReplicaSetRollingUpdateAffinity 等功能前進。


上一篇
[Day 18]K3s 部署 - 基礎指令與派送測試
下一篇
[Day 20]K3s 部署 - Deployment 與 ReplicaSet 功能校驗
系列文
從開源雲到邊緣運算30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言