k8s外網如何訪問業(yè)務應用

廢話:先講述一個k8s重要概念刨秆,我覺得這個概念是整個k8s集群實現(xiàn)微服務的最核心的概念
Service

Service定義了Pod的邏輯集合和訪問該集合的策略,是真實服務的抽象蚊逢。Service提供了一個統(tǒng)一的服務訪問入口以及服務代理和發(fā)現(xiàn)機制,用戶不需要了解后臺Pod是如何運行卦方。只需要將一組跑同一服務的pod池化成一個service,k8s集群會自動給這個service分配整個集群唯一ip和端口號(這個端口號自己在yaml文件中定義)趁俊,一個service定義了訪問pod的方式脚作,就像單個固定的IP地址和與其相對應的DNS名之間的關系警没。
Service其實就是我們經常提起的微服務架構中的一個"微服務"匈辱,每個微服務后端負載均衡多個業(yè)務pod,由版本控制(deployment)控制pod數(shù)量惠奸,保證服務的高可靠性與冗余性梅誓。最終我們的系統(tǒng)由多個提供不同業(yè)務能力而又彼此獨立的微服務單元所組成,服務之間通過TCP/IP(k8s集群分配的整個集群唯一的)進行通信佛南,從而形成了我們強大而又靈活的彈性網絡,擁有了強大的分布式能力嵌言、彈性擴展能力嗅回、容錯能力;

理解service這個概念之后摧茴,我們跑去service后端看看具體是怎么實現(xiàn)的绵载?
需求:有一個問題就是現(xiàn)在我的業(yè)務分配在多個Pod上,那么如果我某個Pod死掉豈不是業(yè)務完蛋了,當然也會有人說Pod死掉沒問題啊娃豹,K8S自身機制Deployment和Controller會動態(tài)的創(chuàng)建和銷毀Pod來保證應用的整體穩(wěn)定性焚虱,那這時候還會有問題,那就是每個Pod產生的IP都是動態(tài)的懂版,那所以說重新啟動了我對外訪問的IP豈不是要變了鹃栽,別急,下面我們來解決下這個問題躯畴。

可以通過Service來解決如上所遇到的問題

Service是kubernetes最核心的概念民鼓,通過創(chuàng)建Service,可以為一組具有相同功能的容器應用提供一個統(tǒng)一的入口地址蓬抄,并且將請求進行負載分發(fā)到后端的各個容器應用上丰嘉。至于如何負載分發(fā),我們不用去擔心嚷缭,k8s自己搞定饮亏。

簡單來說Service就是一個把所有Pod統(tǒng)一成一個組,然后對外提供固定一個IP阅爽,具體是哪些Pod克滴,可以通過之前介紹到的Label標簽來進行設置,假設一個pod死掉优床,副本控制器在生成一個pod,這是pod ip肯定會變劝赔,但是我們不去關心你pod ip是多少,我們只知道service ip 沒變就好了胆敞,因為新的pod 早就加入到我的service中了着帽,各個服務之間通信是通過service 唯一ip來通信的。

上述所有操作移层,為什么實現(xiàn)了所謂的“”微服務”仍翰,舉個大家都懂的例子;
一套簡單的架構观话,nginx做反向代理予借,后端web為8個tomcat實例,在k8s集群中怎么實現(xiàn)呢频蛔,我只需要跑8個pod,每個pod運行tomcat容器灵迫,service池化這8個pod,而且副本控制會自動動態(tài)控制pod數(shù)量,少于8個他會創(chuàng)建到8個晦溪,多余8個會自動刪除到8個瀑粥。而且我們訪問service ip,k8s中的kube-proxy會自動負載均衡后端的8個pod,這一套服務集群內部訪問三圆,只需要一個service ip 和端口號就可以狞换;同理避咆,redis集群,同樣可以這樣實現(xiàn)修噪,每個service相當于微服務查库,各個服務之間靈活通信。

廢話不多說黄琼,咱們直接實操演示
創(chuàng)建副本控制資源名為nginx-deployment樊销,運行兩個pod,每個pod運行一個nginx容器适荣,容器端口開放80.
[root@master yaml]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx  
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx  就是說哪些Pod被Service池化是根據(jù)Label標簽來的现柠,此行nginx字樣,后面我們創(chuàng)建Service會用到
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80


kubectl create -f nginx.yaml 
deployment.apps/nginx-deployment created

創(chuàng)建Service 池化剛才的兩個nginx pod
[root@master yaml]# cat nginx-svc.yml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 8080  這個資源(svc)開放的端口
    targetPort: 80

selector選擇之前Label標簽為nginx的Pod作為Service池化的對象弛矛,
最后說的是把Service的8080端口映射到Pod的80端口够吩。

kubectl apply -f nginx-svc.yml 
service/nginx-svc created

創(chuàng)建完成之后nginx-svc會分配到一個cluster-ip,可以通過該ip訪問后端nginx業(yè)務丈氓。
那它是怎么實現(xiàn)的呢周循?答案是通過iptables實現(xiàn)的地址轉換和端口轉換,自己去研究

那這時候有人說了万俗,還是不能外網訪問啊湾笛,別急下面我們來進行外網地址訪問設置。在實際生產環(huán)境中闰歪,對Service的訪問可能會有兩種來源:Kubernetes集群內部的程序(Pod)和Kubernetes集群外部嚎研,為了滿足上述的場景,Kubernetes service有以下三種類型:
1.ClusterIP:提供一個集群內部的虛擬IP(與Pod不在同一網段)库倘,以供集群內部的pod之間通信使用临扮。
2.NodePort:在每個Node上打開一個隨機端口并且每個Node的端口都是一樣的,通過<NodeIP>:NodePort的方式Kubernetes集群外部的程序可以訪問Service教翩。
3.LoadBalancer:利用Cloud Provider特有的Load Balancer對外提供服務杆勇,Cloud Provider負責將Load Balancer的流量導向Service

本篇文章我著重講下第二種方式,也就是NodePort方式饱亿,修改nginx-svc.yml文件蚜退,也就是剛才前面創(chuàng)建的Service文件,相信細心的同學會發(fā)現(xiàn)在之前截圖的時候已經做好了NodePort彪笼,因為我的環(huán)境已經配置好了所以這樣就不在截圖了钻注,配置很簡單,可以網上看下截圖杰扫,就是添加一個type:NodePort队寇,然后重新創(chuàng)建下nginx-svc,命令的話和創(chuàng)建的命令一樣章姓,我們來看看創(chuàng)建完事的結果佳遣。

如果剛開始你沒有設置NodePort這個type的時候在端口那只會顯示一個8080端口,而設置了之后會看到多了一個端口也就是37884凡伊,那8080就是是cluster-ip監(jiān)聽的端口零渐,那37844就是在node節(jié)點上新起的一個端口(K8s會從30000~32767中分配一個可用的端口),只用于端口轉發(fā)系忙,轉發(fā)到service的端口诵盼。
<用戶訪問服務,每個節(jié)點都會監(jiān)聽這個端口银还,并轉發(fā)給Service风宁,service負載均衡調度后端pod,也就是防止說一個節(jié)點掛了影響訪問>。
說的再通俗一點蛹疯,集群內部可以直接通過service的ip+端口訪問戒财,而nodeport就是為了外網訪問服務,給node開了一個端口捺弦,轉發(fā)到service的ip+端口饮寞。
可能有人會問了,說這里的Service可不可以固定列吼?當時可以了幽崩,可以在Service nginx-svc.yml文件里面添加一個nodeport。

當然寞钥,這個訪問依然是負載均衡的慌申!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市理郑,隨后出現(xiàn)的幾起案子蹄溉,更是在濱河造成了極大的恐慌,老刑警劉巖香浩,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件类缤,死亡現(xiàn)場離奇詭異,居然都是意外死亡邻吭,警方通過查閱死者的電腦和手機餐弱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囱晴,“玉大人膏蚓,你說我怎么就攤上這事』矗” “怎么了驮瞧?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枯芬。 經常有香客問我论笔,道長采郎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任狂魔,我火速辦了婚禮蒜埋,結果婚禮上,老公的妹妹穿的比我還像新娘最楷。我一直安慰自己整份,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布籽孙。 她就那樣靜靜地躺著烈评,像睡著了一般。 火紅的嫁衣襯著肌膚如雪犯建。 梳的紋絲不亂的頭發(fā)上讲冠,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音胎挎,去河邊找鬼沟启。 笑死,一個胖子當著我的面吹牛犹菇,可吹牛的內容都是我干的德迹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼揭芍,長吁一口氣:“原來是場噩夢啊……” “哼胳搞!你這毒婦竟也來了?” 一聲冷哼從身側響起称杨,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肌毅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姑原,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悬而,經...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年锭汛,在試婚紗的時候發(fā)現(xiàn)自己被綠了笨奠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡唤殴,死狀恐怖般婆,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情朵逝,我是刑警寧澤蔚袍,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站配名,受9級特大地震影響啤咽,放射性物質發(fā)生泄漏晋辆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一闰蚕、第九天 我趴在偏房一處隱蔽的房頂上張望栈拖。 院中可真熱鬧连舍,春花似錦没陡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至潜腻,卻和暖如春埃儿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背融涣。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工童番, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人威鹿。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓剃斧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忽你。 傳聞我的和親對象是個殘疾皇子幼东,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內容

  • 1、基礎架構 1.1 Master Master節(jié)點上面主要由四個模塊組成:APIServer科雳、scheduler...
    阿斯蒂芬2閱讀 10,878評論 0 44
  • Kubernetes是Google開源的容器集群管理系統(tǒng)根蟹,其提供應用部署、維護糟秘、 擴展機制等功能简逮,利用Kubern...
    devabel閱讀 6,328評論 0 13
  • kubernetes Service 參考文獻:https://blog.csdn.net/watermelonb...
    碼二哥閱讀 2,596評論 1 5
  • 1.Pod Pod是k8s的最基本的操作單元,包含一個或多個緊密相關的容器尿赚,類似于豌豆莢的概念散庶。一個Pod可以被一...
    jony456123閱讀 7,417評論 0 5
  • 一、 K8s 是什么吼畏? Kubernetes(k8s)是自動化容器操作的開源平臺督赤,這些操作包括部署,調度和節(jié)點集群...
    loveroot閱讀 6,644評論 1 21