實戰 k8s學習筆記 深入理解Service

2021-10-13 02:20:50 字數 3722 閱讀 5060

4.4 建立該service並檢視ip位址和埠號

4.5 通過service的ip位址和埠號進行訪問

5. service的三種常用型別

6. service**模式

service是kubernetes的核心概念,通過建立service,可以為一組具有相同功能的容器應用提供乙個統一的入口位址,並且將請求負載分發到後端的各個容器應用上。

直接通過pod的ip位址和埠號可以訪問到容器應用內的服務,但是pod的ip位址是不可靠的,例如當pod所在的node發生故障時,pod將被kubernetes重新排程到另乙個node,pod的ip位址將發生變化。更重要的是,如果容器應用本身是分布式的部署方式,通過多個例項共同提供服務,就需要在這些例項的前端設定乙個負載均衡器來實現請求的分發。

可見,k8s中service的引入主要是解決pod的動態變化,提供統一訪問入口:

# vim nginx-deployment.yaml

kind: deployment

metadata:

name: nginx-deployment # deployment的名稱

namespace: default

spec:

replicas: 3 # pod副本預期數量

selector:

matchlabels:

template:

metadata:

labels:

spec:

containers:

- name: nginx # 容器名稱

image: nginx:1.15

# 建立

kubectl create -f nginx-deployment.yaml

# 檢視關聯的pod標籤

4.3.1 方式一:快速暴露

kubectl expose deployment nginx-deployment --port=80 --target-port=80 --type=nodeport
4.3.2 方式二:建立service物件
# vim nginx-svc.yaml

apiversion: v1 # api版本

kind: service # 資源型別

metadata:

name: nginx-svc # 元資料名稱

namespace: default # 命名空間

spec:

type: nodeport # 服務型別

selector: # 標籤選擇器

ports:

- protocol: tcp # 協議

port: 80 # service埠(服務發現)

targetport: 80 # 容器埠(負載均衡)

# 需要注意的是,service 能夠將乙個接收 port 對映到任意的 targetport。

# 預設情況下,targetport 將被設定為與 port 字段相同的值。

# 建立

kubectl create -f nginx-svc.yaml

# 檢視service

kubectl get svc

# 檢視關聯的pod

建立service時指定了服務型別為nodeport,可將service的埠號對映到對映到物理機,因此可通過物理機的ip位址和生成的nodeport訪問service。無論內部訪問還是外部訪問,對該service的訪問都將被負載分發到後端關聯的多個pod上。

4.5.1 集群內部訪問

# 內部訪問:curl cluster-ip:port

4.5.2 外部訪問

# 外部訪問:nodeip(公網):nodeport

瀏覽器輸入:

預設型別,分配乙個穩定的ip位址,即vip,只能在集群內部訪問。

在每個節點上啟用乙個埠暴露服務,可以在集群外部訪問。也會預設分配乙個穩定的內部集群ip位址。

埠範圍:30000-32767

ss -anpt |grep
nodeport會在每台node上監聽埠接受使用者流量,在實際情況下,對使用者暴露的只會有乙個ip和埠,因此,需要配置公網負載均衡器為專案提供統一訪問入口。

在kubernetes集群的每個node上都會執行乙個kube-proxy服務程序,我們可以把這個程序看作service的透明**兼負載均衡器,其核心功能是將到某個service的訪問請求**到後端的多個pod例項上。此外,service的cluster ip與nodeport等概念是kube-proxy服務通過iptables的nat轉換實現的,kube-proxy在執行過程中動態建立與service相關的iptables規則,這些規則實現了將訪問服務(cluster ip或nodeport)的請求負載分發到後端pod的功能。由於iptables機制針對的是本地的kube-proxy埠,所以在每個node上都要執行kube-proxy元件,這樣一來,在kubernetes集群內部,我們可以在任意node上發起對service的訪問請求。綜上所述,由於kube-proxy的作用,在service的呼叫過程中客戶端無須關心後端有幾個pod,中間過程的通訊、負載均衡及故障恢復都是透明的。

service的底層實現主要有iptables和ipvs兩種網路模式,決定了如何**流量

流程:客戶端–>nodeport/clusterip(iptables/ipvs負載均衡規則)–>分發在各節點的pod

對比:iptables:

ipvs

ip位址是動態的,pod如果重啟後,位址會變化

coredns:是乙個dns伺服器,kubernetes預設採用,以pod部署在集群中,coredns服務監視kubernetes api,為每乙個service建立dns記錄用於網域名稱解析。

k8s命令學習筆記

發布 replicationcontroller.yaml到kubernetes集群中命令 master節點執行 kubectl create f mysql.yaml 檢視 kubectl get rc kubectl get pods nodes services ex.kubectl desc...

k8s學習筆記一

假設現在有五颱機器,我們給其中的三颱安裝了mysql,那麼這三颱機器上就有了mysql的服務程序,我們把三個服務程序叫做k8s的乙個service。在實際的應用中,通過在一台機器上部署多個docker例項來達到這種效果。然後給service貼個標籤,比如起個名字 mysql 那麼,在k8s容器中,它...

雜亂筆記 k8s

k8s中 1.排程 etcd kubectl 以及資源都要呼叫api server 2.資源排程機制 listwatch 隨時監控節點加入刪除,新pod的 原有節點加標籤 觸發creatset 3.建立應用 service demoset satefulset 補充 無狀態應用,比如 3個pod服務...