【學習筆記06】每天5分鐘酷含,玩轉kubernetes-06(通過Service訪問Pod)

第六章: 通過Service訪問Pod

不應該直接使用Pod的ID地址作為對外提供服務的接口汪茧,應為一旦Pod重啟,IP地址就變化了呀舔,解決方案是使用Service。

6.1 創(chuàng)建Service

K8s service從邏輯上代表了一組Pod霜瘪,具體是哪些Pod則由label來挑選的惧磺。
service有自己的IP,而且這個IP是不變的缤底,客戶端只需要訪問Service的IP番捂,K8s負責建立和維護service和Pod的映射關系设预。無論Pod如何變化,對客戶端無影響鳖枕。

httpd.yml

vim httpd.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: httpd
spec:
  replicas: 3
  template:
    metadata:
      labels:
        run: httpd                     # 定義label給service用
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80             # port對外暴露的端口

部署之后耕魄,可以直接通過IP地址訪問Pod:

$kubectl apply -f httpd.yml 
$kubectl get pods -o wide
NAME                                  READY   STATUS    RESTARTS   AGE     IP             NODE                 NOMINATED NODE   READINESS GATES
httpd-69cb5b9fdd-9vtrp                1/1     Running   0          5m11s   10.244.3.119   k8s-node-122132073   <none>           <none>
httpd-69cb5b9fdd-crtfm                1/1     Running   0          5m11s   10.244.3.118   k8s-node-122132073   <none>           <none>
httpd-69cb5b9fdd-k9xbv                1/1     Running   0          5m11s   10.244.4.35    k8s-node-122132072   <none>           <none>
#測試
$curl 10.244.3.119:80
<html><body><h1>It works!</h1></body></html>

定義service 配置

vim httpd-svc.yml
apiVersion: v1
kind: Service
metadata:
  name: httpd-svc              # service 名字
spec:
  selector:
    run: httpd                 # selector指明挑選 label為run:httpd 的Pod作為Service的后端吸奴。
  ports:
  - protocol: TCP
    port: 8080                 #  service的端口;     service的8080端口映射到Pod的80端口
    targetPort: 80             #  Port的端口
~~

**部署service**
~~
$kubectl apply -f httpd-svc.yml 
$service/httpd-svc created
$kubectl get svc
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
httpd-svc             ClusterIP   10.10.60.67     <none>        8080/TCP         5s

#測試
curl 10.10.60.67:8080
<html><body><h1>It works!</h1></body></html>

通過kubectl describe可以查看httpd-svc與pod的對應關系:

kubectl describe service httpd-svc
Name:              httpd-svc
Namespace:         default
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"httpd-svc","namespace":"default"},"spec":{"ports":[{"port":8080,"...
Selector:          run=httpd
Type:              ClusterIP
IP:                10.10.60.67
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.244.3.118:80,10.244.3.119:80,10.244.4.35:80
Session Affinity:  None
Events:            <none>

6.2 Cluster IP底層實現(xiàn)

Cluster IP 是一個虛擬IP,是由K8s節(jié)點上的iptables規(guī)則管理的读处。使用類似輪詢的方法訪問Pod罚舱。

$iptables -L   
$iptables-save   #打印出規(guī)則

6.3 DNS訪問service

在Cluster中,除了可以通過Cluster IP訪問 services管闷, K8s還提供了更為方便的DNS訪問。
kubeadm部署時會默認安裝kube-dns組件刷允。
kube-dns是一個DNS服務器。每當有新的Service被創(chuàng)建纤怒,kube-dns會添加該service的DNS記錄天通。
Cluster中的Pod可以通過
\color{red}{<SERVICE -NAME>.<NAMESPACE-NAME> 訪問service土砂。}
比如可以用httpd-svc.default(service name. namespace name) 訪問service httpd-svc.(注意: 這是在port里訪問)

$kubectl get deployment -n kube-system
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
coredns   2/2     2            2           8d
$kubectl run busybox --rm -ti --image=busybox /bin/sh
#
$wget httpd-svc:8080   ## 因為都屬于同一個namespace default谜洽, 說與可以省略default 
Connecting to httpd-svc:8080 (10.10.60.67:8080)
saving to 'index.html'
index.html           100% |*************************|    45  0:00:00 ETA
'index.html' saved

$nslookup httpd-svc
Server:         10.10.0.10
Address:        10.10.0.10:53

httpd2.yml

$vim httpd2.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: httpd2
  namespace: kube-public
spec:
  replicas: 2
  template:
    metadata:
      labels:
        run: httpd2                     # 定義label給service用
    spec:
      containers:
      - name: httpd2
        image: httpd
        ports:
        - containerPort: 80             # port對外暴露的端口

---
apiVersion: v1
kind: Service
metadata:
  name: httpd2-svc              # service 名字
  namespace: kube-public
spec:
  selector:
    run: httpd2                 # selector指明挑選 label為run:httpd2 的Pod作為Service的后端阐虚。
  ports:
  - protocol: TCP
    port: 8080                 #  service的端口;     service的8080端口映射到Pod的80端口
    targetPort: 80             #  Port的端口

布署httpd2

$kubectl apply -f httpd2.yml
$kubectl get service -n kube-public
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
httpd2-svc   ClusterIP   10.10.64.178   <none>        8080/TCP   11m

#需要加上namespace
$wget httpd2-svc.kube-public:8080
Connecting to httpd2-svc.kube-public:8080 (10.10.64.178:8080)
saving to 'index.html'
index.html           100% |*******************************|    45  0:00:00 ETA
'index.html' saved

6.4 外網如何訪問service

  1. ClusterIp:
    Service通過Cluster內部的IP對外提供服務奥秆,只有Cluster內節(jié)點和Pod可以訪問构订,這是默認的Service類型避矢。
  2. NodePort:
    Service通過Cluster節(jié)點的靜態(tài)端口對外提供服務。Cluster外部可以通過<NodeIp>.<NodePort>訪問Service.
  3. LoadBalancer:
    Service利用cloud provider特有的load balancer對外提供服務亥宿。

實踐一下NodePort

$kubectl get service
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
httpd-svc             ClusterIP   10.10.60.67     <none>        8080/TCP         43m

$修改httpd-svc.yml 
vim httpd-svc.yml 
spec:
  type: NodePort #指定為NodePort

$kubectl apply -f httpd-svc.yml 

#Type欄變?yōu)镹odePortPort欄會多出32686
$kubectl get service
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
httpd-svc             NodePort    10.10.60.67     <none>        8080:32686/TCP   46m

這時可以通過node_ip:23686訪問

$ netstat -an |grep 32686
tcp6       0      0 :::32686                :::*                    LISTEN     
#這時可以通過node_ip:23686訪問
$kubectl get service
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
httpd-svc             NodePort    10.10.60.67     <none>        8080:32686/TCP   56m

#這時可以通過node_ip:23686訪問
$ curl k8s-node-122132072:32686 #也可用node_ip
<html><body><h1>It works!</h1></body></html>
$ curl 10.10.60.67:8080
<html><body><h1>It works!</h1></body></html>

\color{red}{也可指定port}

vim httpd-svc.yml 
apiVersion: v1
kind: Service
metadata:
  name: httpd-svc              # service 名字
spec:
  type: NodePort
  selector:
    run: httpd                 # selector指明挑選 label為run:httpd 的Pod作為Service的后端烫扼。
  ports:
  - protocol: TCP
    nodePort: 30000       # node監(jiān)聽Port
    port: 8080                 #  service的端口碍庵;     service的8080端口映射到Pod的80端口
    targetPort: 80            #  Port的端口

$curl k8s-node-122132072:30000
 <html><body><h1>It works!</h1></body></html>                                     

參考:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末马绝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌白胀,老刑警劉巖抚岗,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宣蔚,死亡現(xiàn)場離奇詭異,居然都是意外死亡胚委,警方通過查閱死者的電腦和手機亩冬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來覆享,“玉大人营袜,你說我怎么就攤上這事》锉冢” “怎么了啸驯?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵罚斗,是天一觀的道長。 經常有香客問我针姿,道長距淫,這世上最難降的妖魔是什么绞绒? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮榕暇,結果婚禮上蓬衡,老公的妹妹穿的比我還像新娘喻杈。我一直安慰自己,他們只是感情好狰晚,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布筒饰。 她就那樣靜靜地躺著,像睡著了一般壁晒。 火紅的嫁衣襯著肌膚如雪瓷们。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天秒咐,我揣著相機與錄音,去河邊找鬼携取。 笑死攒钳,一個胖子當著我的面吹牛,可吹牛的內容都是我干的歹茶。 我是一名探鬼主播夕玩,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惊豺!你這毒婦竟也來了?” 一聲冷哼從身側響起禽作,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤尸昧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后旷偿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烹俗,經...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年萍程,在試婚紗的時候發(fā)現(xiàn)自己被綠了幢妄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡茫负,死狀恐怖蕉鸳,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情忍法,我是刑警寧澤潮尝,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站饿序,受9級特大地震影響勉失,放射性物質發(fā)生泄漏。R本人自食惡果不足惜原探,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一乱凿、第九天 我趴在偏房一處隱蔽的房頂上張望顽素。 院中可真熱鬧,春花似錦徒蟆、人聲如沸戈抄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽划鸽。三九已至,卻和暖如春戚哎,著一層夾襖步出監(jiān)牢的瞬間裸诽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工型凳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丈冬,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓甘畅,卻偏偏與公主長得像埂蕊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疏唾,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內容