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会在集群的外部再来做一个负载均衡设备,而这个设备需要外部环境支持的,外部服务发送到这个设备上的请求,会被设备负载之后转发到集群中

你可能感兴趣的:(K8S学习,学习)