Basic - Creating a Service
什麼是 Service
在 Kubernetes 中,Service 是一種抽象層,用來將一組 Pod 暴露給外界或內部系統進行訪問。它提供了一個穩定的 IP 地址和 DNS 名稱,讓客戶端應用程式能夠通過這些地址與 Pod 進行通信,而不必關心 Pod 的具體 IP 地址或生命周期。Service 有多種類型,可以根據需求選擇合適的配置。
A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them.
Kubernetes Service 是個抽象化的概念,主要定義了邏輯上的一群 Pod 以及如何存取他們的規則。
Service 的基本概念
Kubernetes 中的 Service 有以下幾個關鍵功能:
- 抽象 Pod 的訪問:Pod 的 IP 地址是動態變化的,Service 能夠幫助外部或其他 Pod 不受這些變化的影響進行通信。
- 負載均衡:Service 會將流量分發到後端的 Pod,實現負載均衡。
- 提供穩定的 DNS 名稱:Kubernetes 會為每個 Service 分配一個 DNS 名稱,方便其他服務調用。
Service 的類型
Kubernetes 支持多種類型的 Service,每種類型的用途和工作方式有所不同:
1. ClusterIP(預設類型)
只在集群內部暴露 Service,客戶端只能在集群內部訪問,不會暴露外部訪問的入口。
2. NodePort
在每個節點上分配一個端口,外部可以通過這個端口訪問 Service。通常與外部負載均衡器一起使用。
3. LoadBalancer
通過雲提供商的負載均衡器將流量分發到 Service,這通常需要雲提供商的支持,例如 AWS、GCP 等。
4. ExternalName
使 Service 指向外部 DNS 名稱,而不是集群內的 Pod,適用於將 Kubernetes 內部的服務映射到外部服務。
Service 的工作原理
- 選擇 Pod
- Service 使用
selector
來選擇一組 Pod,這些 Pod 是通過 label 來標識的。
- Service 使用
- 轉發流量:
- Service 接收來自客戶端的請求,根據負載均衡策略將流量轉發到符合 selector 條件的 Pod。
- DNS 解析:
- 每個 Service 都會自動獲得一個 DNS 名稱,例如
my-service.default.svc.cluster.local
,其他 Pod 可以通過這個名稱來訪問該 Service。
- 每個 Service 都會自動獲得一個 DNS 名稱,例如
實作一個 Service
建立兩個 Pod 當作測試
- 因為我們需要建立兩個 image,分別是版本 1 和版本 2,因此我們透過 build 時代入參數的方式進行
main.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
// 定義一個變數,版本號會在構建時動態注入
var version = "v1"
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
message := "Hello world " + version + "!"
c.JSON(http.StatusOK, gin.H{"data": message})
})
router.Run()
}