目录

简介

service的类型:

IPVS 代理模式

实践

ClusterIP

Kubernetes 提供了一个 DNS 插件 Service

Headless无头模式 

NodePort方式 

 LoadBalancer模式

ExternalName方式


简介

      Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。 

service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)

service的类型:

ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。

NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIP。

LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 <NodeIP>:NodePort,此模式只能在云服务器上使用。 ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。   

IPVS 代理模式

Service 是由 kube-proxy 组件,加上 iptables 来共同实现的. 

kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。 

IPVS模式的service,可以使K8s集群支持更多量级的Pod。

所有节点安装IPVS

yum install ipvsadm -y

修改成lvs 模式 master

kubectl edit cm kube-proxy -n kube-system

k8s 微服务通信 k8s微服务调用_p2p

 刷新kube-proxy,模式改变

kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

 rr轮询可见

k8s 微服务通信 k8s微服务调用_p2p_02

 修改Mode是添加了模块

lsmod | grep ip_vs

k8s 微服务通信 k8s微服务调用_k8s 微服务通信_03

 查看ip

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

k8s 微服务通信 k8s微服务调用_microservices_04

 kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod。

实践

ClusterIP

k8s 微服务通信 k8s微服务调用_microservices_05

 在创建service目录

[root@vm3 ~]# cd service/
[root@vm3 service]# vim clusterip.yml
[root@vm3 service]# cat clusterip.yml 
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
  selector:
      app: myapp
  type: ClusterIP

运行pod,轮询,查看svc web-service ip

kubectl get svc

k8s 微服务通信 k8s微服务调用_k8s 微服务通信_06

 

Kubernetes 提供了一个 DNS 插件 Service

kubectl run test  --image=busyboxplus -it --restart=Never

k8s 微服务通信 k8s微服务调用_Pod_07

Headless无头模式 

以DNS记录的方式解析出被代理Pod的IP地址,不需要通过Ip地址访问,可直接访问服务名称

[root@vm3 service]# vim clusterip.yml 
[root@vm3 service]# cat clusterip.yml 
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
  selector:
    app: myapp
  #type: ClusterIP
  clusterIP: None
[root@vm3 service]# kubectl apply -f clusterip.yml 
service/web-service created

k8s 微服务通信 k8s微服务调用_microservices_08

无ip有后端,访问

kubectl run test  --image=busyboxplus -it --restart=Never

k8s 微服务通信 k8s微服务调用_Pod_09

 或者

yum install -y bind-utils
dig -t A web-service.default.svc.cluster.local. @10.96.0.10

svc ip以及dig查看

k8s 微服务通信 k8s微服务调用_微服务_10

NodePort方式 

k8s 微服务通信 k8s微服务调用_k8s 微服务通信_11

 外部访问

k8s 微服务通信 k8s微服务调用_k8s 微服务通信_12

 负载均衡

k8s 微服务通信 k8s微服务调用_微服务_13

 LoadBalancer模式

修改type,立马生效,但不运行

k8s 微服务通信 k8s微服务调用_Pod_14

 适用于公有云上的Kubernetes 服务。
可以指定一个 LoadBalancer 类型的Service,在service提交后,Kubernetes就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端。

https://metallb.universe.tf/installation/

首先,更改kube-proxy配置

kubectl edit cm kube-proxy -n kube-system

kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

k8s 微服务通信 k8s微服务调用_k8s 微服务通信_15

 

[root@vm3 service]# mkdir metallb
[root@vm3 service]# cd metallb/

curl -o namespace.yaml https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
curl -o  metallb.yaml https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml

 将metallb.yaml中镜像放到仓库,修改image

k8s 微服务通信 k8s微服务调用_k8s 微服务通信_16

 

kubectl apply -f namespace.yaml
kubectl get ns

 

k8s 微服务通信 k8s微服务调用_微服务_17

kubectl apply -f metallb.yaml
kubectl  get -n metallb-system  pod

 

k8s 微服务通信 k8s微服务调用_microservices_18

[root@vm3 metallb]# cat configmap.yml 
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.25.7.100-172.25.7.250
[root@vm3 metallb]# kubectl apply -f configmap.yml 
configmap/config created

 

k8s 微服务通信 k8s微服务调用_微服务_19

外部访问

k8s 微服务通信 k8s微服务调用_p2p_20

 

ExternalName方式

externalName Service是k8s中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把自己CNAME到你指定的另外一个域名上,可以提供集群内的名字,也可以指定外部真实域名。

k8s 微服务通信 k8s微服务调用_p2p_21

k8s 微服务通信 k8s微服务调用_k8s 微服务通信_22

 指定ip

k8s 微服务通信 k8s微服务调用_microservices_23

 外部无法访问

添加ip

k8s 微服务通信 k8s微服务调用_k8s 微服务通信_24

外部访问

k8s 微服务通信 k8s微服务调用_微服务_25