k8s重器之Service

2021-01-07 紙鶴視界

Service是k8s的核心,通過創建Service,可以為一組具有相同功能的容器應用提供一個統一的入口地址,並將請求進行負載分發到各個容器應用上。

目錄:

Service定義詳解

Service基本用法

集群外部訪問Pod和Service

一、Service定義詳解

Service的定義比Pod簡單。

apiVersion: v1kind: Servicemetadata: name: string labels: name: string annotations: name: stringspec: type: string selector: name: string clusterIP: string #虛擬服務ip,預設默認分配 sessionAffinity: string #是否支持session,可選值為ClientIP,表示同一個客戶端 ports: - name: string protocol: string #埠協議,支持TCP、UDP,默認是TCP port: int #宿主機埠 targetPort: int #目標Pod的埠 nodePort: int #k8s內部埠 status: loadBalancer: ingress: ip: string hostname: string

上述定義中的spec.type有兩個選項:

當為NodePort時,需要配置nodePort映射到指定埠當為LoadBalancer,需要在status中設置外部負載均衡器二、Service基本用法

(1)通過yaml文件創建:

apiVersion: v1kind: Servicemetadata: name: nginx-servicespec: type: NodePort selector: name: nginx-pod ports: - name: nginx-service port: 80 targetPort: 80 nodePort: 30080

比如上述,定義了一個Service,對應的是具有key=name,value=nginx-pod這個標籤的Pod,type定義為NodePort,宿主機埠為80,對應Pod埠為80,而nodePort為30080

通過如下命令創建Service

kubectl create -f service-name.yaml

創建之後查看:

可看到Service被分配的ip,對應的port以及選擇的標籤信息

(2)負載均衡

目前k8s提供了兩種負載均衡策略:RoundRobin和SessionAffinity

1、RoundRobin:輪詢模式

2、SessionAffinity:基於客戶端IP位址進行會話保持模式,請求第一次到哪個Pod,則後續還會繼續轉發到那個Pod。

默認情況下,採用輪詢模式,但也可以 通過設置spec.sessionAffinity設置為ClientIP啟用SessionAffinity策略

接下來驗證一下默認的輪詢模式:

創建兩個具有key=name,value=nginx-pod標籤的Pod,容器內運行nginx。

nginx-one:

apiVersion: v1kind: Podmetadata: name: nginx-pod1 labels: name: nginx-podspec: containers: - name: nginx-pod1 image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80

nginx-two:

apiVersion: v1kind: Podmetadata: name: nginx-pod2 labels: name: nginx-podspec: containers: - name: nginx-pod2 image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80

創建完兩個容器之後,分別進入兩個容器修改nginx首頁的字樣。

進入容器:

kubectl exec -it nginx-pod1 /bin/bash

找到文件並進行修改,此處需要注意的是,由nginx鏡像創建的容器並不具有vim和vi這兩個編輯工具,所以這邊使用sed或echo都行

sed命令替換字符串格式是:

sed -i 's/需要被替換字符串/替換後字符串/g' file-namesed -i 's/Welcome to nginx!/Welcome to nginx-pod two!/g' /usr/share/nginx/html/index.html

修改好後在瀏覽器訪問:使用ip:nodePort訪問

可以看到,service進行了負載均衡處理。

三、集群外部訪問Pod和Service

(1)將Pod的埠號映射到宿主機

比如將上述的nginx-pod1映射到主機的20080埠:

apiVersion: v1kind: Podmetadata: name: nginx-pod1 labels: name: nginx-podspec: containers: - name: nginx-pod1 image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 hostPort: 20080

然後查看此Pod在哪個節點上運行

然後在瀏覽器中訪問此節點的20080埠:

(2)通過設置Pod級別的hostNetwork=true

該Pod的所有容器的埠號都將被直接映射到宿主機上,需要注意的是,如果不指定hostPort,則默認與containerPort一樣,如果指定 ,則hostPort必須等於containerPort。

例如將上述的nginx-pod2設置hostNetwork=true

apiVersion: v1kind: Podmetadata: name: nginx-pod2 labels: name: nginx-podspec: hostNetwork: true containers: - name: nginx-pod2 image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80

查看pod創建後在哪個節點上

在瀏覽器上訪問:

(3)將Service的埠號映射到宿主機上

通過設置spec.type為NodePort,同時設置spec.ports.nodePort設置宿主機上的埠號。

例如在Service基本用法那一小節的Service定義,相應的使用也在那一節有

apiVersion: v1kind: Servicemetadata: name: nginx-servicespec: type: NodePort selector: name: nginx-pod ports: - name: nginx-service port: 80 targetPort: 80 nodePort: 30080

===============================

我是Liusy,一個喜歡健身的程式設計師。

歡迎關注微信公眾號【Liusy01】,一起交流Java技術及健身,獲取更多乾貨,領取Java進階乾貨,領取最新大廠面試資料,一起成為Java大神。

來都來了,關注一波再溜唄。

相關焦點

  • 初識K8S之理論和搭建
    一、什麼是k8sk8s是分布式系統集中式管理。它可以看作是一個分布式系統支撐平臺。二、為什麼要用k8s,它有什麼好處1、 開發人員發布的是鏡像,鏡像裡面是包括環境和包括代碼。所以說本地和線上的運行環境是一樣的。不會存在本地可以。
  • 深入解析Kubernetes service 概念
    工作原理k8s在創建Service時,會根據標籤選擇器selector(lable selector)來查找Pod,據此創建與Service同名的endpoint對象,當Pod 地址發生變化時,endpoint也會隨之發生變化,service接收前端client請求的時候,就會通過endpoint,找到轉發到那個Pod進行訪問的地址。
  • 在K8S上部署rabbitmq集群-有狀態服務
    二、rabbitmq集群部署1、版本說明:因為考慮到較早版本rabbitmq在k8s上的集群部署是使用autocluster插件去調用kubernetes apiserver來獲取rabbitmq服務的endpoints,進而獲取node節點信息,並自動加入集群,但是現在
  • 教你一次性成功安裝K8S集群(基於一主兩從模式)
    systemctl start docker.service docker version 或者指定Docker的版本進行安裝,此時auto_install_docker.sh腳本文件的內容如下所示。
  • 《蹲坑學K8S》之23-1:安裝部署Istio
    [root@k8s-master ~]# kubectl get apiservices |grep metrics-server(4)檢查k8s集群環境是否滿足Istio部署條件[root@k8s-master ~]# istioctl x precheck1、生成安裝清單
  • K8S集群模式下fluent-bit日誌收集方案設計和實踐
    3、Kubernetes yaml實踐3.1、fluent-bit的配置存儲在Kubernetes中ConfigMap中apiVersion: v1kind: ConfigMapmetadata:  name: fluent-bit-config labels: k8s-app
  • 這麼笨的史丹利,是怎麼學會這該死的k8s容器化的?
    運維就要無所不知,無所不會不會k8s是真的不行!2、 為什麼有人很快就學會了`k8s`。今天和大家聊一聊k8s到底該怎麼學。其實,遇到這個問題的朋友是真的不少。有剛入行的新手朋友,也有已經在行業裡摸爬滾打了小10年的朋友。不管原因幾何,但總歸能側面看出k8s 確實有一些難度。
  • K8S知識點總結
    如果想用k8s管理應用,首先要把應用打包成容器鏡像(比如Docker鏡像),然後再用k8s管理容器。k8s典型應用場景:微服務場景,當請求流量增多,增加後臺服務數,流量減少隨之也減少服務數大數據場景,spark、flink等結合k8s的Namespace,實現多租戶資源隔離,比如白天可以多給在線計算分配工作節點、內存、cpu等資源,離線計算分配的少點;而到了凌晨,離線任務就要拉起來,多給離線計算分配資源,實時計算的就可以少些
  • 波記大師之作,典藏重器賀新歲
    著名收藏家王世襄談及自己的收藏之道時講到:「收藏之物,由我得之,由我遣之」。作為收藏大家,王世襄的樂趣在於通過傳統古舊器具來了解傳統製作工藝,「辨正文物之名稱;或是坐對琴案,隨手撫弄以賞其妙音;或是偶爾把玩,藉以獲得片刻清娛。」而今這樣的清娛之樂,在中山市波記家具有限公司(以下簡稱波記家具)便可隨心享有。
  • 戰艦世界國之重器 重巡洋艦阿爾及利亞
    導 讀 戰艦世界國之重器,阿爾及利亞是罰艦最後一艘中巡洋艦阿爾及利亞究竟有什麼把戲把眾人耍的沒脾氣,下面小編就給大家說說戰艦世界國之重器
  • 國之重器""三喜臨門"
    天舟一號讓走向深空更近一步,國產大飛機讓夢想翱翔於藍天之上,海域天然氣水合物試採成功向地球深部進軍……最近一段時間,很多人的「朋友圈」被「大國重器」的突破刷屏了。
  • 有一種「器」叫國之重器!那中國「重器」是什麼?絕不是飛機大炮
    意料之中的意料之外,2018年天津高考作文題目是:有一種「器」叫國之重器!材料說的一點都沒錯,有一種「器」叫國之重器,肩負榮光,成就夢想。那麼我國最霸氣最能稱得上國之重器的逆天神獸到底是什麼?沒有重器,保衛山河全憑血;沒有重器,守護家鄉靠肉堆;沒有重器,落後就要挨打;沒有重器,人家就敢騎在你的頭上撒尿!那麼所謂的重器就是能夠造飛機,坦克,大炮,軍艦的機器呢?然後並不是,這些東西很多國家都有,甚至保加利亞都有,甚至都有全套。
  • 「走進k8s」Docker 簡介和安裝(一)
    關於docker這塊從0開始已經寫了4個系列了,但是針對k8s還是有點怵,因為k8s確實比較麻煩裡面的東西比較複雜,而且針對k8s想走的更遠還是需要實踐
  • Kind + Docker 一鍵部署K8s集群
    所以業界也除了一些簡易版的K8s集群環境,比如K3S(5 less than k8s),本文蟲蟲給大家介紹也是這樣一個項目Kind,一鍵部署的單機K8S環境,可以用於學習、本地開發和CI環境。Windows如果有Chocolatey包管理器,則可以直接一鍵安裝choco install kindgo get源碼安裝也可以使用go get下載源碼編譯安裝:go get sigs.k8s.io
  • vSphere with Kubernetes實戰之:用戶訪問控制 - 文章精選 - CTI...
    from server (Forbidden): rolebindings.rbac.authorization.k8s.io is forbidden:  User "sso:Administrator@vsphere.local" cannot list resource "rolebindings" in API  group "rbac.authorization.k8s.io