k8s学习笔记8——Service

容器带来的问题

  • 自动调度: 在Pod创建之前,用户无法预知Pod所在节点以及Pod的IP地址
  • 一个已经存在的Pod在运行过程中,出现故障,Pod也会在新的节点使用新的IP进行部署
  • 应用程序访问服务时,地址是不能经常转变的
  • 多个相同的Pod如何访问他们上面的服务

service服务原理

  • 自动感知: 服务会创建一个clusterIP,对应资源地址,不管Pod如何变化,服务总能找到对应的Pod,且clusterIP保持不变
  • 负载均衡: 若服务器后端对应多个Pod,则会通过IPTables/LVS规则 访问请求最终映射到Pod容器内部,自动实现多个容器的负载均衡
  • 自动发现: 服务创建时会自动在内部dns上注册域名
  • 域名: <service-name>.<namespace>.svc.cluster.local

 

Service可以看作是一组同类Pod对外的访问接口。

 

Service有4种类型:

  1. ClusterIP :默认值,系统自动分配的虚拟IP,只能在集群内部访问  
  2. NodePort :将Service通过指定Node上的端口暴露给外部,可在集群外部访问服务
  3. LoadBalancer :使用外部负载均衡器完成到服务的负载分发,此类型需要外部云环境
  4. ExternalName :把集群外部的服务引入集群内部,直接使用
  • 区别总结:
    • 访问范围:ClusterIP仅限集群内;NodePort需节点IP+端口;LoadBalancer/ExternalName可公网访问
    • 部署场景:ClusterIP适合内部通信;NodePort/LoadBalancer用于服务暴露;ExternalName用于映射外部资源

 

一. ClusterIP

image

 默认的ServiceType,通过集群内部IP暴露服务,该服务只能在集群内部访问

  • 默认类型: 实现Pod的自动感知与负载均衡,是最核心的服务类型,但ClusterIP不能对外发布服务,相对外发布服务只能使用NodePort或lngress
  • 工作原理: kube-proxy 是在所有节点上运行的代理,可以实现简单的数据转发,设置更新IPTables/LVS规则,服务创建时,还提供服务地址DNS自动注册与服务发现功能
  • 查看DNS IP: kubectl -n kube-system get service kube-dns
  • 解析域名的软件包: bind-utils
  • 创建service资源文件模板: kubectl create service clusterip mysvc --tcp=80:80 --dry-run=client -o yaml
 1 [root@master ~]# vim mysvc.yaml
 2 ---
 3 kind: Service       # 资源对象类型
 4 apiVersion: v1      # 版本
 5 metadata:           # 元数据
 6   name: mysvc       # 资源对象名称
 7 spec:               # 详细信息
 8   type: ClusterIP   # 服务类型
 9   clusterIP: 10.245.1.80 # 可以设置ClusterIP
10   selector:         # 选择算符
11     app: web        # Pod标签
12   ports:            # 端口
13   - protocol: TCP   # 协议
14     port: 80        # 监听的端口,service端口
15     targetPort: 80  # 后端服务器端口,pod端口

 1 ## 创建Service
 2 
 3 [root@master ~]# kubectl apply -f mysvc.yaml
 4 service/mysvc created
 5 [root@master ~]# kubectl get service
 6 NAME        TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S) AGE
 7 kubernetes  ClusterIP  10.245.0.1     <none>       443/TCP 9d
 8 mysvc       ClusterIP  10.245.186.38  <none>       80/TCP 8s
 9 
10 11 ## 域名解析 12 # 安装工具软件包 13 [root@master ~]# dnf -y install bind-utils 14 15 # 查看 DNS 服务地址 16 [root@master ~]# kubectl -n kube-system get service kube-dns 17 NAME TYPE LUSTER-IP EXTERNAL-IP PORT(S) AGE 18 kube-dns ClusterIP 10.245.0.10 <none> 53/UDP,53/TCP,9153/TCP 9d 19 20 # 域名解析测试 21 [root@master ~]# host mysvc.default.svc.cluster.local 10.245.0.10 22 Using domain server: 23 Name: 10.245.0.10 24 Address: 10.245.0.10#53 25 Aliases: 26 mysvc.default.svc.cluster.local has address 10.245.186.38

 

二. NodePort

[root@master ~]# vim mysvc1.yaml
---
kind: Service
apiVersion: v1
metadata:
  name: mysvc1
spec:
  type: NodePort # 服务类型
  selector:
  app: web
  ports:
  - protocol: TCP
    port: 80
    nodePort: 30080 # 映射端口号
    targetPort: myhttp
[root@master ~]# kubectl apply -f mysvc1.yaml
service/mysvc1 created
[root@master ~]# kubectl get service
NAME       TYPE      CLUSTER-IP     EXTERNAL-IP PORT(S)      AGE
kubernetes ClusterIP 10.245.0.1     <none>      443/TCP      3h53m
mysvc      ClusterIP 10.245.1.80    <none>      80/TCP       3h35m
mysvc1     NodePort  10.245.235.255 <none>      80:30080/TCP 15s

 

三. iptables & IPVS

  • Service的原理是基于iptables和IPVS实现的。
  • 当创建一个Service对象时,Kubernetes会为该Service创建一个虚拟IP地址,并将该地址绑定到一个iptables规则中。
  • 当Pods需要与该Service通信时,它们会向该虚拟IP地址发送请求,请求会被iptables规则捕获并转发到正确的Pods上。
  • 对于大规模生产环境,Kubernetes还支持使用IPVS来实现负载均衡和服务发现

IPVS和iptables规则有何区别?

IPVS和iptables规则都是Linux内核提供的功能,用于实现网络中的流量控制和路由。它们的主要区别在于它们的应用场景和实现方式。

iptables :

  iptables是Linux内核中的一个模块,提供了一个基于规则的防火墙和流量控制功能。iptables规则可以基于源IP地址、目标IP地址、端口号和协议等条件来过滤和转发流量。

  在Kubernetes中,iptables规则通常用于实现Service的负载均衡和服务发现功能

IPVS:

  IPVS是Linux内核中的另一个模块,提供了一个高效的负载均衡和服务发现功能。它使用一组IPVS规则来将流量路由到后端服务器上,并支持多种负载均衡算法。

  在Kubernetes中,IPVS可以用于替代iptables规则来实现更高效的负载均衡和服务发现功能

使用场景:

  • IPVS:负载均衡和服务发现功能更加高效和灵活,特别是在大规模生产环境中。但是,它需要更多的配置和管理工作,也需要系统管理员具备更深入的网络知识。
  • iptables:规则则更加简单易用,适合小规模和简单的网络环境。

 

四. NodePort & Ingress

ClusterIP不能对外发布服务,如果想对外发布服务可以使用NodePort 或Ingress

  • NodePort: 使用基于端口映射(默认值: 30000-32767)的方式对外发布服务,可以任意发布服务(四层)
  • Ingress: 使用Ingress控制器(一般由Nginx或HAProxy构成),用来发布http,https服务(七层,只能发布这俩个服务)
  • 7层负载均衡比4层负载均衡更加智能
  • 4层负载均衡比7层负载均衡更加简洁高效

1)获取Ingress

 1 # 创建文件夹
 2 [root@master ~]# mkdir ingress-controller
 3 [root@master ~]# cd ingress-controller/
 4  
 5 # 获取ingress-nginx,本次案例使用的是0.30版本
 6 [root@master ingress-controller]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
 7 [root@master ingress-controller]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
 8  
 9 # 修改mandatory.yaml文件中的仓库
10 # 修改quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
11 # 为registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
12 # 创建ingress-nginx
13 [root@master ingress-controller]# kubectl apply -f ./
14  
15 # 查看ingress-nginx
16 [root@master ingress-controller]# kubectl get pod -n ingress-nginx
17 NAME                                           READY   STATUS    RESTARTS   AGE
18 pod/nginx-ingress-controller-fbf967dd5-4qpbp   1/1     Running   0          12h
19  
20 # 查看service
21 [root@master ingress-controller]# kubectl get svc -n ingress-nginx
22 NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
23 ingress-nginx   NodePort   10.98.75.163   <none>        80:32240/TCP,443:31335/TCP   11h

2)创建Ingress

 1 [root@master ingress]# vim mying.yaml
 2 ---
 3 kind: Ingress              # 资源对象类型
 4 apiVersion: networking.k8s.io/v1 # 资源对象版本
 5 metadata:                  # 元数据
 6   name: mying              # 资源对象名称
 7 spec:                      # 资源对象定义
 8   ingressClassName: nginx  # 使用的类名称
 9   rules:                   # ingress规则定义
10   - host: nsd.tedu.cn      # 域名定义,没有可以不写
11     http:                  # 协议
12       paths:               # 访问的路径定义
13       - path: /            # 访问的url路径
14         pathType: Prefix   # 路径类型:Exact、Prefix
15         backend:           # 后端服务
16           service:         # 服务声明
17             name: mysvc    # 服务名称
18             port:          # 端口号声明
19               number: 80   # 访问服务的端口号
20  
21 [root@master ingress]# kubectl apply -f mying.yaml
22 ingress.networking.k8s.io/mying created
23 [root@master ingress]# kubectl get ingress
24 NAME   CLASS HOSTS       ADDRESS      PORTS AGE
25 mying  nginx nsd.tedu.cn 192.168.1.51 80    10s
26 [root@master ingress]# curl -H "Host: nsd.tedu.cn" http://192.168.1.51
27 Welcome to The Apache.

 

posted on 2025-09-19 15:30  Karlkiller  阅读(18)  评论(0)    收藏  举报

导航