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模式了。
工作模式: 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,端口和协议
[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>
[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
在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是一个抽象层,为应用程序提供了一种稳定的网络终结点,并提供了负载均衡和服务发现等功能。它的存在简化了应用程序的访问和部署,提高了应用程序的可靠性和可伸缩性。
参考资料: 马哥 杰哥