FuFu KK8s
  • K~K8s index
  • Kubernetes 的基礎世界
  • Why container is not Docker
  • Startup Local Kubernetes via Minikube
  • K8s Master node Component 介紹
  • NameSpace、Deployments 概念說明
  • 常見的 kubectl 指令
  • 回顧第一次部署,淺談 Pod、Deployment
  • 回顧第一次部署,淺談 Service
  • 今日來介紹 Pod 靜態文件~ Manifest
  • Pod 的健康檢查方式
  • Pod 的健康檢查方式 Part-2
  • Pod 的資源請求、上限
  • Pod 資料,如何持久化存放、讀取
  • Pod 副本管理~ 描述 ReplicaSet 控制器
  • Pod 副本管理~ 實作篇
  • 淺談 DaemonSet,及相對 ReplicaSet 的差異
  • 來說說 Label
  • 從 Label 再回頭談 Service
  • Service 續集之 Cluster IP、Kube-proxy、LoadBalancer
  • 從 Service 發現 K8s 網路層全貌
  • Container Data Persistent
  • 發現、初談 StatefulSet
  • 再談 StatefulSet
  • 認識 ConfigMap
  • 第一次使用 Play with Kubernetes
  • 手工 Installing kubeadm
  • 手工 Installing CRI-O、kubeadm init
  • 繼上篇,排查 kubelet、kubeadm init 問題
  • Installing a pod network add-on
  • K8s add Nodes(join)
  • 驗證自建的 K8s
  • 筆記
    • kubectl get 筆記
    • kubectl 部署筆記
    • kubectl describe nodes
  • 實務記憶篇
    • 整理下記憶
    • 有哪些 Kubernetes 雲端服務
    • 如何從本機連線至 GKE Pod
    • GCP Memorystore 服務介紹
    • 如何連線至 GCP Memorystore
    • GCP Cloud SQL 服務介紹
    • 如何連線至 Cloud SQL
    • 關於 GCP VPC 網路
    • HELM 工具用途
    • 臨時題目:查修 prometheus
    • 繼續離題:繼續查修Prometheus
    • 臨時題目:限定 Pod 訪問外網時,固定 public ip
    • K8s 監控數據來源 Prometheus
    • 監控要告警啊 AlertManager
    • 監控要有圖表啊 Grafana
    • Grafana收集Kubernetes系統資訊
    • 系統 Log 資料
    • 系統 Log 資料收集至 EFK
    • 關於 EFK 角色
    • 系統 Log 資料 - fluent-bit 串接
    • 開放網站對外存取
    • 網站提供 https 安全連線服務 - 憑證管理
    • 網站提供 https 安全連線服務 - 憑證與Ingress整合
    • 網站提供 https 安全連線服務 - Istio 範例
    • 需要額外的 非http 連線
    • Istio 初略介紹
    • Istio 整合 Certmanager DNS01
    • 番外篇:Istio 如何限制訪問來源
    • 番外篇:如何擴充 PV PVC storage size
    • 番外篇:如何利用 Binlog 還原資料庫
  • Helm 實務學習心得
    • Helm requirements 見解
    • 同環境,一次部署多個相同App
  • Python
    • 11-1 Firebase 資料庫簡介
Powered by GitBook
On this page
  • Cluster IP
  • Kube-proxy
  • kube-proxy 的不足
  • 關於 LoadBalancer

Service 續集之 Cluster IP、Kube-proxy、LoadBalancer

Previous從 Label 再回頭談 ServiceNext從 Service 發現 K8s 網路層全貌

Last updated 6 years ago

讀過了幾遍及翻了網路文章,才有這個開門見山的心得: cluster ip 是在建立 service 物件時由 K8s API 伺服器所分配。

Cluster IP

cluster ip 是虛擬靜態IP,當被分配 IP 後就不再異動,除非刪除、重建 service 物件時, 才會有所變動(重新分配)。 service cluster ip 實現了負載平衡功能,賦予流量傳送到 Endpoint 內對象 pod。

如不需要或不需負載平衡,無需此單獨的 Service IP。 可以經由指定 Cluster IP(spec.clusterIP)的值為 "None" 來創建 Headless Service。

# Headless Service 範例
apiVersion: v1
kind: Service
apiVersion: v1
metadata:
  name: hello-minikube
spec:
  clusterIP: None

上述 cluster ip 是 service type 之一,支援的型態如下:

  • ClusterIP << 此篇主軸

  • NodePort << 之前有提到。

  • LoadBalancer

  • ExternalName

Kube-proxy

實現 Service 這個抽象層功能(服務探索、負載平衡)的角色是 kube-proxy。

  • kube-proxy 會在每一個 K8s node 上運作,會透過 K8s API 監視叢集中的 service 物件與 Endpoint。

  • kube-proxy 會在 node 中藉由 iptables 模式撰寫規則,完成轉遞流量目的(負載平衡),service 越多則 iptables 規則也越多。

  • iptables 模式也因為流量封包會透過核心層 iptables 轉遞,故效能的損耗問題不得不關注。

  • iptables 模式是實現 Kube-proxy 方式之一,在 K8s v1.11 新版本之後新增支援 ipvs 模式。

  • ipvs 模式是為了解决 iptables 模式的性能問題,採用增量式更新 iptables 規則,並且可保證 service 更新期間連線不中斷。(以上次研讀網路資訊得來,自己未實測過)

kube-proxy 的不足

  • kube-proxy 目前只有支持 TCP 和 UDP,不支持 HTTP,並且也沒有健康檢查機制。

  • 這些得需透過另一個方式 Ingress Controller 來解決問題。

這一篇的研讀,讓我更加明瞭 Service 是怎麼一回事情,也很感謝下列官方、網友文章的解說,讓我有所學習與突破。

關於 LoadBalancer

LoadBalancer 此 service type 適用於雲端 Kubernetes 環境中,例如 GKE, 在 K8s service 部署於雲端環境中,如需暴露 service 供外界存取,即需用此。 設定方式,僅須將 type 指定為 LoadBalancer。

限制存取

另外,雖然需要暴露 service 供外部存取,但如僅需開放特定來源存取,可透過 loadBalancerSourceRanges參數指定來源 IP,即可限度性的開放服務。

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  type: LoadBalancer
  loadBalancerSourceRanges:
  - 1.2.3.4/32
  - 5.6.7.8/32

Kube-Proxy iptables 模式

參考書籍\文章出處: Kubernetes 建置與執行 書中 P.88-89 內容。 關於 LoadBalancer、loadBalancerSourceRanges

這篇文章
解說圖
https://kubernetes.io/docs/concepts/services-networking/service/
https://feisky.gitbooks.io/kubernetes/concepts/service.html
https://feisky.gitbooks.io/kubernetes/components/kube-proxy.html
https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/