Service学习与使用
Kubernetes(简称为k8s)的Service是一种抽象,用于将Pod(容器实例)组合为逻辑服务。根据不同的需求和使用情况,Kubernetes提供了三种类型的Service:ClusterIP、NodePort和LoadBalancer。
ClusterIP(集群内部服务):
ClusterIP是默认的Service类型,它将Pod暴露为集群内部的稳定的虚拟IP地址。
只能从集群内其他Pod访问该Service,对集群外部不可见。
适用于内部微服务之间的通信,可以通过Service名称和端口号进行访问。
ClusterIP类型的Service通常不需要手动配置负载均衡策略。
NodePort(节点端口服务):
NodePort类型的Service会在每个节点上选择一个固定的端口,将外部流量转发到相应的Service。
外部用户可以通过集群任意节点的IP地址和这个端口访问Service。
适用于需要从集群外部访问Service的场景。
NodePort类型的Service需要手动配置负载均衡策略,一般结合cloud provider或者LoadBalancer类型使用。
LoadBalancer(负载均衡器服务):
LoadBalancer类型的Service会创建一个外部负载均衡器,并自动分配一个公网可访问的IP地址。
外部用户可以直接通过这个公网IP地址访问Service,负载均衡器会将请求转发到后端的Pod上。
适用于高可用性和可伸缩性要求较高的场景,例如需要在云服务商中使用其负载均衡器。
LoadBalancer类型的Service需要外部云服务商提供支持,并会产生额外费用。
这三种Service类型根据不同的需求和场景,可以很好地满足应用程序对于网络访问的要求。
ClusterIP(集群内部服务):
先创建容器
[root@k8s-master1 service]# cat tomcat-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
namespace: app
labels:
app: tomcat
spec:
replicas: 2
template:
metadata:
name: tomcat
labels:
app: tomcat
spec:
imagePullSecrets:
- name: registry-pull-secret
containers:
- name: tomcat
image: 192.168.21.121:5000/app/tomcat@sha256:6a1163fd0c216d0baf5020fb63198d8fddfd466c8449f6a9bcc2aa7ab387a9e9
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
restartPolicy: Always
selector:
matchLabels:
app: tomcat
[root@k8s-master1 service]# kubectl apply -f tomcat-deployment.yaml
[root@k8s-master1 service]# kubectl get pods -n app -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-6b8998566f-884rq 1/1 Running 0 2m34s 10.10.135.210 k8s-master3 <none> <none>
tomcat-6b8998566f-wjhkk 1/1 Running 0 3m55s 10.10.36.122 k8s-node1 <none> <none>
咱们分别在两个容器加上标签区别一下
[root@k8s-node1 ~]# curl http://10.10.36.122:8080/index/index.html
<h1>pod2</h1>
[root@k8s-node1 ~]# curl http://10.10.135.210:8080/index/index.html
<h1>pod1</h1>
[root@k8s-node1 ~]#
创建一个ClusterIP类型的Service
[root@k8s-master1 service]# cat tomcat-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
namespace: app
spec:
selector:
app: tomcat
ports:
- port: 8080
targetPort: 8080
type: ClusterIP
创建svc
[root@k8s-master1 service]# kubectl apply -f tomcat-svc.yaml
service/tomcat-svc created
#查看svc
[root@k8s-master1 service]# kubectl get svc -n app
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tomcat-svc ClusterIP 10.255.39.33 <none> 8080/TCP 44s
查看svc的详细信息,在这里有一个Endpoints列表,里面就是当前service可以负载到的服务入口
[root@k8s-master1 service]# kubectl describe svc tomcat-svc -n app
Name: tomcat-svc
Namespace: app
Labels: <none>
Annotations: <none>
Selector: app=tomcat
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.255.39.33
IPs: 10.255.39.33
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
Endpoints: 10.10.135.210:8080,10.10.36.122:8080
Session Affinity: None
Events: <none>
咱们通过svc的地址和端口访问tomcat服务可以看出他是两个pod负载均衡调度的
[root@k8s-node1 ~]# curl http://10.255.39.33:8080/index/index.html
<h1>pod1</h1>
[root@k8s-node1 ~]# curl http://10.255.39.33:8080/index/index.html
<h1>pod2</h1>
[root@k8s-node1 ~]# curl http://10.255.39.33:8080/index/index.html
<h1>pod1</h1>
[root@k8s-node1 ~]# curl http://10.255.39.33:8080/index/index.html
<h1>pod2</h1>
Service的sessionAffinity 亲和性简单了解一下
上面咱们配置的svc访问后面的tomcat服务是轮询的分别访问的两个pod;sessionAffinity 表示 session 亲和,目前可以有两种取值,一种是 None,也是默认值,表示没有,
会直接轮询 Pod。一种是 ClientIP,表示根据客户端 IP 亲和,同一个客户端 IP,会被发送到同一个 Pod 上。
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
namespace: app
spec:
sessionAffinity: ClientIP #增加亲和性的配置
selector:
app: tomcat
ports:
- port: 8080
targetPort: 8080
type: ClusterIP
[root@k8s-master1 service]# kubectl get svc -n app
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tomcat-svc ClusterIP 10.255.126.184 <none> 8080/TCP 47s
[root@k8s-master1 service]# kubectl describe svc tomcat-svc -n app
Name: tomcat-svc
Namespace: app
Labels: <none>
Annotations: <none>
Selector: app=tomcat
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.255.126.184
IPs: 10.255.126.184
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
Endpoints: 10.10.135.210:8080,10.10.36.122:8080
Session Affinity: ClientIP
Events: <none>
增加上亲和性的参数以后,同一个主机调度到tomcat服务主要集中在pod2上了
[root@k8s-node1 ~]# curl http://10.255.126.184:8080/index/index.html
<h1>pod2</h1>
You have new mail in /var/spool/mail/root
[root@k8s-node1 ~]# curl http://10.255.126.184:8080/index/index.html
<h1>pod2</h1>
[root@k8s-node1 ~]# curl http://10.255.126.184:8080/index/index.html
<h1>pod2</h1>
[root@k8s-node1 ~]# curl http://10.255.126.184:8080/index/index.html
<h1>pod2</h1>
NodePort类型的Service
在之前的实例中,创建的Service的IP地址只有集群内部才可以访问,如果希望将Service暴露给集群外部使用,那么就要使用到另外一种类型的Service,称为NodePort类型。NodePort的工作原理其实就是将Service的端口映射到Node的一个端口上,然后就可以通过NodeIp:NodePort来访问Service了
[root@k8s-master1 service]# cat tomcat-svc-3.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
namespace: app
spec:
sessionAffinity: ClientIP
selector:
app: tomcat
ports:
- port: 8080
targetPort: 8080
nodePort: 38888 #指定的映射到Node的一个端口,默认端口是30000-50000的范围
type: NodePort #类型指定为NodePort
#测试验证
[root@k8s-master1 service]# kubectl get pods -n app -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-6b8998566f-884rq 1/1 Running 0 45m 10.10.135.210 k8s-master3 <none> <none>
tomcat-6b8998566f-wjhkk 1/1 Running 0 46m 10.10.36.122 k8s-node1 <none> <none>
[root@k8s-master1 service]#
[root@k8s-master1 service]#
[root@k8s-master1 service]#
[root@k8s-master1 service]# curl http://192.168.21.122:38888/index/index.html
<h1>pod1</h1>
[root@k8s-master1 service]# curl http://192.168.21.100:38888/index/index.html
<h1>pod1</h1>
Service还有个类型,LoadBalancer类型的Service
LoadBalancer和NodePort很相似,目的都是向外部暴露一个端口,区别在于LoadBalancer会在集群的外部再来做一个负载均衡设备,而这个设备需要外部环境支持的,外部服务发送到这个设备上的请求,会被设备负载之后转发到集群中
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!