Service
1.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 设定)。
2IPVS模式的Service实现
安装并查看ipvs模块
yum install -y ipvsadm
lsmod |grep ip_vs
编辑ipvs模式到k8s配置中并应用
[root@server2 pod]# kubectl -n kube-system edit cm kube-proxy
mode: "ipvs"
[root@server2 pod]# kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
[root@server2 pod]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[root@server2 pod]# kubectl apply -f deployment.yaml
[root@server2 pod]# vim svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysvc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: myapp:v1
[root@server2 pod]# kubectl apply -f svc.yaml
查看后端IP: Endpoints
[root@server2 pod]# kubectl describe svc mysvc
多次访问,发现实现负载均衡
[root@server2 pod]# curl 10.109.170.62/hostname.html
3Service实现外部访问
NodePort方式
NodePort配置mysvc,可让外网进行访问
编辑mysvc 的svc配置文件,将type改为NodePort
编辑mysvc的svc配置文件
kubectl edit svc mysvc
查看svc修改信息
kubectl get svc
在控制端与node端都暴露出32285端口
外部直接访问端口即可,且发现实现负载均衡
进入容器内查看策略
kubectl run demo -it --image=busyboxplus --restart=Never
nslookup mysvc
查看svc的endpoint
kubectl -n kube-system describe svc kube-dns
解析的endpoint正是服务所在节点
kubectl -n kube-system get pod -o wide
Headless无头模式
外部访问,可直接访问服务名称
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
安装dig插件,查看解析的A记录
yum install -y bind-utils
dig -t -A nginx-svc.default.svc.cluster.local. @10.96.0.10
metallb结合LoadBalancer
通过指定负载均衡的service直接给定IP来对外访问。
创建项目metallb,将metallb镜像压入harbor仓库中。
修改kube-proxy的配置
[root@server2 pod]# kubectl edit configmap -n kube-system kube-proxy
strictARP: true
修改完成后,删除副本,副本自动创建,重新生成副本使得修改生效
kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
创建操作目录并进入
mkdir metallb
cd metallb/
vim metallb.yaml 注意镜像名称
编辑配置文件,给定IP,给定执行权限
vim configmap.yaml
chmod 755 configmap.yaml
应用metallb.yaml文件,查看ns节点是否健康
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
执行configmap.yaml
查看到cm中的配置信息已读取
kubectl apply -f configmap.yaml
kubectl get cm -n metallb-system
创建一个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
执行lb-svc.yaml并查看svc状态
可以看到分配到了 172.25.14.10 处于前面定义的10-20之间
kubectl apply -f lb-svc.yaml
kubectl get svc
集群外部访问分配的IP实现负载均衡
ipvsadm -ln看到负载均衡也已加入进来
ExternalIP
需要外部添加IP到网卡中才可生效!
将前面实验的lb-svc删掉!!
[root@server2 metallb]# vim ext-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.14.100
应用并查看svc
查看当前配置,发现ip172.25.14.100已经出现
ipvsadm -ln
此时在真机上访问172.25.14.100发现不能访问
原因是server3或server4上没有这个ip,需要我们手动为server3和server4添加
ip addr add 172.25.0.100/24 dev eth0
再次访问,显示成功
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