概述

pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况ip都会变, 那pod与pod 之间需要互相调用,肯定不能用ip, 因为ip不固定,这样,service的概念就出来了

clusterIP
集群内部容器访问地址,会生成一个虚拟IP 与pod不在一个网段。

NodePort  
会在宿主机上映射一个端口,供外部应用访问模式。

Headless CluserIP   
无头模式,无serviceip,即把spec.clusterip设置为None 。

LoadBalancer
使用外部负载均衡。

NodePort
指定暴露到宿主机的端口,不指定的话会随机分配个,分配的IP在apiserver的配置文件中指定了--service-node-port-range=30000-50000,表示只允许分配30000-50000之间的端口。

比如一个nginx应用需要能被外部访问,就需要配置类型为type=NodePort,并且需要配置下nodePort: 30002(指定固定端口),这样的话外部使用http://ip:30002就可以访问这个应用了。

也有一些内部服务是需要外部访问的,那就不需要到使用NodePort模式了。


service
工作模式: userspace,iptables,ipvs
userspace: 1.1-
iptables: 1/10-
ipvs: 1.11+

类型: ExternalName , ClusterIP , NodePort and  LoadBalander

ClusterIP(默认)- 在集群的内部 IP 上公开 Service。这种类型使得 Service 只能从集群内访问。
NodePort - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用<NodeIP>:<NodePort> 从集群外部访问 Service。是 ClusterIP 的超集。
LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部IP。是 NodePort 的超集。
ExternalName - 将 Service 映射到 externalName 字段的内容(例如 foo.bar.example.com),通过返回带有该名称的 CNAME 记录实现。不设置任何类型的代理。这种类型需要 kube-dns 的 v1.7 或更高版本,或者 CoreDNS 的 0.8 或更高版本。

资源记录:
   SVC_NAME.NS_NAME.DOMAIN.LTD.
   svc.cluster.local. 
   redis.default.svc.cluster.local.


kube-proxy监听着k8s-apiserver,一旦service资源发生变化(调k8s-api修改service信息),kube-proxy
就会生成对应的负载调度的调整,这样就保证service的最新状态。


• k8s集群内的service:selector指定pod,自动创建Endpoints
• k8s集群外的service:手动创建Endpoints,指定外部服务的ip,端口和协议


查看service 的ip
[root@kubeadm-master1 case2]# kubectl get svc
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes            ClusterIP   10.200.0.1       <none>        443/TCP        23d
test-nginx-service    NodePort    10.200.189.111   <none>        80:30004/TCP   22d
test-tomcat-service   NodePort    10.200.23.13     <none>        80:30005/TCP   22d
[root@kubeadm-master1 case2]# kubectl describe svc test-tomcat-service
Name:                     test-tomcat-service
Namespace:                default
Labels:                   app=test-tomcat-service-label
Annotations:              <none>
Selector:                 app=tomcat
Type:                     NodePort
IP Families:              <none>
IP:                       10.200.23.13
IPs:                      10.200.23.13
Port:                     http  80/TCP
TargetPort:               8080/TCP
NodePort:                 http  30005/TCP
Endpoints:                10.100.3.10:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
svc的yml
[root@kubeadm-master1 case2]# cat 2-svc_service.yml
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-80-service
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
  type: ClusterIP
  selector:
    app: ng-deploy-80
[root@kubeadm-master1 case2]# cat 3-svc_NodePort.yml
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-80-service
spec:
  ports:
  - name: http
    port: 81
    targetPort: 80
    nodePort: 30012
    protocol: TCP
  type: NodePort
  selector:
    app: ng-deploy-80

查看集群状态
[root@kubeadm-master1 case2]# kubectl  get po,ep,svc
NAME                                     READY   STATUS    RESTARTS   AGE
pod/client                               1/1     Running   0          16d
pod/net-test1                            1/1     Running   57         23d
pod/net-test2                            1/1     Running   6          23d
pod/nginx-deployment-67dfd6c8f9-5s6nz    1/1     Running   1          23d
pod/tomcat-deployment-6c44f58b47-4pz6d   1/1     Running   1          23d

NAME                            ENDPOINTS                                                      AGE
endpoints/kubernetes            108.181.252.210:6443,108.181.252.212:6443,192.168.1.209:6443   23d
endpoints/test-nginx-service    10.100.4.9:80                                                  23d
endpoints/test-tomcat-service   10.100.3.10:8080                                               23d

NAME                          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/kubernetes            ClusterIP   10.200.0.1       <none>        443/TCP        23d
service/test-nginx-service    NodePort    10.200.189.111   <none>        80:30004/TCP   23d
service/test-tomcat-service   NodePort    10.200.23.13     <none>        80:30005/TCP   23d
chatgpt解释
在Kubernetes(简称K8s)中,Service是一种抽象,用于定义一组Pod实例的访问方式和网络策略。

Service提供了一个稳定的网络终结点,使得应用程序可以通过Service进行访问,而无需关心后台的Pod实例。它主要有以下几个方面的功能和用途:

负载均衡:Service可以将流量均衡地分发到后端的多个Pod实例上。它为应用程序提供了一个统一的入口,并将请求分发给可用的Pod,从而实现负载均衡。
服务发现:Service为每个Pod实例分配了一个虚拟的IP地址和DNS名称。这使得其他的服务或应用程序可以通过Service的DNS名称来访问后端的Pod实例,而无需直接暴露每个Pod的IP地址。
稳定的网络终结点:Service的虚拟IP地址是稳定的,即使后端的Pod实例发生变化(例如扩容、缩容、重启等),Service的IP地址也不会改变。这意味着应用程序可以始终通过Service访问到可用的Pod实例。
健康检查:Service可以对后端Pod实例进行健康检查,以确保只有健康的Pod实例参与流量的分发。当某个Pod实例不健康时,Service会自动将其从流量分发中移除,避免将请求发送给不可用的实例。
总之,Kubernetes中的Service是一个抽象层,为应用程序提供了一种稳定的网络终结点,并提供了负载均衡和服务发现等功能。它的存在简化了应用程序的访问和部署,提高了应用程序的可靠性和可伸缩性。

参考资料: 马哥 杰哥

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐