K8S內部pod之間相互調用案例以及詳解
服務發(fā)現(xiàn)簡介:
1、service是用于K8S的服務發(fā)現(xiàn)的重要組件,pod作為運行業(yè)務的承載方式,要想被客戶端訪問或者集群內部其它服務訪問,就需要提供一個訪問入口;
2、傳統(tǒng)來說ip+端口是普適的訪問方式,但是pod是一種動態(tài)的資源,它會因故障被重建或重啟,因而pod ip會發(fā)生變化,所以使用ip作為pod的訪問入口并不合適;而K8S是通過service來充當pod與訪問端的中間代理,要訪問pod首先訪問pod對應的service,再由service代理到對應的pod
3、而pod采用了標簽來代替ip作為唯一標識,以供service篩選。service對應的也有標簽選擇器用來篩選pod標簽
4、 而service本身是ipvs規(guī)則,是由kube-porxy組件生成的,這個規(guī)則只要不刪除就會一直存在,但是刪除了service ip也會發(fā)生變化,這樣一來客戶端仍有無法訪問到service ip的風險
5、因此K8S使用了DNS來記錄service ip和service域名的記錄,客戶端使用域名就可以通過DNS中拿到對應的service ip了,而當service ip發(fā)生變化時,DNS也會動態(tài)的即使跟新到記錄表中,這樣即使service ip發(fā)生改變,仍然可以通過service的域名拿到對應的service ip,有了service ip就可以訪問到Service 而后service代理到對應的pod上
service類型:(主要用兩種)
1、clusterIP: 在K8S集群內部通信使用,無法接入集群外部流量
2、NodePort: 可以接入集群外部流量,在每個node節(jié)點監(jiān)聽一個和service定義的相同的端口,用于客戶端的訪問,把請求轉發(fā)到對應的service,然后service再轉發(fā)給pod; 用于將K8S服務暴露給K8S以外的客戶端訪問
注:serviceIP=clusterIP
NodePort 訪問流程如下:
客戶端client ------->node_IP+端口------->cluster_IP+端口-------->pod_IP+端口
上面的訪問流程可以看出NodePort類型還是需要借助clusterIP才能把集群外的訪問引入到集群內
3、何為無頭服務?
service的不同模式都是在上一種模式的基礎上增強版,nodePort就是在clusterIP的基礎上新增了功能,并不是一種新的功能模式,因為nodePort模式下客戶端訪問過程中還是要經過clusterIP的,這意味著clusterIP是service最基本要件,但也可以把這個clusterIP移除掉,而一旦No cluster,就稱為無頭服務了,無頭服務的主要作用在于可以把服務名稱(service_name)直接解析到后端的podIP;而本來只能解析到serviceIP
NodePort 示例:
部署nginx和tomcat這兩個前后端服務pod,通過NodePort類型service 相互調用
一、部署nginx容器
1、編寫yaml文件
root@k8s-deploy:~# vim nginx.yaml kind: Deployment apiVersion: apps/v1 #可查詢它的api版本 kubectl explain deployment.apiVersion metadata: #定義pod元數(shù)據(jù)信息,可查詢它的下級子字段kubectl explain deployment.metadata labels: #定義deployment控制器標簽 app: nginx-deployment-label #標簽名稱以鍵值形式定義,可以定義多個,這里標簽是app值為nginx-deployment-label name: nginx-deployment #deployment資源的名字 namespace: myserver #deployment所屬的namespace,默認是defaule spec: #定義Deployment中容器的詳細信息,可通過kubectl explain deployment.spec查詢 replicas: 1 #定義創(chuàng)建出pod的副本數(shù),默認值是1個pod selector: #定義標簽選擇器,它跟上面的Deployment標簽不是一回事,它是找下面template中定義的labels標簽 matchLabels: #定義匹配的標簽,必須要設置 app: nginx-selector #匹配的目標標簽,控制器會拿這個標簽匹配下面的pod template: #定義模板,用來描述需要創(chuàng)建的pod作用 metadata: #定義模板元數(shù)據(jù) labels: #這個labels會繼承給這個yaml文件Deployment控制器創(chuàng)建的所有pod app: nginx-selector #這個labels的key是app,值是nginx-selector,它會繼承給下面的pod,和上面matchLabels.app: nginx-selector一樣 spec: #定義pod的詳細信息 containers: #定義pod中容器列表,可以定義多個pod - name: nginx-container #容器名稱 image: nginx:1.20 #容器鏡像 imagePullPolicy: Always #鏡像拉取策略 ports: #定義容器端口列表 - containerPort: 80 #定義一個端口 protocol: TCP #定義協(xié)議 name: http #端口名稱 - containerPort: 443 protocol: TCP name: https env: #給容器傳遞環(huán)境變量 - name: "password" #變量名稱,必須引號引起來 value: "123" #上面變量的值 - name: "age" value: "18"--- kind: Service apiVersion: v1 metadata: name: nginx-service labels: app: nginx-service-label #service資源的標簽 namespace: myserver #所在的命名空間,與上面控制器必須在同一個命名空間 spec: type: NodePort #service類型是NodePort ports: #定義訪問端口,一個service可以定義多個端口的映射關系 - name: http #定義協(xié)議名稱 port: 80 #定義service端口,它可以和pod,node端口都不同,它是K8S中一個獨立子網(wǎng) protocol: TCP #定義類型 targetPort: 80 #目標pod端口,當訪問宿主機30004端口時就會轉達到pod的80端口 nodePort: 30004 #手動指定node節(jié)點暴露的端口,如果沒有指定端口,那service會隨機分配一個端口 - name: https port: 443 protocol: TCP targetPort: 443 nodePort: 30443 selector: app: nginx-selector #這個標簽就是上面pod的標簽,service通過這個標簽來匹配對應的pod
2、創(chuàng)建資源
創(chuàng)建資源 # kubectl apply -f nginx.yaml 查看nginx pod已經啟動 root@k8s-deploy:~# kubectl get pod -A | grep nginx myserver nginx-deployment-766fc9dfdd-f488k 1/1 Running 0 8m11s 查看nginx-service已經創(chuàng)建 root@k8s-deploy:~# kubectl get svc -A | grep nginx-service default nginx-service NodePort 10.100.57.113 <none> 80:30004/TCP,443:30443/TCP 2m11s
3、訪問node節(jié)點的http協(xié)議的30004端口
因為service中定義了nodePort規(guī)則,因此要訪問nginx容器的80端口,直接訪問任意node節(jié)點的30004端口即可轉發(fā)到nginx容器的80端口
二、部署tomcat服務
1、編寫yaml文件
root@k8s-deploy:~# vim tomcat.yaml kind: Deployment apiVersion: apps/v1 metadata: name: tomcat-deployment namespace: myserver labels: app: tomcat-deployment-label spec: replicas: 1 selector: matchLabels: app: tomcat-selector template: metadata: labels: app: tomcat-selector spec: containers: - name: tomcat-container image: tomcat:7.0.109-jdk8-openjdk imagePullPolicy: Always ports: - containerPort: 8080 protocol: TCP name: http env: - name: "password" value: "123" - name: "age" value: "18" --- kind: Service apiVersion: v1 metadata: name: tomcat-serivce namespace: myserver labels: app: tomcat-service-label spec: type: NodePort #service有四種類型,默認是cluser ip ports: - name: http port: 80 protocol: TCP nodePort: 30005 targetPort: 8080 selector: app: tomcat-selector
2、創(chuàng)建資源
root@k8s-deploy:~# kubectl apply -f tomcat.yaml
3、訪問tomcat
可以訪問下node節(jié)點的30005端口,報404是因為還沒有頁面,下面進入tomcat容器中手動創(chuàng)建一個頁面
root@k8s-deploy:~# kubectl get pod -A | grep tomcat myserver tomcat-deployment-5576d59694-rv2sb 1/1 Running 0 7m16s 進入容器 root@k8s-deploy:~# kubectl exec -it nginx-deployment-7d7bd78b5c-v9mjs bash -n myserver root@tomcat-deployment-5576d59694-rv2sb:/usr/local/tomcat# cd webapps root@tomcat-deployment-5576d59694-rv2sb:/usr/local/tomcat/webapps# mkdir myapp root@tomcat-deployment-5576d59694-rv2sb:/usr/local/tomcat/webapps# echo "myapp web magedu n70" > myapp/index.jsp
而后再來訪問這個頁面就有內容了,說明現(xiàn)在tomcat服務是正常的
三、使用nginx代理tomcat服務
這個tomcat端口其實不是必須要暴露的,測試完后,我這里再把它注釋掉,去掉之后就沒有nodeport了,就是僅在K8S內部的一個cluser ip了 ,僅能在K8S內部訪問,下面用nginx代理tomcat服務,實現(xiàn)在K8S內部兩個服務之間通過service相互轉發(fā)
1、注釋
2、 注釋后再執(zhí)行下apply,可以看見tomcat-deployment是不變的,tomcat-serivce配置了
3、 查看tomcat service的名稱,下面配置nginx代理tomcat文件要用
4、修改nginx容器的配置文件
下面用nginx作為代理訪問tomcat,進入nginx容器中進行配置
root@k8s-deploy:~# kubectl get pod -A | grep nginx myserver nginx-deployment-766fc9dfdd-f488k 1/1 Running 0 8m11s 進入nginx容器 root@k8s-deploy:~# kubectl exec -it nginx-deployment-766fc9dfdd-f488k bash -n myserver root@nginx-deployment-766fc9dfdd-f488k:/etc/nginx# vim conf.d/default.conf
修改nginx容器的配置文件/etc/nginx/conf.d/default.conf (這是在nginx容器里配置的,配置如下圖),添加完配置后nginx -s reload重置下再curl訪問
全路徑訪問如下:
這里cluster.local是當時創(chuàng)建集群時候在hosts文件里定義的
可以看下當時定義的K8S集群域名
四、測試
訪問nginx的30004端口,就可以代理到tomcat服務了
可以看下nginx的日志,每當請求/myapp/index.jsp文件就由nginx通過tomcat service轉發(fā)給tomcat service后面的pod了
root@k8s-deploy:~# kubectl logs -f nginx-deployment-766fc9dfdd-nq4ck -n myserver 10.200.166.128 - - [18/Nov/2022:07:50:45 +0000] "GET /myapp/ HTTP/1.1" 200 21 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0" "-" 10.200.166.128 - - [18/Nov/2022:07:50:53 +0000] "GET /myapp/index.jsp HTTP/1.1" 200 21 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0" "-" 10.200.166.128 - - [18/Nov/2022:07:52:09 +0000] "GET /myapp/index.jsp HTTP/1.1" 200 21 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0" "-" 10.200.166.128 - - [18/Nov/2022:07:52:10 +0000] "GET /myapp/index.jsp HTTP/1.1" 200 21 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0" "-"
注意:
上面使用curl訪問的是tomcat-service,是因為nginx和tomcat都在同一個namesapce中,所以可以之間訪問名稱簡寫
如果不在一個namespace中需要名字全稱,如果不在一個namespace就需要把nginx容器里的配置文件修改 ,其中80端口可以不寫,因為這里調用的是service,而tomcat service的端口定義的就是80
因為在tomcat.yaml文件中定義的service 端口是80,所以在nignx配置文件中調用這個端口,這個80端口會轉給pod的8080端口
總結:
客戶端訪問node節(jié)點的30004端口,而后轉發(fā)到nginx-service, 如果nginx-pod是多副本的,再由nginx-service根據(jù)算法轉發(fā)給某個nginx-pod; 然后nginx-pod把請求轉發(fā)給tomcat-service,最后再由tomcat-service根據(jù)算法轉發(fā)給tomcat-pod進行處理
總結
到此這篇關于K8S內部pod之間相互調用案例的文章就介紹到這了,更多相關K8S內部pod相互調用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
k8s部署Pyroscope并分析golang性能瓶頸(最新推薦)
這篇文章主要介紹了k8s部署Pyroscope并分析golang性能瓶頸,Pyroscope支持多種編程語言并提供了豐富的性能數(shù)據(jù),可以幫助我們跟蹤應用程序的執(zhí)行情況,并根據(jù)收集到的數(shù)據(jù)來識別性能瓶頸,需要的朋友可以參考下2023-04-04Kubernetes核心組件實戰(zhàn)解析之API?Server與Scheduler的生產級應用指南
在Kubernetes集群中,kube-apiserver和kube-scheduler如同機場的塔臺控制系統(tǒng),一個負責全局通信調度,一個專注資源分配優(yōu)化,本文將深入解析這兩個核心組件在生產環(huán)境中的關鍵作用與實戰(zhàn)配置,需要的朋友可以參考下2025-03-03Hadoop 2.x與3.x 22點比較,Hadoop 3.x比2.x的改進
本文介紹了Hadoop3版本中添加的新功能,Hadoop 2和Hadoop 3的區(qū)別,在這篇文章中,我們將討論Hadoop 2.x與Hadoop 3.x之間的比較。感興趣的朋友跟隨小編一起看一下2018-09-09Rainbond對前端項目Vue及React的持續(xù)部署
這篇文章主要為大家介紹了Rainbond對前端項目Vue及React的持續(xù)部署,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04Kubernetes如何限制不同團隊只能訪問各自namespace實現(xiàn)
這篇文章主要為大家介紹了Kubernetes如何限制不同團隊只能訪問各自namespace實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04IoT邊緣集群Kubernetes?Events告警通知實現(xiàn)示例
這篇文章主要為大家介紹了IoT邊緣集群Kubernetes?Events告警通知實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02