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的話就會報錯
這裏只能訪問域名