每天5分鐘|輕鬆掌握開發工作必會的k8s-service的介紹和基本操作

2021-01-08 老何漫話

通過k8s部署集群並提供服務的時候,會部署很多的pod以及pod副本來保證服務的高可用。

這也帶來了一個問題!!

這麼多pod提供服務,外部如何訪問這些服務?

在k8s中,每個pod都會被分配一個ip,即每個pod都唯一的ip。

但調用端是不管你內部有多少個pod 的,它只關心調取什麼地址來進行通信,如下圖:

如果調用端直接訪問某個pod的ip來訪問服務,會帶來兩個問題:

問題1:

pod是有生命周期的,一旦被重啟,pod的ip就會發生變更,而且我們通過deployment進行滾動升級的時候是新建pod,並逐步刪除舊的pod,新舊pod的ip是不一樣的。

問題2:

如果nginx的服務部署了10個pod,直接連接單個pod的ip的話,那剩下的9個pod不就沒用了嗎?怎麼才能如何保證請求均勻打到這個10個pod上呢?

要解決這個問題,k8s內部需要有一個對象來做如下兩件事情:

1、能夠管理一組pod,這組pod有固定的對外訪問的ip

2、能夠管理一組pod,並且對組內的pod進行服務發現和負載均衡

在k8s中,這個對象就是service,簡稱svc。

service是一個抽象概念,它定義了一組服務的多個pod邏輯合集和訪問pod的策略,一般把service稱為微服務。

簡單來說,service就是服務的反向代理,service並不提供服務,他只是提供一個統一的入口,並將接到的請求轉發給pod服務去處理,如下圖:

service管理pod和之前的RC或者RS一樣,通過pod的標籤來管理每一組pod。

service的創建和deployment等資源的創建方式一樣,只需要在yaml中定義service的相關屬性,並執行相應的命令運行這個配置即可。

我們在yaml中定義Serive的時候,需要指定spec.type欄位,分別為以下四個選項:

1、ClusterIP。

這是type的默認選項,此時,k8s會自動給這個service分配虛擬IP,service有了ip,那麼就可以訪問這個service 的ip,而不用關心內部的pod的ip。

2、NodePort。

將Service通過指定的Node上的埠暴露給外部,這樣外部可以訪問node的ip和對應埠,就可以訪問這個服務。

注意:配置成NodePort後,訪問任意一個NodeIP:NodePort都將路由到service的虛擬ip,從而成功獲得該服務。

3、LoadBalancer。

在 NodePort 的基礎上,藉助 cloud provider 創建一個外部的負載均衡器,並將請求轉發到 <NodeIP>:NodePort。

注意:此選項只能在雲伺服器(AWS等)上使用,且需要藉助一些負載均衡的軟體。

4、ExternalName。

將服務通過 DNS CNAME 記錄方式轉發到指定的域名(通過 spec.externlName 設定)。

注意:此選項需要 kube-dns 版本在 1.7 以上。

好了,接下來看看怎麼創建service並如何訪問這個service吧?

這篇文章中,我們演示下ClusterIP和NodePort這兩種方式。

和之前創建其他資源一樣,k8s也是通過配置yaml,然後通過命令行來實現service的創建和管理。

01

ClusterIP類型的Service

先創建一個nginx-service.yaml文件,並寫下如下內容,注意這裡沒有定義type為ClusterIP,k8s則會將此service默認為ClusterIP類型:

kind: Service

apiVersion: v1

metadata:

name: my-service

labels:

app: my-service

spec:

selector:

app: nginx-de

ports:

- protocol: TCP

port: 80

targetPort: 80

創建這個service資源:

[root@iZuf64nzsz01vlhaqampj5Z k8s]# kubectl apply -f nginx-service.yaml

service "my-service" created

查看這個service的具體內容:

[root@iZuf64nzsz01vlhaqampj5Z k8s]# kubectl describe service my-service

Name:my-service

Namespace:default

Labels:app=my-service

Selector:app=nginx-de

Type:ClusterIP

IP:10.254.114.224

Port:<unset>80/TCP

Endpoints:172.18.0.3:80,172.18.0.4:80,172.18.0.5:80 + 1 more...

Session Affinity:None

No events.

可以看到,k8s默認給這個名叫my-service的service分配了一個ip為10.254.114.224,通過這個ip以及80埠的請求會被轉發到後端的pod上去。

由於ClusterIP類型的service被分配的虛擬ip,只能在集群內部使用,因此我們進入pod裡面去訪問service看看:

[root@iZuf64nzsz01vlhaqampj5Z k8s]# kubectl exec -it nginx-deployment-2796601259-zcn3s sh

/ # curl 10.254.114.224

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

body {

width: 35em;

margin: 0 auto;

font-family: Tahoma, Verdana, Arial, sans-serif;

}

</style>

</head>

<body>

<h1>Welcome to nginx!</h1>

可以看到,集群內通過service的ClusterIP進行訪問是正常的。

02

NodePort類型的Service

外部應該怎麼訪問service呢?通過配置NodePort類型的service來實現。

修改下剛剛的那個nginx-service.yaml,如下:

kind: Service

apiVersion: v1

metadata:

name: my-service

labels:

app: my-service

spec:

selector:

app: nginx-de

ports:

- protocol: TCP

port: 80

targetPort: 80

nodePort: 30088 #節點埠,外部通過節點ip加埠可訪問

type: NodePort

在配置文件的最後兩行,分別加上了type類型和nodePort的埠。

然後執行如下命令,使剛剛修改的service的配置生效:

[root@iZuf64nzsz01vlhaqampj5Z k8s]# kubectl apply -f nginx-service.yaml

service "my-service" configured

然後,我們通過node節點ip+埠的方式來訪問,外部訪問正常:

通過節點ip+port的方式看起來是訪問了1臺node上的pod,但實際上,還是將請求打到service的虛擬ip上,然後由service決定將請求轉發到哪個pod上。

好啦,今天的內容就到這裡啦,我們分別演示了兩種service的創建方式,有疑問的話,歡迎在下方留言哦!!

相關焦點

  • 每天5分鐘|輕鬆掌握開發工作必會的k8s-命令行操作k8s太麻煩?
    前面幾篇中,查看和操作k8s的資源都是通過命令行操作,每次查詢一個資源的狀態都需要手動執行命令。這種方式。。。。多少有點。。。。。不方便。而且,k8s不光面向運維,有時候開發也需要關注集群中某些服務的狀態,做一些簡單的配置。
  • 每天5分鐘|輕鬆掌握開發工作必會的k8s-eplicationController介紹
    前面我們介紹了pod的基本概念和常用命令,並且手動安裝了一個nginx應用pod。然而,線上的流量會越來越大,一個nginx應用提供服務顯然不夠,那就需要多個nginx應用來做均衡,共同提供服務。多個應用容器,就意味著多個pod。開啟了多個pod,雖然保證了對外服務的正常,但也同樣帶來了pod管理和維護的問題。
  • 每天5分鐘|輕鬆掌握開發工作中必會的k8s-基礎組件與架構
    前面我們介紹過,k8s是用來實現自動化部署、擴展、管理容器化應用的開源系統,它讓我們可以像控制一臺單一的計算機一樣控制整個節點集群。假設此刻有3個節點,要怎麼用k8s來管理我們的機器上的應用容器的呢?worker節點作為真正的工作節點,其上面會部署容器,運行業務對應的容器;在正式開始安裝k8s之前,還需要了解下主節點和worker節點裡面都分別包含了什麼內容?了解了這些,我們才能知道安裝的時候需要修改哪些配置文件以及修改的配置文件是幹嘛用的?
  • 每天5分鐘|輕鬆掌握開發工作中必會的k8s-pod介紹和安裝nginx
    之前在介紹k8s基本組成部分的時候,簡單的提到了pod,今天我們就來具體聊聊這個pod。00—舉一個生活中的例子先來一個生活中的例子!如果一個學校只有一個學生, 那學校的管理工作就會很容易。但要真是一個學校一個學生,那校長會哭死的,太虧了!!!
  • 每天5分鐘|輕鬆掌握開發工作中必會的k8s-k8s安裝與部署
    上一章我們介紹了k8s的核心組件,了解了這些,我們就可以開始k8s的安裝和部署了。來吧,動手吧!準備好兩伺服器(系統是centos7.3),分別作為matser和node,如下:要讓k8s能夠管理我們的集群,需要在所有的節點上面分別安裝k8s的組件。在安裝之前,需要在兩臺節點上做如下的操作。
  • 每天5分鐘|輕鬆掌握開發工作中必會的docker套路-yaml語法
    了解了yaml的基本展示形式 ,下面來說說yaml語法。:people:name:張三age:13address:上海class:-小明-小紅-小花好了,關於yaml語法的常用內容就介紹到這裡,我想大家對於yaml的語法有了一定的了解了。
  • 每天5分鐘|輕鬆掌握開發工作中必會的k8s-yaml配置說明和常用命令
    :方式一:使用kubectl 命令行,在輸入kubectl命令的時候,填上對應的參數優點:方便快捷,一行命令搞定缺點:一行命令太多參數,可讀性差,不利於維護方式二:配置yaml 配置文件的方式優點:數據有結構性,可讀性高,維護方便缺點:沒有命令行一行輸入那麼方便(個人覺得這個缺點可以忽略)因此,在實際操作中
  • K8S中的Service的存在理由
    一個service對象就是工作節點上的一些iptables或ipvs,用於將到達service對象的IP位址的流量轉發到相應的endpoint對象指定的IP位址和埠上,kube-proxy組件通過api-server持續監控著各個service及其相關的POD對象,並將其創建或變動實時反映到工作節點的iptable
  • K8S中的Service的存在理由
    注意:service只是在k8s集群內部起作用,集群外部訪問是無效的實現原理Service通過關註定義出多個POD對象組合而成的邏輯集合,以及訪問這組POD的策略,Service關聯POD需要標籤選擇器完成,其基於標籤選擇器將一組POD定義成一個邏輯集合,並通過自己的IP位址和埠調度代理請求至後端POD之上。
  • 容器編排系統k8s之Service資源
    Service資源在k8s上主要用來解決pod訪問問題;我們知道在k8s上pod由於各種原因重建,對於重建後的podip地址和名稱都是變化的,這樣一來使得我們訪問pod就變得有些不便;為了解決pod訪問能有一個固定的端點,在k8s上就是用service來解決的;簡單來講,service對象就是工作在節點上的一組iptables或ipvs規則,用於將到達service對象ip
  • k8s重器之Service
    Service是k8s的核心,通過創建Service,可以為一組具有相同功能的容器應用提供一個統一的入口地址,並將請求進行負載分發到各個容器應用上。目錄:Service定義詳解Service基本用法集群外部訪問Pod和Service一、Service定義詳解Service的定義比Pod簡單。
  • 手拿阿里P8大牛手寫的185頁進階文檔,每天學習5分鐘輕鬆玩懂K8S
    容器技術是繼大數據和雲計算之後又一熱門技術,而且未來相當一段時間內都會非常流行對IT從業者來說,掌握容器技術是市場的需要,也是提升自我價值的重要途徑每一輪新技術的興起小編在這裡推薦一本學習Kubernetes的電子書籍:每天5分鐘玩轉Kubernetes《每天5分鐘玩轉Kubernetes》 是一本系統學習Kubernetes 的教程,有下面兩個特點:系統講解當前最流行的容器編排引擎Kubernetes
  • 和我一起學k8s(一)初識kubernetes
    其次,可以擁抱微服務架構,kubernetes幫我們實現了實例的多副本,副本數量動態控制,滾動式升級、回退,具有超強的穩定性和高速迭代能力。第三,簡化了服務上雲的難度,同時現在多家公有雲也均支持k8s。
  • k8s對外暴露服務:ingress controller介紹
    當集群對外暴露service很多時,對外的埠開放也會急劇膨脹,而且是集群中每臺宿主機都暴露一樣多的埠,在可維護性和安全性都具有很大挑戰;LoadBalance需要配合雲廠商的負載均衡服務一起使用,有一定費用成本;Ingress通常對外暴露兩個埠(http和https)。通過rule的規則定義來映射不同流量和service的對應關係。
  • kubernetes(k8s)基本概念
    上一篇介紹了用kubeadm安裝k8s集群,能把k8s安裝起來是開始學習和實踐的第一步。集群安裝好了,今天我們來簡單介紹下k8s的基礎實踐,並在實踐中介紹基本概念。Kubernetes 對象包含哪些?也許你覺得這句話很抽象,說人話,對象用來描述以下的一些信息:哪些容器化應用在運行(以及在哪個 Node 上)可以被應用使用的資源關於應用運行時表現的策略,比如重啟策略、升級策略,以及容錯策略操作 Kubernetes 對象 —— 無論是創建、修改,或者刪除 —— 需要使用 Kubernetes API。
  • k8s service 負載均衡:proxy mode介紹
    service具有以下功能:自動發現機制,監聽service下pod的啟動/停止狀態;提供單一DNS名稱和service下pod集合ip地址映射;負載均衡service下pod集合的網絡訪問。通過以上定義我們發現:k8s中的service對象具有微服務的服務治理能力。
  • k8s集群CI/CD集成介紹一:環境準備
    容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。由於內容過多,本文將分多章介紹k8s集群構建過程,並發布demo到k8s集群,簡單演示一個完整CI/CD的自動化過程。
  • 初識K8S之理論和搭建
    一、什麼是k8sk8s是分布式系統集中式管理。它可以看作是一個分布式系統支撐平臺。二、為什麼要用k8s,它有什麼好處1、 開發人員發布的是鏡像,鏡像裡面是包括環境和包括代碼。所以說本地和線上的運行環境是一樣的。不會存在本地可以。
  • 乾貨|帶您了解k8s
    二、k8s介紹k8s是2014年google對外開放的。Borg是谷歌內部非常棒的容器編排工具,k8s就是站在Borg基礎上開發出來的,所以k8s從一出世,就吸引了太多太多人的關注,直到今天為止,它也確實沒有辜負人們的期望。2017年是容器技術最輝煌的一年,AWS、微軟的雲技術、阿里雲等雲廠商開始對外宣布,他們支持k8s。
  • k8s快速通關秘籍(1)
    K8s的快速崛起大大加快了應用程式的工作負載從第3代虛擬機向第4代容器的遷移速度,K8s不僅提供容器編排,部署和管理功能,而且也是CNCF基金會第一個畢業的項目,代表其成熟和穩定性已達到生產環境的標準,當前推薦部署在生產環境的k8s版本是1.14.6。