自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關于 K8s Service,你真的理解了嗎?詳細版了解一下

運維 云計算
在生產(chǎn)環(huán)境中,Service 不僅可以幫助實現(xiàn)服務間的可靠通信,還能為外部用戶提供負載均衡和高可用的訪問入口。?

一、相關概念

1. 什么是Service?

在 Kubernetes 中,Service 是一種抽象的資源,它提供了穩(wěn)定的訪問接口,將外部或集群內(nèi)部的流量路由到對應的 Pod 上。 Pod 是 Kubernetes 中的基本調(diào)度單元,但它們是臨時的,IP 地址和生命周期都可能發(fā)生變化。Service 為 Pod 提供一個穩(wěn)定的訪問方式,解決了 Pod 的動態(tài) IP 問題。

Kubernetes 的 Service 有幾種不同的類型,能夠幫助我們根據(jù)不同的需求將服務暴露給外部用戶或者集群內(nèi)部的其他服務。

2. Service的核心概念

(1) Pod 和 Service

在 Kubernetes 中,Pod 是部署應用的基本單位。每個 Pod 都會有一個 IP 地址,但這個 IP 地址只在 Pod 生命周期內(nèi)有效。當 Pod 被銷毀、重建或調(diào)度到其他節(jié)點時,Pod 的 IP 地址會發(fā)生變化。這使得直接依賴 Pod IP 地址來訪問服務變得不可行。

Service 解決了這個問題,它為一組 Pod 提供一個穩(wěn)定的訪問入口,不會隨著 Pod 的變化而變化。Service 將流量路由到匹配標簽的 Pod 上,并為客戶端提供一個固定的 IP 地址和 DNS 名稱來訪問這些 Pod。

(2) Service 和 Endpoints

Endpoints 是與 Service 關聯(lián)的資源,它記錄了與該 Service 匹配的 Pod 的 IP 地址。當 Service 創(chuàng)建時,Kubernetes 會根據(jù)標簽選擇器(selector)找到符合條件的 Pod,并自動生成 Endpoints,確保流量能夠正確地路由到這些 Pod。

容易混淆的幾個端口的關系:

3. Service 類型

Kubernetes 提供了幾種不同的 Service 類型,適應不同的網(wǎng)絡通信需求。每種類型都有自己的特性和應用場景。

(1) ClusterIP(默認類型)

功能:ClusterIP 類型的 Service 只能在集群內(nèi)部訪問,外部無法直接訪問該服務。它為服務分配一個虛擬 IP 地址(ClusterIP),客戶端通過該 IP 與服務進行通信。

用途:適用于集群內(nèi)部的微服務通信,常見于服務間通信。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app  # 選擇標簽為 app=my-app 的 Pod
  ports:
    - protocol: TCP
      port: 80        # 服務對外暴露的端口
      targetPort: 8080  # 實際服務運行的 Pod 端口
  clusterIP: 10.96.0.1  # Kubernetes 自動分配 ClusterIP

這個 Service 會將請求轉發(fā)到符合條件的 Pod 上(標簽為 app=my-app)。 訪問該服務時,Kubernetes 會自動通過虛擬 IP 地址 10.96.0.1 來路由流量。

(2) NodePort

功能:NodePort 類型的 Service 將服務暴露到每個 Node 上的指定端口,外部客戶端可以通過訪問任意 Node 的 IP 地址和指定端口來訪問該服務。

用途:適用于開發(fā)和測試場景,或者希望通過某個特定端口暴露服務的場景。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80         # 外部客戶端訪問的端口
      targetPort: 8080  # Pod 上的目標端口
      nodePort: 30001    # 每個 Node 暴露的端口
  type: NodePort

在這個例子中,nodePort 為 30001,可以通過集群中任意一個節(jié)點的 NodeIP:30001 訪問服務。

(3) LoadBalancer

功能:LoadBalancer 類型的 Service 會在云環(huán)境中創(chuàng)建一個外部負載均衡器,將外部流量自動分發(fā)到集群中的多個 Pod 上。

用途:適用于需要對外暴露服務,并且需要自動負載均衡的生產(chǎn)環(huán)境。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80         # 外部訪問的端口
      targetPort: 8080  # Pod 上的目標端口
  type: LoadBalancer

創(chuàng)建該 Service 后,Kubernetes 會自動請求云平臺(如 AWS、阿里云,華為云)創(chuàng)建一個負載均衡器,將流量轉發(fā)到集群中的 Pod 上。

(4) ExternalName

功能:ExternalName 類型的 Service 將流量路由到外部的 DNS 名稱,而不是內(nèi)部的 Pod。

用途:適用于需要訪問集群外部服務(如外部數(shù)據(jù)庫或第三方 API)的場景。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ExternalName
  externalName: example.com  # 外部服務的 DNS 名稱

在這種配置下,my-service 將請求轉發(fā)到 example.com,而不是集群內(nèi)部的 Pod。

二、Service 工作原理

1. Pod 的 IP 和生命周期管理

每個 Pod 都有一個自己的 IP 地址,當 Pod 被刪除或重新調(diào)度時,IP 地址會發(fā)生變化。Kubernetes 會監(jiān)控這些變化,并確保流量能夠正確地轉發(fā)到新的 Pod 上。

2. 標簽選擇器

Service 通過標簽選擇器來匹配需要暴露的 Pod。當 Service 創(chuàng)建時,Kubernetes 會根據(jù)該標簽選擇器找到所有匹配的 Pod,并通過 Endpoints 記錄它們的 IP 地址。

3. DNS 解析

Kubernetes 會為每個 Service 分配一個 DNS 名稱,Pod 可以通過 DNS 名稱訪問 Service,而不需要關心具體的 IP 地址。這使得服務發(fā)現(xiàn)變得非常容易。

三、Service常用操作

1. 創(chuàng)建service

# 命令行創(chuàng)建,通過暴露deployment創(chuàng)建Service
kubectl expose deployment <deployment-name> --type=<service-type> --port=<port> --target-port=<target-port>

kubectl expose deploy nginx  --port=80 --target-port=80  --type=NodePort

# 基于yaml文件創(chuàng)建
# 創(chuàng)建Service資源清單
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30080  # 指定節(jié)點上的端口
type: type: NodePort

# 創(chuàng)建
kubectl apply -f service.yaml

2. 查看service

# 查看所有service信息
kubectl get svc
kubectl get svc -o wide -n prod

# 查看指定service的詳細信息
kubectl get svc nginx -o yaml -n prod
kubectl describe svc nginx -n prod

# 查看Service的endpoint信息
kubectl get endpoints <service-name>
kubectl get ep nginx

3. 編輯更新Service

注意:修改后,service會立即重啟

kubectl edit service <service-name> 
  
kubectl edit svc nginx -n prod

# 更新端口
kubectl patch service my-service -p '{"spec":{"ports":[{"port":80,"targetPort":8081}]}}'

4. 刪除Service

# 命令行刪除
kubectl delete svc <service-name>

kubectl delete svc nginx

# 基于yaml文件刪除
kubectl delete -f service.yaml

Service為 Pod 提供了穩(wěn)定的訪問入口,解決了 Pod 生命周期變化帶來的網(wǎng)絡問題。通過不同類型的 Service(如 ClusterIP、NodePort、LoadBalancer 和 ExternalName),Kubernetes 可以滿足各種網(wǎng)絡通信需求。

在生產(chǎn)環(huán)境中,Service 不僅可以幫助實現(xiàn)服務間的可靠通信,還能為外部用戶提供負載均衡和高可用的訪問入口。

責任編輯:趙寧寧 來源: 運維李哥不背鍋
相關推薦

2023-12-14 12:55:41

Pythondel語句

2021-10-28 14:30:19

K8S Kubernetes數(shù)據(jù)持久化

2025-01-03 09:07:51

2024-03-15 08:23:26

異步編程函數(shù)

2023-05-09 08:25:26

Gaussdb數(shù)據(jù)庫開源數(shù)據(jù)庫

2023-11-06 17:37:17

技術架構任務隊列

2018-03-21 16:19:40

MVCMVPMVVM

2022-11-02 10:21:41

K8s pod運維

2019-12-26 09:15:44

網(wǎng)絡IOLinux

2023-11-27 00:48:46

displayvisibility

2024-01-03 08:08:51

Pulsar版本數(shù)據(jù)

2024-03-20 08:31:40

KotlinExtension計算

2023-06-26 07:32:43

Kubernetes容器

2025-02-17 08:18:27

C#TypeScriptJavaScript

2023-05-09 09:00:20

版本Canary框架

2023-09-27 16:29:55

開發(fā)團隊信息

2024-02-19 08:40:22

2024-09-11 08:02:27

k8sgitlab升級

2020-06-29 08:32:21

高并發(fā)程序員流量

2023-08-03 08:36:30

Service服務架構
點贊
收藏

51CTO技術棧公眾號