目录
一.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 设定)
二、IPVS模式
安装服务
yum install -y ipvsadm
lsmod |grep ip_vs
1.更改ipvs模式
更改配置文件的模式为ipvs
kubectl -n kube-system get cm
kubectl -n kube-system edit cm kube-system
修改未生效
ipvsadm -l
2.更新pod
更新kube-proxy pod
kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
再次查看
ipvsadm -ln
修改清单deployment.yaml 的镜像为myapp:v1
执行清单:
kubectl apply -f deployment.yaml
kubectl get pod
查看mysvc的详细信息:
kubectl describe svc mysvc
再次查看,刚才myapp节点生成的IP也出现了!
ipvsadm -ln
测试:访问IP
curl 10.102.253.86
可查看到访问次数
而且ip addr也可以看到这个ip!
三.kube-dns
k8s内内置dns解析服务,用于实现域名访问
kubectl -n kube-system get pod
kubectl -n kube-system get svc
创建并进入交互式pod,使用nslookup 命令查询dns记录,例如可以查看到mysvc的分配ip
kubectl run demo --image=busyboxplus -it --restart=Never
nslookup mysvc.default
可以查看详细信息,看到Endpoints
dns端口为9153
kubectl -n kube-system describe svc kube-dns
查看域名解析pod节点信息如 ip
kubectl -n kube-system get pod -o wide
测试访问IP
kubectl get svc
curl 10.102.253.86
四.Headless无头模式
Headless Service不需要分配一个VIP,而是直接以DNS记录的方式解析出被代理Pod的IP地址。
Pod滚动更新后,依然可以解析
vim headless.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: myapp
clusterIP: None
拉起容器,查看svc信息
进入容器终端查看解析
kubectl apply -f headless.yaml
kubectl get svc
kubectl run demo --image=busyboxplus -it --restart=Never
nslookup nginx-svc
可以直接访问服务名,也是负载均衡的!
curl nginx-svc/hostname.html
退出容器并删除demo
安装dig插件,查看解析的A记录
yum install -y bind-utils
dig -t -A nginx-svc.default.svc.cluster.local. @10.96.0.10
将deployment.yaml的版本更新V2
vim deployment.yaml
image: myapp:v2
`
执行清单:
可以看到解析的地址也变化了!
dig -t -A nginx-svc.default.svc.cluster.local. @10.96.0.10
kubectl describe svc nginx-svc
五、service实现外部访问
1.NodePort方式
编辑mysvc 的svc配置文件,将type改为NodePort
kubectl edit svc mysvc
type NodePort
我们可以查看到svc修改之后的类型变化了!
kubectl get svc
而且产生的端口在每个虚拟机都已经生成了!
netstat -antlp|grep 30548
可以直接在外部访问测试:实现了负载均衡!
curl 172.25.0.2:31641/hostname.html
将之前实验的pod节点demo删掉!
kubectl get pod
kubectl delete pod demo
进入容器中查看解析,自动写好了本地解析!
kubectl run demo --image=busyboxplus -it - --restart=Never
nslookup mysvc
cat /etc/resolv.conf
退出容器,删掉demo
2.metallb结合LoadBalancer
2.1.介绍
Kubernetes不提供网络负载均衡器的实现(LoadBalancer类型的服务)用于裸机集群。Kubernetes附带的Network LB的实现都是调用各种IaaS平台(GCP,AWS,Azure等)的粘合代码。如果您未在受支持的IaaS平台(GCP,AWS,Azure等)上运行,则LoadBalancers在创建时将无限期保持“待处理”状态。
裸机集群运营商只剩下两个较小的工具,即“ NodePort”和“ externalIPs”服务,可将用户流量引入其集群。这两个选项在生产用途上都有很大的缺点,这使裸金属集群成为Kubernetes生态系统中的二等公民。
MetalLB旨在通过提供与标准网络设备集成的Network LB实现来解决这种不平衡问题,从而使裸机群集上的外部服务也尽可能“正常运行”。
2.2.部署
修改kube-proxy的配置
kubectl edit configmap -n kube-system kube-proxy
strictARP: true
更新kube-proxy pod
kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
创建一个目录metallb专门用来存放metallb的文件:
需要真机打开路由策略,使得虚拟机可以上网
cd
mkdir metallb
cd metallb
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
修改metallb.yaml文件
主要是为了修改镜像的版本!
vim metallb.yaml
在server1:
在私有仓库中创建一个新的项目metallb
将镜像下载好,平且上传至私有仓库
[root@server1 harbor]# docker pull metallb/controller:v0.10。2
[root@server1 harbor]# docker pull metallb/speaker:v0.10.2
[root@server1 harbor]# docker tag metallb/speaker:v0.10.2 reg.westos.org/metallb/speaker:v0.10.2
[root@server1 harbor]# docker push reg.westos.org/metallb/speaker:v0.10.2
[root@server1 harbor]# docker tag metallb/controller:v0.10.2reg.westos.org/metallb/controller:v0.9.5
[root@server1 harbor]# docker push reg.westos.org/metallb/controller:v0.10.2
执行metallb.yaml清单:
kubectl apply -f metallb.yaml
kubectl get ns
查看metallb-system节点
kubectl -n metallb-system get all
kubectl -n metallb-system get pod
自动生成secrets memberlist
查看:
kubectl -n metallb-system get secrets
2.3.定义地址池
vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 172.25.0.10-172.25.0.20
执行configmap.yaml
查看到cm中的配置信息已读取
kubectl apply -f configmap.yaml
kubectl get cm -n metallb-system
2.4测试
我们创建一个svc进行测试
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
将之前实验的svc删掉!
kubectl get svc
kubectl delete svc nginx-svc
kubectl delete svc mysvc
执行lb-svc.yaml并查看svc状态:
可以看到分配到了前面定义的10-20之间的IP!!
kubectl apply -f lb-svc.yaml
kubectl get svc
集群外部访问分配的IP实现负载均衡
当然也可以ipvsadm -ln看到负载均衡已经加入进来:
在server2,3上都可以ip addr看到172.25.0.10都已经出现!!
3.ExternalIP
需要外部添加IP到网卡中才可生效!
将前面实验的lb-svc删掉!!
vim exc-ip.yaml
apiVersion: v1
kind: Service
metadata:
name: ex-service
spec:
selector:
app: myapp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
externalIPs:
- 172.25.0.100
执行exc-ip.yaml并查看SVC状态
查看当前配置的虚拟服务和RS的权重!
ipvsadm -ln
可以看到172.25.0.100已经出现!
但是此时在真机上访问172.25.0.100发现不能访问出现如下图情况:
为什么呢?
后面解决发现,是因为没有在server3或者server4上添加172.25.0.100的IP地址,因为他不能自动解析地址,需要手动添加!
ip addr add 172.25.0.100/24 dev eth0
然后访问就可以成功了!
curl 172.25.0.100
4.Externalname
通过给定域名访问解析
vim ex-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: www.westos.org
执行ex-svc.yaml后查看svc信息!
kubectl apply -f ex-svc.yaml
kubectl get svc
可以看到域名出现了!!
dig查看详细解析A记录
dig -t A my-service.default.svc.cluster.local. @10.96.0.10
编辑my-service
kubectl edit svc my-service
改为www.baidu.com
查看svc信息发现域名已经变化:
再次dig查看详细解析A记录
发现域名也变化了!
dig -t A my-service.default.svc.cluster.local. @10.96.0.10