kubernets集羣-service

Service可以看作是一組提供相同服務的Pod對外的訪問接口。藉助Service,應用可以方便地實現服務發現和負載均衡。

•service默認只支持4層負載均衡能力,沒有7層功能。(可以通過Ingress實現)

•service的類型:

•ClusterIP:默認值,k8s系統給service自動分配的虛擬IP,只能在集羣內部訪問。

•NodePort:將Service通過指定的Node上的端口暴露給外部,訪問任意一個NodeIP:nodePort都將路由到ClusterIP。

•LoadBalancer:在 NodePort 的基礎上,藉助 cloud provider 創建一個外部的負載均衡器,並將請求轉發到 <NodeIP>:NodePort,此模式只能在雲服務器上使用。

•ExternalName:將服務通過 DNS CNAME 記錄方式轉發到指定的域名(通過 spec.externlName 設定)。

Service 是由 kube-proxy 組件,加上 iptables 來共同實現的.

先創建兩個pod

編輯我們的service.yaml

然後我們進去訪問IP地址

•kube-proxy 通過 iptables 處理 Service 的過程,需要在宿主機上設置相當多的 iptables 規則,如果宿主機有大量的Pod,不斷刷新iptables規則,會消耗大量的CPU資源。

•IPVS模式的service,可以使K8s集羣支持更多量級的Pod。

•開啓kube-proxy的ipvs模式:

•# yum install -y ipvsadm   //所有節點安裝

•$ kubectl edit cm kube-proxy -n kube-system  //修改IPVS模式

mode: "ipvs"

•$ kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'  //更新kube-proxy pod

利用linux 內核lvs實現負載均衡

首先我們在每個節點上安裝ipvsadm

編輯proxy文件

mode: "ipvs"

然後我們去觸發我們的修改

然後去查看我們的策略

如果我們把服務關掉

發現策略也沒了

也可以實現自動發現

Flannel vxlan模式跨主機通信原理

先在每個節點上安裝

如何讓1網段的地址訪問2網段

我們可以修改類型爲nodeport

我們可以發現當clusterIP類型被改爲nodeport的時候他的端口多了一個32636

我們渴也要通過其他的方式來訪問通過解析來訪問不一定通過IP地址

Kubernetes 提供了一個 DNS 插件 Service。

kubectl get services kube-dns --namespace=kube-system

kubectl run test  --image=busyboxplus -it

Headless Service “無頭服務Headless Service不需要分配一個VIP,而是直接以DNS記錄的方式解析出被代理Pod的IP地址。域名格式:$(servicename).$(namespace).svc.cluster.local

正常我們get svc的時候都會分配IP地址我們把clusterIP:None

即我們不需要IP地址

Pod滾動更新後,依然可以解析:

 kubectl delete pod --all

pod "deployment-nginx-58f549b56d-4qswl" deleted

pod "deployment-nginx-58f549b56d-7sz7c" deleted

pod "deployment-nginx-58f549b56d-gwswr" deleted

dig -t A nginx-svc.default.svc.cluster.local @10.96.0.10

...

;; QUESTION SECTION:

;nginx-svc.default.svc.cluster.local. IN  A

;; ANSWER SECTION:

nginx-svc.default.svc.cluster.local. 30  IN A  10.244.2.111

nginx-svc.default.svc.cluster.local. 30  IN A  10.244.1.120

nginx-svc.default.svc.cluster.local. 30  IN A  10.244.0.61

我們編輯我們的deploment.yaml將image的v1滾動跟新編程v2

更新完成後

我們編輯我們的service.yaml,添加類型爲:NodePort

從外部訪問 Service 的第二種方式,適用於公有云上的 Kubernetes 服務。這時候,你可以指定一個 LoadBalancer 類型的 Service。vim service.yaml

apiVersion: v1
kind: Service
metadata:
  name: lb-nginx
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
  selector:
      app: nginx
  type: LoadBalancer

在service提交後,Kubernetes就會調用 CloudProvider 在公有云上爲你創建一個負載均衡服務,並且把被代理的 Pod 的 IP地址配置給負載均衡服務做後端

從外部訪問的第三種方式叫做ExternalName。vim ex-service.yaml


apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type:  ExternalName
  externalName: www.westos.org

相當於在集羣內部可以直接訪問集羣外部

service允許爲其分配一個公有IP。vim service.yaml 

apiVersion: v1
kind: Service
metadata:
  name: ex-service
spec:
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  externalIPs:
  - 172.25.0.100

一種全局的、爲了代理不同後端 Service 而設置的負載均衡服務,就是 Kubernetes 裏的Ingress 服務

Ingress由兩部分組成:Ingress controller和Ingress服務

Ingress Controller 會根據你定義的 Ingress 對象,提供對應的代理能力。業界常用的各種反向代理項目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已經爲Kubernetes 專門維護了對應的 Ingress Controller。

應用ingress controller定義文件

運行我們的service-nodeport

創建ingress服務讓ingress調度myservice

首先創建一個myservice服務

定義一個單服務的ingress

我們再定義一個域名

然後在server4上我們還要做好解析

當創建多個清單的時候要用---隔開

如果我們訪問IP的話就會報錯

這裏只能訪問域名

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章