一、service
Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。Service 是由 kube-proxy 组件,加上 iptables 来共同实现的。kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。
1.开启kube-proxy的ipvs模式
在 ipvs 模式下,kube-proxy 监视 Kubernetes 服务和端点,调用 netlink 接口相应地创建 IPVS 规则, 并定期将 IPVS 规则与 Kubernetes 服务和端点同步。 该控制循环可确保IPVS 状态与所需状态匹配。访问服务时,IPVS 将流量定向到后端Pod之一。
IPVS代理模式基于类似于 iptables 模式的 netfilter 挂钩函数, 但是使用哈希表作为基础数据结构,并且在内核空间中工作。 这意味着,与 iptables 模式下的 kube-proxy 相比,IPVS 模式下的 kube-proxy 重定向通信的延迟要短,并且在同步代理规则时具有更好的性能。 与其他代理模式相比,IPVS 模式还支持更高的网络流量吞吐量。
所有节点中 yum install -y ipvsadm
[root@server2 ~]# kubectl get pod
[root@server2 ~]# kubectl get pod -n kube-system
[root@server2 ~]# kubectl get all
[root@server2 ~]# kubectl delete svc liveness-http
[root@server2 ~]# kubectl get svc
[root@server2 ~]# yum install -y ipvsadm
[root@server2 ~]# ipvsadm -ln
[root@server2 ~]# kubectl -n kube-system get pod
将模式改为ipvs ,然后更新(就是删除之前的重新建立)
[root@server2 ~]# kubectl -n kube-system get svc
[root@server2 ~]# kubectl -n kube-system get cm
[root@server2 ~]# kubectl edit cm kube-proxy -n kube-system
mode: "ipvs"
[root@server2 ~]# kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
查看策略
[root@server2 ~]# ipvsadm -ln
查看其他节点策略:
IPVS 提供了更多选项来平衡后端 Pod 的流量。 这些是:
rr:轮替(Round-Robin)
lc:最少链接(Least Connection),即打开链接数量最少者优先
dh:目标地址哈希(Destination Hashing)
sh:源地址哈希(Source Hashing)
sed:最短预期延迟(Shortest Expected Delay)
nq:从不排队(Never Queue)
[root@server2 ~]# kubectl get pod -n kube-system
[root@server2 ~]# kubectl get pod -n kube-system -o wide
[root@server2 ~]# kubectl -n kube-system describe svc kube-dns
IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配service IP。
[root@server2 ~]# ip addrkube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod。
[root@server2 ~]# ipvsadm -ln
2.创建service:(ClusterIP方式)
[root@server2 ~]# mkdir service
[root@server2 ~]# cd service/
[root@server2 service]# vim clusterip.yml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: myapp
type: ClusterIP
[root@server2 service]# kubectl apply -f clusterip.yml
service/web-service created
[root@server2 service]# kubectl get svc
[root@server2 service]# ip addr
[root@server2 service]# ipvsadm -ln
创建副本:
[root@server2 ~]# cd pod/
[root@server2 pod]# ls
cronjob.yml daemonset.yaml deploy.yaml job.yml pod1.yml pod.yml
[root@server2 pod]# cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[root@server2 pod]# kubectl apply -f deploy.yaml
deployment.apps/myapp-deployment created
[root@server2 pod]# kubectl get pod
[root@server2 service]# kubectl get pod --show-labels
[root@server2 service]# kubectl describe svc web-service
curl IP
[root@server2 service]# kubectl get pod -n kube-system
[root@server2 service]# kubectl get svc -n kube-system[root@server2 service]# kubectl run -it demo --image=busyboxplus
kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod
3.无头服务
Headless Service不需要分配一个VIP,而是直接以DNS记录的方式解析出被代理Pod的IP地址。
[root@server2 service]# ls
clusterip.yml
[root@server2 service]# kubectl delete -f clusterip.yml
service "web-service" deleted
[root@server2 service]# vim clusterip.yml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
p