1.K8s中的service和通信:
Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。 service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)
service的类型:
• ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。
• NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个 NodeIP:nodePort都将路由到ClusterIP。
• LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负 载均衡器,并将请求转发到 :NodePort,此模式只能在云服务器上使用。
• ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。
Service 是由 kube-proxy 组件,加上 iptables 来共同实现的.
• kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的 CPU资源。
• IPVS模式的service,可以使K8s集群支持更多量级的Pod。
k8s间的通信方式:
k8s通过CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannel, calico等。
CNI插件存放位置: cat /etc/cni/net.d/10-flannel.conflist
插件使用的解决方案如下:
虚拟网桥,虚拟网卡,多个容器共用一一个虛拟网卡进行通信。
多路复用: MacVLAN,多个容器共用- -个物理网卡进行通信。
硬件交换: SR-LOV, 一个物理网卡可以虚拟出多个接口,这个性能最好。
容器间通信:同一个pod内的多个容器间的通信,通过Io即可实现;
pod之间的通信:
同一节点的pod之间通过cni网桥转发数据包。
不同节点的pod之间的通信需要网络插件支持。
pod和service通信:通过 iptables 或 ipvs 实现通信,ipvs取代不了iptables,因为ipvs只能做负载均衡,而做不了nat转换。
pod和外网通信:iptables的MASQUERADE
Service与集群外部客户端的通信: Ingress、 NodePort、 Loadbalancer
2.kube-proxy的ipvs模式:
默认情况下:kube-proxy使用的是iptables模式,如果宿主机有大量的pod会浪费cpu来频繁更新iptables策略;
因此,使用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
安装ipvsadm,更改mode; 由于更改了模式,因此更新kube-proxy pod 最简单的就是删除让其重建;
等删除完成之后可以使用ipvsadm -ln 查看其中策略,可以看见service中的10.96.0.1和10.98.153.70在策略中使用rr调度;

同时:IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡: kube-ipvs0,并分配service IP。

使用ipvs模式下创建的pod都会在 kube-ipvs0,中分配到对应的service IP;
# demo.yml
---
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo2
spec:
replicas: 4
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v2
3.无头服务(Headless Services):
Headless Service “无头服务” 。 Headless Service不需要分配一个VIP,而是直接以DNS记录的方式解析出被代理 Pod的IP地址。
域名格式:$ (servicename).$(namespace).svc.cluster.local
yum install -y bind-utils.x86_64安装解析工具( dig )
[root@server11~]$ vim service.yml
[root@server11~]$ cat service.yml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: myapp
clusterIP: None
[root@server11~]$ kubectl apply -f service.yml
service/myservice created
[root@server11~]$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d11h
myservice ClusterIP None <none

最低0.47元/天 解锁文章
757





