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 设定)。
-
(1) ClusterIP模式
ClusterIP模式是Kubernetes默认的service模式,如果在创建service时不添加模式,则生成的service模式默认为ClusterIP
步骤一:编辑资源清单,创建pod和service
kubectl apply -f deployment.yaml #创建pod
kubectl apply -f service.yaml #创建service
kubectl get pod
kubectl get svc
步骤二:创建一个新的pod来访问,之前创建的pod和service
kubectl run test -it --image=reg.westos.org:5000/busyboxplus
curl 10.244.2.28 #访问pod
curl 10.100.86.173 #访问service
注意:这里的ClusterIP模式只能在集群内部进行访问,跨节点是不能够进行通信的。
-
Service 是由 kube-proxy 组件,加上 iptables 来共同实现的.
-
kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。
我们根据上面查询的宿主机当前的iptables规则可以看到,当前主机上已经存在很多iptables规则了,如果我们继续创建pod和service,那么宿主机上的iptables规则会越来越多,这样会消耗大量的CPU资源。
IPVS模式的service,可以使K8s集群支持更多量级的Pod,可以很好的实现pod的负载均衡
开启kube-proxy的ipvs模式实验
步骤一:在集群的所有节点安装ipvsadm
yum install ipvsadm -y
ipvsadm -l
步骤二:修改ipvs模式
kubectl edit cm kube-proxy -n kube-system #修改集群的kube-proxy模式为ipvs
步骤三:删除之前部署kubernetes时,默认创建的kube-proxy的pod,使我们刚刚修改的ipvs模式的pod被自动创建
kubectl get pod -n kube-system
kubectl get pod -n kube-system | grep kube-proxy
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}' #删除之前的kube-proxy的pod
kubectl get pod -n kube-system | grep kube-proxy
步骤四:在每个节点上查询lvs策略
ipvsadm -l
注意:当我们将service修改为ipvs的模式后,iptables上将不会再创建servic的iptables规则,而是在ipvs上创建规则
增加pod的副本数,则ipvs会自动增加策略
(2)NodePort模式
步骤一:直接更改已经创建好的service的type为NodePort
kubectl edit svc myservice #更改type
kubectl get svc #查看更改完type的service
kubectl describe svc myservice
步骤二:也可以通过编辑资源清单文件,来创建NodePort模式的service
vim service.yaml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx
type: NodePort
kubectl apply -y service.yaml
kubectl get svc
(3) LoadBalancer模式
LoadBalancer模式,等于是在NodePort的基础上,在外部添加了一个负载均衡调度器
- 在service提交后,Kubernetes就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端
步骤一:编辑service的资源清单文件,创建service
vim service.yaml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl get pod
kubectl get svc
步骤二:查看创建的service的具体信息
kubectl describe svc myservice
(4)ExternalName模式
ExternalName模式,是为了让集群来访问外部的资源
步骤一:编辑service资源清单文件,创建service
vim service.yaml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
# port:
# - protocol: TCP
# port: 80
# targetPort: 80
# selector:
# app: nginx
type: ExternalName
externalName: www.baidu.com
kubectl apply -f service.yasml
kubectl get svc
步骤二:解析域名
我们在编辑资源清单时,编辑的 externalName: www.baidu.com,解释域名时,可以在集群内部解析到www.baidu.com,说明集群可以访问集群外的资源
(5)service允许为其分配一个公有IP
步骤一:编辑资源清单文件
vim service.yaml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx
externalIPs:
- 192.168.43.120
kubectl apply -f service.yanl
kubectl get svc
步骤二:查看service的具体信息,以及测试从指定的外部端口来访问集群
kubectl describe svc myservice
ipvsadm -ln
curl 192.168.43.120
总结:上面所讲述的集中service的模式,其中ClusterIP模式是集群默认的service模式,而NodePort、LoadBalancer模式可以使得集群外部的主机来访问集群内部的资源,而ClusterIP模式只能允许集群内部的不同pod来进行相互访问资源。
2 通过域名来访问集群资源
Kubernetes 提供了一个 DNS 插件 Service
我们上面将servic的几种模式时,都是通过IP来进行访问的,其实Kubernetes里面有DNS插件,我们可以通过域名,也能进行对集群的访问
步骤一:编辑service的资源清单文件,创建service
vim service.yaml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx
type: ClusterIP
kubectl apply -f service.yaml
kubectl get svc
步骤二:创建pod,查看myservice的解析
kubectl attach test -it #连接我们之前创建好的test这个pod
nslookup myservice #解析myservcie
步骤三:查看Kubernetes为集群提供的DNS服务
kubectl get svc -n kube-system
-
Headless Service(也称为“无头服务”)
- Headless Service不需要分配一个VIP,而是直接以DNS记录的方式解析出被代理Pod的IP地址;
- 域名格式:
$(servicename).$(namespace).svc.cluster.local
步骤一 :编辑service资源清单文件,创建service
vim service.yaml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx
clusterIP: None
kubectl apply -f service.yaml
kubectl get svc
步骤二:查看创建的service的详细信息,通过pod来检测其地址信息,并且来访问
kubectl describe svc myservice
kubectl attach test -it
nslookup myservice
当然也可以使用dig来查看解析
kubectl attach demo -it
dig myservice.default.svc.cluster.local
步骤三:pod做滚动更新后,依然可以做解析
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: reg.westos.org:5000/myapp:v2
ports:
- containerPort: 80
kubectl apply -f deployment.yaml
kubectl get pod
kubectl attach demo -it
dig myservice.default.svc.cluster.local