目錄
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
