首頁 > 軟體

服務發現與負載均衡機制Service範例建立

2022-03-18 19:01:36

什麼是Service?

Service是邏輯上的一組Pod,一種可以存取Pod的策略,而且其他Pod可以通過Service存取到這個Service代理的Pod,可以把它理解為傳統架構中的反向代理。

相對於Pod而言,Service有一個固定的名稱,不會發生改變,並且提供了負載均衡的功能。

通過Service的定義,可以對使用者端應用遮蔽後端Pod範例數量及Pod IP地址的變化,通過負載均衡策略實現請求到後端Pod範例的轉發,為使用者端應用提供一個穩定的服務存取入口地址。

Service實現的是微服務架構中的幾個核心功能:全自動的服務註冊、服務發現、服務負載均衡等。

建立一個Service範例

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-svc
  name: nginx-svc
spec:
  ports:
  - name: http #service埠名稱
    port: 80 #service自己的埠
    protocol: TCP #支援TCP UDP SCTP等
    targetPort: 80 #後端應用介面
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  selector:
    app: nginx  #這個就是匹配規則,代理標籤中有nginx的後端伺服器
  sessionAffinity: None
  type: ClusterIP

執行上面的yaml檔案,建立一個service

[root@k8s-master01 ~]# kubectl create -f nginx-svc.yaml 
service/nginx-svc created
[root@k8s-master01 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          9d
nginx-svc    ClusterIP   10.110.150.87   <none>        80/TCP,443/TCP   15s

我們通過存取svc地址就能存取到後端的nginx

[root@k8s-master01 ~]# curl 10.110.150.87
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/" rel="external nofollow" >nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/" rel="external nofollow" >nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
  • 在同一個namespace中,其他Pod存取svc只需要curl http://nginx-svc就可以
  • 跨namespace的話,需要在svc名稱後加.namespace名稱就可以了,使用需謹慎,沒必要不推薦
  • 不建議通過IP地址存取,因為IP不是固定的,刪除或重建後IP會隨機生成

注意,以上內容只能在叢集內部存取

叢集外部存取svc

  • 希望在生產中使用某個固定的名稱而非IP地址進行存取外部的中介軟體服務
  • 希望Service指向另一個namespace中或其他叢集中的服務
  • 某專案正在遷移至k8s叢集,但是一部分服務仍然在叢集外部,此時可以使用service代理外部的服務

建立代理外部應用的Service範例

下面我們定義一個外部應用的service

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-svc-w
  name: nginx-svc-w
spec:
  ports:
  - name: http 
    port: 80 
    protocol: TCP 
    targetPort: 80 
#  - name: https
#    port: 443
#    protocol: TCP
#    targetPort: 443
#  selector:
#    app: nginx 
  sessionAffinity: None
  type: ClusterIP

區別就是少了這兩個引數:

  selector:
    app: nginx 

建立成功後檢視,可以發現雖然建立成功了但是沒有ENDPOINTS

[root@k8s-master01 ~]# kubectl get svc
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP          9d
nginx-svc     ClusterIP   10.110.150.87   <none>        80/TCP,443/TCP   31m
nginx-svc-w   ClusterIP   10.110.144.61   <none>        80/TCP           58s
[root@k8s-master01 ~]# kubectl get ep
NAME         ENDPOINTS                                                          AGE
kubernetes   192.168.10.2:6443,192.168.10.3:6443,192.168.10.4:6443              9d
nginx-svc    172.17.125.10:443,172.18.195.22:443,172.17.125.10:80 + 1 more...   31m

接下來我們需要手動建立一個自定義的ENDPOINTS借用存在的ep生成一個新的ep檔案

[root@k8s-master01 ~]# kubectl get ep nginx-svc -o yaml > nginx-ep-w.yaml
apiVersion: v1
kind: Endpoints
metadata:
  labels:
    app: nginx-svc-w
  name: nginx-svc-w
  namespace: default
subsets:
- addresses:
  - ip: 110.242.68.3 # 代理的外部服務的地址
  ports:
  - name: http
    port: 80
    protocol: TCP

可以看到已經有外部的代理了

[root@k8s-master01 ~]# kubectl create -f nginx-ep-w.yaml 
endpoints/nginx-svc-w created
[root@k8s-master01 ~]# kubectl get ep
NAME          ENDPOINTS                                                          AGE
kubernetes    192.168.10.2:6443,192.168.10.3:6443,192.168.10.4:6443              9d
nginx-svc     172.17.125.10:443,172.18.195.22:443,172.17.125.10:80 + 1 more...   47m
nginx-svc-w   110.242.68.3:80                                                    11s

接下來試試能不能存取成功

# 直接存取的話是通的,返回值200
[root@k8s-master01 ~]# curl baidu.com -I
HTTP/1.1 200 OK
Date: Mon, 14 Feb 2022 01:43:18 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Tue, 15 Feb 2022 01:43:18 GMT
Connection: Keep-Alive
Content-Type: text/html
# 通過存取service的IP可以看到也是通的,返回值200
[root@k8s-master01 ~]# curl 10.110.144.61 -I
HTTP/1.1 200 OK
Date: Mon, 14 Feb 2022 01:44:20 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Tue, 15 Feb 2022 01:44:20 GMT
Connection: Keep-Alive
Content-Type: text/html

如果業務變更ep地址變了怎麼辦?只需要在ep中將代理的地址更換即可。

比如我們更換一個taobao的地址測試:

# 取出taobao的IP
[root@k8s-master01 ~]# ping taobao.com
PING taobao.com (140.205.94.189) 56(84) bytes of data.
64 bytes from 140.205.94.189 (140.205.94.189): icmp_seq=1 ttl=128 time=27.4 ms
64 bytes from 140.205.94.189 (140.205.94.189): icmp_seq=2 ttl=128 time=27.4 ms
# 修改ep的yaml檔案:nginx-ep-w.yaml
apiVersion: v1
kind: Endpoints
metadata:
  labels:
    app: nginx-svc-w
  name: nginx-svc-w
  namespace: default
subsets:
- addresses:
  - ip: 140.205.94.189 # taobao
  ports:
  - name: http
    port: 80
    protocol: TCP
# 重新載入
[root@k8s-master01 ~]# kubectl replace -f nginx-ep-w.yaml 

存取測試一下看是否連通:這個返回501是沒問題的。

[root@k8s-master01 ~]# curl 10.110.144.61 -I
HTTP/1.1 501 Not Implemented
Server: Tengine
Date: Mon, 14 Feb 2022 01:39:16 GMT
Content-Type: text/html
Content-Length: 583
Connection: close

Service反代外部域名

這個不說了,知道怎麼配就行了。
Service的yaml檔案:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-svc-wname
  name: nginx-svc-wname
spec:
  type: ExternalName
  externalName: www.baidu.com

然後建立就行了:

kubectl apply -f nginx-svc-wname.yaml

Service 的型別:

ClusterIP:在叢集內部使用,預設

ExternalName:通過返回定義的CNAME別名

NodePort:在所有安裝了kube-proxy的節點上開啟一個埠,此埠可以代理至後端Pod,然後叢集外部可以使用節點的IP地址和NodePort埠號存取到叢集Pod服務。埠取值範圍預設30000-32767

LoadBalancer:使用雲服務商提供的負載均衡器公開服務

以上就是服務發現與負載均衡機制Service範例建立的詳細內容,更多關於服務發現與負載均衡Service的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com