飞天使-k8s知识点11-kubernetes资源对象4-svc

文章目录

概述

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是一个抽象层,为应用程序提供了一种稳定的网络终结点,并提供了负载均衡和服务发现等功能。它的存在简化了应用程序的访问和部署,提高了应用程序的可靠性和可伸缩性。

参考资料: 马哥 杰哥

相关推荐
对许12 分钟前
FusionInsight MRS云原生数据湖
云原生·fusioninsight·mrs
桂月二二1 小时前
基于WebAssembly的云原生运行时:重新定义轻量化微服务架构
云原生·架构·wasm
阿里云云原生2 小时前
深度测评国产 AI 程序员,在 QwQ 和满血版 DeepSeek 助力下,哪些能力让你眼前一亮?
云原生
张晋涛4 小时前
KCD 北京站丨云原生与AI的双向奔赴,超强Speakers阵容公开
云原生·aigc·线下活动
梦游钓鱼4 小时前
在window终端创建docker容器的问题
运维·docker·容器
StableAndCalm6 小时前
什么是zookeeper
分布式·zookeeper·云原生
SelectDB技术团队6 小时前
云原生时代的架构革新,Apache Doris 存算分离如何实现弹性与性能双重提升
大数据·数据库·云原生·doris·存算分离
海鸥818 小时前
在 k8s中查看最大 CPU 和内存的极限
linux·容器·kubernetes
rocksun9 小时前
使用GITOPS简化KUBERNETES实施:最佳实践
kubernetes