【五】K8S_Service | ClusterIP模式(默认模式)| NodePort模式

Service概念

在Kubernetes(K8S)中,Service的用途和相关概念如下:

  1. 服务发现:Service充当了一组Pod的稳定网络地址和DNS名称的抽象。它提供了一种统一的方式,使得其他应用程序或服务可以通过Service的地址来访问这组Pod,而无需直接关注每个Pod的IP地址和变化。
  2. 负载均衡:Service可以在一组Pod之间实现流量的负载均衡。当多个Pod属于同一个Service时,Kubernetes会自动将流量分发到这些Pod中,以确保每个Pod都能够处理一部分请求,从而提高应用程序的可扩展性和性能。
  3. 服务类型:Service提供了不同的服务类型,包括ClusterIP、NodePort、LoadBalancer和ExternalName。
    • ClusterIP类型为Service分配了一个集群内部的虚拟IP地址,仅供集群内部的其他资源使用。
    • NodePort类型为Service在每个节点上绑定了一个固定的端口,使得外部客户端可以通过节点的IP地址和NodePort来访问该Service。
    • LoadBalancer类型通过云平台提供的负载均衡器实现外部流量的分发。
    • ExternalName类型允许将Service映射到集群外部的外部域名。
  4. 会话保持:Service可以通过启用sessionAffinity属性来实现会话保持。当会话保持被启用时,Kubernetes会尽可能将同一客户端的请求发送到同一个Pod,以维持会话的状态和连续性。
  5. DNS解析:创建Service后,Kubernetes会在集群的内置DNS服务器中自动生成相应的DNS记录。这使得其他应用程序可以通过Service的名称进行简单的DNS解析,而无需关心具体的IP地址和端口。
  6. 连接管理:Service提供了连接管理功能,包括连接超时和空闲连接回收等。这有助于优化资源利用、管理连接池,并提高应用程序的可靠性和性能。

通过使用Service,您可以实现应用程序的服务发现、负载均衡和网络访问等功能。它提供了一个抽象层,使得应用程序可以方便地与一组Pod进行通信,而无需了解每个Pod的具体细节和拓扑结构。同时,Service还可以与其他K8S资源对象(如Deployment、Pod)进行配合使用,提供灵活和可靠的服务管理功能。

案例:

首先在创建的deployment 的三副本每个容器里配置:

root@my-dep-5b7868d854-5mnx7:/# echo 1111111111111 > /usr/share/nginx/html/index.html 
root@my-dep-5b7868d854-5mnx7:/#
root@my-dep-5b7868d854-5m4444:/# echo 222222222222 > /usr/share/nginx/html/index.html 
root@my-dep-5b7868d854-5mnx7:/#
root@my-dep-5b7868d854-686868:/# echo 33333333333 > /usr/share/nginx/html/index.html 
root@my-dep-5b7868d854-5mnx7:/#

删除之前的service并创建新的service

[root@master ~]# kubectl delete service my-dep
[root@master ~]# kubectl expose deploy my-dep --port=8000 --target-port=80
service/my-dep exposed

也可以写一个yaml文件

apiVersion: v1
kind: Service   #服务类型
metadata:
  labels:
    app: my-dep
  name: my-dep    #服务名字
spec:
  selector:       #选择的哪些标签的pod下图有--show-labels
    app: my-dep
  ports:
  - port: 8000
  protocol: TCP
  targetPort: 80

查看新创建的service并观察特点

[root@master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP    4d17h
my-dep       ClusterIP   10.96.197.40   <none>        8000/TCP   38s
[root@master ~]# curl 10.96.197.40:8000
222222222222 /root
 
 
 
[root@master ~]# curl 10.96.197.40:8000
33333333333333333333
[root@master ~]# curl 10.96.197.40:8000
222222222222 /root
[root@master ~]# 

在容器内部用域名访问

[root@master ~]# kubectl exec -it my-dep-5b7868d854-5mnx7 -- /bin/bash
root@my-dep-5b7868d854-5mnx7:/# curl my-dep.default:8000 
222222222222 /root
root@my-dep-5b7868d854-5mnx7:/# curl my-dep.default:8000
222222222222 /root
root@my-dep-5b7868d854-5mnx7:/# curl my-dep.default:8000
1111111111111
root@my-dep-5b7868d854-5mnx7:/# 

Service网络模式

Service-ClusterIP模式(默认模式)

集群内使用service的ip:port就可以负载均衡的访问

Service-NodePort模式

--type=ClusterlP:集群内部的访问

--type=NodePort: 集群外也可以访间问

[root@master ~]# kubectl delete service my-dep
service "my-dep" deleted
 
 
[root@master ~]# kubectl expose deploy my-dep --port=8000 --target-port=80 --type=NodePort
service/my-dep exposed
[root@master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          4d22h
my-dep       NodePort    10.96.244.208   <none>        8000:32404/TCP   11s
[root@master ~]# curl 10.96.244.208:8000
222222222222
[root@master ~]# curl 10.96.244.208:8000
1111111111111
[root@master ~]# curl 10.96.244.208:8000
1111111111111

也可以通过node节点ip访问注意用的端口

[root@master ~]# curl 172.31.0.3:32404
1111111111111
[root@master ~]# curl 172.31.0.3:32404
33333333333
[root@master ~]# curl 172.31.0.3:32404
1111111111111

 

阅读剩余
THE END
诺言博客