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服務...