一、service简述
Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应
用可以方便地实现服务发现和负载均衡。
service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)
类型:
- ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。
- NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIP。
- LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 :NodePort,此模式只能在云服务器上使用。
- ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过spec.externlName 设定)
二、IPVS模式的Service实现
安装并查看ipvs模块,编辑ipvs模式到k8s配置中
yum install -y ipvsadm
lsmod |grep ip_vs
kubectl -n kube-system get cm
kubectl -n kube-system edit cm
删除副本后才可生效,批量删除副本,自动生成新的副本,再次查看
ipvsadm -l
kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
ipvsadm -ln
访问任意服务svc,可查看到访问次数
curl 10.99.248.176
ipvsadm -ln
三、Service实现外部访问
1.ClusterIP
具体实现原理依靠kubeproxy组件,通过iptables或是ipvs实现,这种类型的service只能在集群内访问
创建svc.yaml
vim svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysvc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: myapp
kubectl apply -f svc.yaml
查看网卡
查看ClusterIP
kubectl get svc
server3访问
NodePort
基于ClusterIp,另外在每个Node上开放一个端口,可以从所有的位置访问这个地址。可通过yaml文件创建NodePort类型的service,若svc.yaml文件存在,则可直接修改
kubectl edit svc mysvc
查询svc
可看到主机端,服务端31786端口被打开
3.LoadBalancer
从外部访问 Service 的第二种方式,适用于公有云上的 Kubernetes 服务。这时候,你可以指定一个 LoadBalancer 类型的 Service。,在service提交后,Kubernetes就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端
更改kube-proxy配置 strictARP: true,修改后刷新生效
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")}'
从metallb官网上下载两个yaml文件,将namespace.yaml的内容放到metallb.yaml里,方便实验
wget https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
wget https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml
将namespace.yaml的内容放到metallb.yaml里,方便实验
须提前下载speaker:v0.10.2,controller:v0.10.2,修改metallb.yaml里的image地址
应用metallb.yaml文件
可以看到新的ns被创建出来
ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。
建立configmap.yaml并应用
vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 172.25.21.10-172.25.21.20
kubectl apply -f configmap.yaml
查看创建出的cm
创建lb-svc.yaml文件并应用
vim lb-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: lb-svc
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: myapp
type: LoadBalancer
3.ExternalName
建立ex-svc.yaml
vim ex-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: www.westos.org
应用后查看,svc的EXTERNAL-IP修改成了www.westos.org
解析一下这个服务的域名
dig -t A my-service.DEFAULT.SVC.CLUSTER.LOCAL. @10.96.0.10