1.隨記
service 隨記
流量負載組件
Service 4層網絡負載 TCP UDP
Ingress 7層網絡負載 Http https
kube-proxy 進程
service是一個概念,真正起作用的是kube-proxy ,當創建一個service時候,api-server會將對應的service信息保存到etcd中,kube-proxy監聽etcd的變化
生成對應的訪問規則,進行暴露服務
訪問規則: ipvs規則
ipvsadm -Ln 查看service的端口轉發
三種工作模式:
userspace:
kube-proxy 為service創建一個監聽端口,發向Cluster IP的請求會被iptables規則重定向到kube-proxy監聽的端口上
iptables:
iptables直接轉發到具體的pod,kube-proxy的作用是生成iptables規則
ipvs
類似iptables 支持輪訓算法
需要安裝ipvs內核模塊,否則會降級為iptables
開啓ipvs
ipvsadm -Ln 查看是否開啓了ipvs
kubectl edit cm kube-proxy -n kube-system
修改 mode: "ipvs"
kubectl delete pod -l k8s-app=kube-proxy -n kube-system
[root@node3 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.0.1:30857 rr
-> 10.244.2.40:80 Masq 1 0 0
-> 10.244.2.41:80 Masq 1 0 0
TCP 192.168.56.110:30857 rr
-> 10.244.2.40:80 Masq 1 0 0
-> 10.244.2.41:80 Masq 1 0 0
TCP 10.0.2.15:30857 rr
apiVersion: v1
kind: service
metadata:
name: service
namespace: dev
spec:
selector: #確定代理哪些pod,通過標籤進行選擇,具體實現是會被kube-proxy轉換成具體的訪問規則
app: nginx
type: #servie 類型 ClusterIP(默認值,k8s集羣內部自動分配虛擬ip,只能在集羣內部訪問),NodePort(將service指定的Node上的端口暴露給外部,可以實現外部訪問服務),LoadBalancer(使用外接的負載均衡完成負載分發) , ExternalName (把集羣外部的服務引入集羣內部,直接使用)
clusterIp: #虛擬服務的ip地址
sessionAffinity: #session親和性,支持ClientIP,None兩個選項,如果是同一個地址的請求,就將該請求打到同一個pod上去,None是設置沒有親和性
ports:
- protocol: TCP
port: 3017 #service端口
targetPort: 5009 #pod的端口
nodePort: 31122 #主機的端口
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-deployment
namespace: dev
spec:
replicase: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
iamge: nginx:1.18.0
ports:
- containerPort: 80
===============================================================clusterIp===================================
[root@node3 ~]# kubectl describe svc service-typ -n dev
Name: service-type
Namespace: dev
Labels: <none>
Annotations: <none>
Selector: app=nginx-pod
Type: ClusterIP
IP Families: <none>
IP: 10.1.97.97
IPs: 10.1.97.97
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.44:80,10.244.1.45:80,10.244.2.46:80
Session Affinity: None
Events: <none>
kubectl get endpoints -n dev
TCP 10.1.97.97:80 rr #rr輪詢
-> 10.244.1.44:80 Masq 1 0 0
-> 10.244.1.45:80 Masq 1 0 0
-> 10.244.2.46:80 Masq 1 0 0
service負載分發策略:
默認使用kube-proxy的輪詢策略
sessionAffinity: ClientIP #設置session親和性 ClientIP None 如果沒有設置就會使用kube-proxy的隨機或者輪詢
ipvsadm -Ln
--- 多了persistent
TCP 10.1.97.97:80 rr persistent 10800
-> 10.244.1.44:80 Masq 1 0 0
-> 10.244.1.45:80 Masq 1 0 0
-> 10.244.2.46:80 Masq 1 0 0
---
===============================================================clusterIp===================================
===============================================================HeadLiness===================================
如果沒有clusterIP的設置,默認的ClusterIP方式會自動找一個clusterIP
[root@node1 ~]# kubectl get svc -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service-type ClusterIP 10.1.113.241 <none> 80/TCP 114s
如果clusterIP: None 設置成None就會成為一個ClusterIP方式
[root@node1 ~]# kubectl get svc -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service-type ClusterIP None <none> 80/TCP 7s
就成為了無頭service
如果訪問可以通過查看pod容器裏面的域名來進行訪問
[root@node1 ~]# kubectl exec -it service-deployment-848c68b85-8jvcv -n dev /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cat /etc/resolv.conf
nameserver 10.1.0.10
search dev.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
[root@node1 ~]# kubectl exec -it service-deployment-848c68b85-8jvcv -n dev /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cat /etc/resolv.conf
nameserver 10.1.0.10
search dev.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
# exit
[root@node1 ~]#
[root@node1 ~]#
[root@node1 ~]# curl 10.1.0.10:80
curl: (7) Failed connect to 10.1.0.10:80; 拒絕連接
[root@node1 ~]# dig @10.1.0.10 service-deployment.dev.svc.cluster.local
10.1.0.10
service-deployment: service名稱
dev : 命名空間
svc.cluster.local :集羣默認域名
===============================================================HeadLiness===================================
===============================================================NodePort===================================
將service的端口映射到node上的端口上
type: NodePort
nodePort: 30005 #30000 32767
[root@node1 ~]# kubectl get svc -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service-type NodePort 10.1.1.248 <none> 80:30005/TCP 6s
===============================================================NodePort===================================