k8s-service服務,四種類型(CluserIP,NodePort,LoadBalancer,ExternalName)


1、暴露應用service服務

用來做負載均衡,同時向集群暴露服務,一個service就等同於一個微服務

# 關聯哪些POD,標簽
# 怎樣暴露服務,開端口

apiVersion: v1
kind: Service
metadata:
  name: service
spec:
  selector:
    release: stable
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: "TCP"
    - name: https
      port: 443
      targetPort: 443
      protocol: "TCP"
      
######################
selector: //標簽選擇器
    release: stable //有release=stabl的標簽,kubectl get pod --show-labels

- name: http
      port: 80  //向外暴露端口
      targetPort: 80  // 容器內部端口
      protocol: "TCP" //以什么方式暴露,默認tcp
######################

userspace

以前userspace:
client pod 要訪問server pod時,它先將請求發給本機內核空間中的service規則,由它再將請求轉發給監聽在指定套接字上的kube-proxy,kube-proxy處理完請求,並分發請求到指定server pod后,再將請求遞交給內核空間中的service,由service將請求轉給指定的server pod。由於其需要來回在用戶空間和內核空間交互通信,因此效率很差

iptables-軟件

現在iptables-軟件方式:
直接由內核中的iptables規則,接收client請求,並處理完成后,直接轉發給指定serverpod。這種方式不再將請求轉發給kube-proxy,性能提升很多

ipvs模型-建議使用

	在ipvs模式下,kube-proxy監視kubeernetes服務和端點,調用netlink接口相應地創建ipvs規則,並定期將ipvs規則與kubernetes服務和端點同步。改控制循環可確保ipvs狀態匹配。訪問服務時,ipvs將流量定向到后段pod之一。
	ipvs代理模式基於類似於iptables模式的netfilter掛鈎函數,但是使用哈希表作為基礎數據結構,並且在內核空間中工作。這意味着,與iptables模式下的kube-proxy相比,ipvs模式下的kube-proxy重定向通信的延遲要短,並且在同步代理規則時具有更好的性能。與其他代理模式相比,ipvs模式還支持更高的網絡流量吞吐量。

設置ipvs模型

設置kube-proxy中
詳情:查看二進制部署

KUBE_HOSTNAME="192.168.0.214"
HOSTNAME=`hostname`
cat > /etc/kubernetes/cfg/kube-proxy-config.yml << EOF
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: ${KUBE_HOSTNAME}
healthzBindAddress: ${KUBE_HOSTNAME}:10256
metricsBindAddress: ${KUBE_HOSTNAME}:10249
clientConnection:
  burst: 200
  kubeconfig: /etc/kubernetes/cfg/kube-proxy.kubeconfig
  qps: 100
hostnameOverride: ${HOSTNAME}
clusterCIDR: 10.96.0.0/16
enableProfiling: true
mode: "ipvs"
kubeProxyIPTablesConfiguration:
  masqueradeAll: false
kubeProxyIPVSConfiguration:
  scheduler: rr
  excludeCIDRs: []
EOF

2、service當中的四種類型-CluserIP,NodePort,LoadBalancer,ExternalName

# CluserIP : 向集群內部暴露一個IP,外部無法訪問

# NodePort : 在宿主主機中開啟一個端口與負載均衡IP的端口一一對應,外界可以使用宿主主機的端口訪問集群內部服務,端口隨機,也可以固定端口。一般測試用,正式環境不實用,因為端口占用嚴重

# LoadBalancer:是實現暴露服務的另一種解決方案,它依賴於公有雲彈性IP實現

# ExternalName service 是sercice的一個特例,它沒有選擇器,也沒有定義任何端口。它的作用是返回集群外service的外部別名。它將外部地址經過集群內部的再一次封裝(實際上就是集群DNS服務器將CNAME解析到外部地址上),實現了集群內部訪問即可。例如你們公司的鏡像倉庫,最開始時用ip訪問,等到后面域名下來了再使用域名訪問。你不可能去修改每處的引用。但是可以創建一個ExternalName,首先指向到IP,等后面再指向域名

service主要作用

service主要作用:提供負載均衡
ingress主要作用:提供域名轉發

1.CluserIP和無頭service

# 修改type=CluserIP
kubectl edit service service
向集群內部暴露一個IP,外部無法訪問,隨機ip
type: CluserIP
CluserIP: None

CluserIP:集群內網ip
無頭service就是CluserIP沒有的service,主要作用:因為訪問可以直接用ingress域名端口轉發,所以可以不使用內網ip,占ip資源。一般給ingress使用
apiVersion: v1
kind: Service
metadata: 
  name: bike-service
  namespace: bike-namespace
spec:
  ports:
  - port: 8080
    targetPort: 8080
  selector:
    app: bike-pod //pod標簽名字
  sessionAffinity: None
  type: ClusterIP

2.NodePort

在宿主主機中開啟一個端口與負載均衡IP的端口一一對應,外界可以使用宿主主機的端口訪問集群內部服務,端口隨機,也可以固定端口。一般測試用,正式環境不實用,因為端口占用嚴重


NodePort服務是讓外部請求直接訪問服務的最原始方式,NodePort是在所有的節點上開放指定的端口,所有發送到這個端口的請求都會直接轉發到服務中的pod里;

這種方式不足:
1.一個端口只提供一個服務使用
2.只能使用30000-32767之間的端口
3.如果節點/虛擬機的IP地址發送變化,需要人工處理;
所以在生產環境,不推薦這種方式發布服務
# 修改type=NodePort
kubectl edit service service

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
kubernetes   ClusterIP   192.160.0.1     <none>        443/TCP                      7d4h
service      NodePort    192.175.3.121   <none>        80:31728/TCP,443:31976/TCP   3h11m


外部訪問:http://192.168.0.216:31728/,集群任何ip都可以

3.LoadBalancer

LoadBalancer:是實現暴露服務的另一種解決方案,它依賴於公有雲彈性IP實現
依賴於彈性ip向集群外部暴露服務的負載均衡

4.ExternalName

ExternalName:將其他鏈接設置一個集群內部的別名。代碼里面使用內部的別名。鏈接資源有變化,只需要修改鏈接,別名不用修改。否則需要大量的修改。無縫遷移。類似把其他鏈接定義一個全局變量,代碼內部使用變量,全局變量可以在配置文件修改
vi ExternalName.yaml填寫內容:

apiVersion: v1
kind: Service
metadata:
  name: baidu
spec:
  externalName: www.baidu.com
  type: ExternalName
  
kubectl apply -f externalname.yaml  //部署


[root@sg-14 service]# kubectl get svc
NAME         TYPE           CLUSTER-IP        EXTERNAL-IP     PORT(S)                      AGE
baidu        ExternalName   <none>            www.baidu.com   <none>                       11m


kubectl run test -it --rm --image=busybox:1.28.3 // 啟動進入容器內部,退出時刪除
nslookup [service名稱] // dns解析service的ip
nslookup baidu


[root@sg-14 service]# kubectl run test -it --rm --image=busybox:1.28.3
If you don't see a command prompt, try pressing enter.
/ # nslookup baidu
Server:    192.160.0.10
Address 1: 192.160.0.10 kube-dns.kube-system.svc.cluster.local

Name:      baidu
Address 1: 112.80.248.76
Address 2: 112.80.248.75
/ #

5.跨越名稱空間訪問服務

在mysql名稱空間內創建一個WordPress service,請問在default名稱空間內怎樣訪問這個Servier下的pod服務?

service名稱.命名空間.svc.cluster.local


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM