11、Service访问Pod、Service IP原理、DNS访问Service、外部访问service

本文详细介绍了Kubernetes中Service的创建、Service IP的工作原理、通过DNS访问Service的方法以及如何从外部访问Service,包括NodePort方式的实现与iptables的转发机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pod可能因为各种原因发生故障而死掉,Deployment等Controller会通过动态创建和销毁Pod来保障应用整体的健壮性。 Pod是脆弱的,但应用是健壮的
每个Pod都有自己的IP地址,当controller用新的Pod替代发生故障的Pod时,新Pod会分配到新的IP地址,那这时客户端如何找到并访问这个服务呢??-----Service
  

一、创建Service

Kubernetes Service从逻辑上代表一组pod,具体哪些Pod由label挑选。
Service有自己的IP,这个IP是不变的。客户端只需要访问Service的IP, Kubernetes则负责建立和维护Service与Pod的映射关系。无论后端Pod如何变化,对客户端不会有任何影响,因为Service没变。
# 编辑httpd_deployment.yaml  
apiVersion: apps/v1
kind: Deployment
metadata:                  
  name: httpd-deployment
spec:
  selector:
    matchLabels:
      app:  httpd  # 通过标签选择被控制的pod
  replicas:  3
  template:
    metadata:
      labels:
        app: httpd  # 给pod打上标签,Service、Deployment 将会用这个 label 来挑选 Pod
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80  # 转发到后端pod的端口号

Pod分配了各自的IP地址,但这些IP只能被Kubernetes Cluster中的容器与节点访问。

# 编辑httpd_service.yaml  
apiVersion: v1
kind: Service
metadata:
  name: httpd-service # 必填,service名称
spec:
  selector:
    app: httpd # 必填,在selector字段中指定了为哪一个标签的app进行负载均衡
  ports: # 将 Service 的 8080 端口映射到 Pod 的 80 端口,使用 TCP 协议
  - protocol: TCP
    port: 8080      # service监听端口
    targetPort: 80  # 转发到后端pod的端口号

httpd-service分配到一个CLUSTER-IP,可以通过该IP访问后端的httpd Pod

除了我们创建的 httpd-svc,还有一个 Service kubernetes,Cluster 内部通过这个 Service 访问 kubernetes API Server。
kubectl describe service httpd-service  查看service与Pod的对应关系

二、Service IP原理

Service的Cluster IP在哪里配置的?Cluster IP又是怎样与Pod IP映射的??---iptables
Service Cluster-ip是个虚拟的IP,是由kubernetes节点上iptables规则管理的。
通过  sudo iptables-save 命令打印当前节点的 iptables 规则,因输出较多,这里只截取与 httpd-service Cluster IP 10.98.165.152 相关的信息:
$ sudo iptables-save | grep '10.98.165.152'
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.98.165.152/32 -p tcp -m comment --comment 
Kubernetes中的Pod是最小的可部署的单元,它可以包含一个或多个容器,而Service则为Pod提供了一个稳定的网络访问地址。 Pod容器的Service的基本原理是,当一个Pod被创建时,它会被分配一个唯一的IP地址,并且每个Pod都有一个DNS名字。但是,这个IP地址DNS名字都是临时的,当Pod重新调度时,它们就会发生变化。这就意味着,如果想要从外部或其他Pod访问这个Pod,就需要一种稳定的方式来识别它。 这就是Service的作用。ServicePod提供了一个稳定的虚拟IP地址DNS名字,这个地址名字不会因为Pod的重新调度而改变。当Service接收到请求时,它会将请求转发给后端的Pod。这样,就可以通过Service来实现Pod的负载均衡、容错服务发现等功能。 操作Service的基本步骤如下: 1. 创建一个Service:使用kubectl create命令创建一个Service,并指定Service所要暴露的端口后端Pod的标签选择器。 2. 暴露Service:通过指定Service类型来暴露ServiceKubernetes支持四种类型的Service:ClusterIP、NodePort、LoadBalancerExternalName。 3. 访问Service:可以使用Service的虚拟IP地址或DNS名字来访问Service。如果使用NodePort类型的Service,则可以使用Node的IP地址端口号来访问Service。 4. 更新Service:可以使用kubectl edit命令或kubectl apply命令来更新Service的配置。 5. 删除Service:使用kubectl delete命令删除Service即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值