目录
简介
service的类型:
IPVS 代理模式
实践
ClusterIP
Kubernetes 提供了一个 DNS 插件 Service
Headless无头模式
NodePort方式
LoadBalancer模式
ExternalName方式
Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)
ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。
NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIP。
LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到
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
刷新kube-proxy,模式改变
kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
rr轮询可见
修改Mode是添加了模块
lsmod | grep ip_vs
查看ip
IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配service IP。
kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod。
在创建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
kubectl run test --image=busyboxplus -it --restart=Never
以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
无ip有后端,访问
kubectl run test --image=busyboxplus -it --restart=Never
或者
yum install -y bind-utils
dig -t A web-service.default.svc.cluster.local. @10.96.0.10
svc ip以及dig查看
外部访问
负载均衡
修改type,立马生效,但不运行
适用于公有云上的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")}'
[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
kubectl apply -f namespace.yaml
kubectl get ns
kubectl apply -f metallb.yaml
kubectl get -n metallb-system pod
[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
外部访问
externalName Service是k8s中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把自己CNAME到你指定的另外一个域名上,可以提供集群内的名字,也可以指定外部真实域名。
外部无法访问
添加ip
外部访问