1. 程式人生 > >Kubernetes核心概念之Service詳解

Kubernetes核心概念之Service詳解

clusterip ips aml 開放 lan font led IT 架構

Service是k8s中非常重要的組成單元,作用是作為代理把在POD中容器內的服務發布出去,提供一套簡單的發現機制和服務代理,也就是運維常說的‘前端’概念,那麽它如何實現代理功能以及自動伸縮服務架構,下面將在本文中詳細說明。


技術分享圖片

Service主要的功能是映射pod對應的端口到宿主機上(代理),或是做負載均衡,還可以將內部IP發布成外部IP

一.服務代理

1.首先創建RC的Pod(使用的是上一節的腳本)

vim rc.json

{
"apiVersion": "v1",
"kind": "ReplicationController",
"metadata": {        //設置rc的元數據
    "name": "nginx-rc"
},
"spec": {            //設置rc的具體規格
    "replicas": 2,    //設置Pod的具體數量
    "selector": {        //通過selector來匹配相應的Pod的label
        "name": "myservice"
    },
    "template": {    //設置Pod的模板
        "metadata": {
            "labels": {
                "name":"myservice"
        }
    },
        "spec": {
                "containers": [{
                       "name": "nginx",
                       "image": "nginx",
               "imagePullPolicy": "IfNotPresent",    //鏡像拉取策略,分為Always,Never,IfNotPresent,默認是Always
                       "ports": [{
                          "containerPort": 80
           }]
            }]
          }
    }
}
}

kubectl create -f rc.json

kubectl get pod

技術分享圖片

2.創建Service

①cat myservice.yaml

apiVersion: v1
kind: Service
metadata:
  name: myservice        #設定Service名稱,必須唯一
spec:
  selector:
    name: myservice        #要匹配的Pod的Label
  ports:                    #設置端口轉發規則
  - port: 80
    targetPort: 80
    protocol: TCP

②.kubectl create -f myservice.yaml

service "myservice" created

③.kubectl get service

技術分享圖片

現有兩個service,第一個是系統自動分配的service,下面一個可以看到咱們自己創建的service,訪問集群的IP是10.254.204.76,開放端口是80

④.kubectl describe service

技術分享圖片

Endpoints就是連接後端的Pod的容器的ip地址,因為通過Label成功連接上了Pod,現在訪問clusterip將被轉發到後端的Pod中

技術分享圖片

3.代理其他後端

①代理Mysql服務器

vim mysql-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    name: mysql
  ports:
  - port: 3306
    targetPort: 3306
    protocol: TCP

②設置後端ip(縮進一定要正確,不然會報錯)

apiVersion: v1
kind: Endpoints
metadata:
  name: mysql
subsets:
  - addresses:
      - ip: 192.168.66.109    #節點ip
    ports:
      - port: 3306

③創建Service和Endpoints

kubectl create -f mysql-endpoints.yaml-f mysql-service.yaml

④查看Endpoints

kubectl describe ep

技術分享圖片

二.自動更新

1.將Pod數量縮減為一個

kubectl scale replicationcontroller --replicas=1 nginx-rc

replicationcontroller "nginx-rc" scaled

kubectl get rc

技術分享圖片

2.查看Service更新情況

kubectl describe service

技術分享圖片

三.發布Service

由於代理ip10.254.204.76不能通過外部訪問,但是web服務需要暴露到外網,這就需要一層轉發機制

1.NodePort Service

①創建NodePort Service

vim nodeport-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
  type: NodePort

kubectl create -f nodeport-service.yaml

②查詢NodePort Service

kubectl describe service my-nginx

技術分享圖片

K8S創建了一個NodePort,範圍是3000-32767,這裏就可以通過30664端口訪問到web服務,形式是NodeIP:NodePort,如果NodeIP是外網IP則將把流量分發給後端服務器

二.LoadBalancer與外部ip的指定

1.可以再K8S上指定一個不由K8S維護的外部IP,在外部訪問時直接使用這個IP就可以把請求分發到後端服務器

①創建Service

vim loadbalancer.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
spec:
  selector:
    app: nginx
  externalIPs: ["121.100.110.88"]      #指定一個外部IP
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
  type: LoadBalancer        #類型負載均衡

kubectl create -f loadbalancer.yaml

②查詢LoadBalancer Service

kubectl describe service my-nginx

技術分享圖片

此時外部訪問這個集群的方式為,http://121.100.110.88:31119

其實Service的內容遠遠不止這些,這些是一些比較常用的功能,如果在平時用到可以參考一下,下節講解存儲Volume

Kubernetes核心概念之Service詳解