玩转k8s(四)—— 通过Service访问Pod

这篇具有很好参考价值的文章主要介绍了玩转k8s(四)—— 通过Service访问Pod。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        我们不应该期望k8s Pod是健壮的,而是要假设Pod中的容器很可能因为各种原因发生故障而死掉。Deployment等Controller会通过动态的创建和销毁Pod来保证应用整体的健壮性。换句话说,Pod是脆弱的,但应用是健壮的

        每个Pod都有自己的IP地址,当Controller用新的Pod替代发生故障的Pod时,新Pod会分配新的IP地址,这就产生了一个问题:如果一组Pod对外提供服务,它们的IP很有可能发生变化,那么客户端如何找到并访问这个服务呢?答案就是Service。

一、创建Service

K8s Service从逻辑上代表一组Pod,具体是哪些Pod则是由label来挑选的。Service有自己的IP,而且这个IP是不变的。客户端只需要访问Service的IP,k8s则负责建立和维护Service与Pod的映射关系。无论后端Pod如何变化,对客户端不会有任何影响,因为Service没有变。

(1)创建deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deployment
  labels:
    app: httpd
spec:
  replicas: 3
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: httpd
        image: httpd:latest
        ports:
        - containerPort: 80

(2)apply一下

zy@k8s-master:~$ kubectl apply -f httpd.yml 
deployment.apps/httpd-deployment created

(3)查看pod

pod分配了各自的IP,这些IP只能被Kubernetes Cluster中的容器和节点访问。

zy@k8s-master:~$ kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
httpd-deployment-59fc85cfcd-kz4m8   1/1     Running   0          92s   10.244.1.17   k8s-node1   <none>           <none>
httpd-deployment-59fc85cfcd-m2tc4   1/1     Running   0          92s   10.244.2.11   k8s-node2   <none>           <none>
httpd-deployment-59fc85cfcd-nz4x5   1/1     Running   0          92s   10.244.2.12   k8s-node2   <none>           <none>

(4)创建Service

编写service配置文件

apiVersion: v1
kind: Service
metadata:
    name: httpd-svc
spec:
    selector:
        run: httpd
    ports:
        - protocol: TCP
          port: 8080
          targetPort: 80

以上代码是 Kubernetes 中的 YAML 文件,用于创建一个名为 httpd-svc 的 Service 资源。该 Service 资源会将流量路由到拥有标签 run=httpd 的 Pod 上,同时将流量从端口 8080 转发到 Pod 中的端口 80。具体来说,代码的各个部分含义如下:

  • apiVersion: v1: 指定 Kubernetes API 版本为 v1,也就是最基本的 API 版本。
  • kind: Service: 指定创建的资源类型为 Service。
  • metadata: 定义元数据,包括资源的名称等信息。
  • name: httpd-svc: 指定该 Service 资源的名称为 httpd-svc
  • spec: 定义 Service 的规范,包括 Service 所要匹配的 Pod 标签以及端口信息。
  • selector: 指定 Service 所要匹配的 Pod 标签,这里是 run=httpd,表示该 Service 会将流量路由到所有拥有标签 run=httpd 的 Pod 上。
  • ports: 定义 Service 的端口映射规则,包括协议、端口号和目标端口号。这里的含义是将 Service 的 8080 端口映射到 Pod 中的 80 端口上。

apply一下:

zy@k8s-master:~$ kubectl apply -f httpd-service.yml 
service/httpd-svc created

查看service:

zy@k8s-master:~$ kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
httpd-svc    ClusterIP   10.98.248.61   <none>        8080/TCP   3m13s
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP    26h

(5)查看service的详细信息

y@k8s-master:~$ kubectl describe service httpd-service 
Name:              httpd-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=httpd,run=httpd
Type:              ClusterIP
IP:                10.102.206.215
Port:              http  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.21:80,10.244.1.22:80,10.244.2.16:80
Session Affinity:  None
Events:            <none>

endpoints罗列了三个Pod的IP和端口。我们知道Pod的IP是在容器中配置的,那么service的集群IP又是在哪里配置的呢?集群IP如何映射到pod的IP呢?答案是 iptables

二、外网如何访问Service

出来Cluster内部可以访问Service,很多情况下我们也希望应用的Service能够暴露给Cluster外部。K8s提供了多种类型的Service,默认是ClusterIP。

(1)ClusterIP

        Service通过集群内部的IP对外提供服务,只有Cluster内的节点和pod可访问,这是默认的service类型。

(2)NodePort

        service通过Cluster节点的静态端口对外提供服务。Cluster外部可以通过 <NodeIP>:<NodePort>访问Service

(3)LoadBalancer

        Service利用cloud provider 特有的负载均衡对外提供服务,云提供者负责将负载均衡的流量导向Service。文章来源地址https://www.toymoban.com/news/detail-446772.html

到了这里,关于玩转k8s(四)—— 通过Service访问Pod的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s~ingress_service_endpoint_pod四壮士

    在Kubernetes中,Service和Endpoints是两个重要的概念,它们之间存在着密切的关系。 Ingress :Ingress是一个k8s环境的网关,正常情况下,你外部的流量应该先指向ingress所有节点的IP,ingress的端口默认是80(http)和443(https),然后再由ingress进行域名传发到具体的service或者deployment上面。在

    2024年02月04日
    浏览(66)
  • 持续集成部署-k8s-服务发现-Service:Service、Endpoint、Pod之间的关系与原理

    在 Kubernetes 中, Service 是一种抽象的逻辑概念,用于将一组具有相同功能的 Pod 组合成一个逻辑服务。 Service 提供了一种稳定的 IP 地址和 DNS 域名,供客户端访问这个逻辑服务。同时, Service 还提供了负载均衡、会话保持等功能,可以很方便地实现服务发现与调用。 在 Kuber

    2024年02月06日
    浏览(51)
  • 云原生-k8s核心概念(pod,deploy,service,ingress,configmap,volume)

    Gitee-k8s学习 云原生实战-kubernetes核心实战 Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离 Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。 kubernetes很少直接控制Pod,一般都是通过Pod控制器来

    2024年02月03日
    浏览(84)
  • k8s如何访问 pod 元数据

    **我们在 pod 中运行容器的时候,是否也会有想要获取当前 pod 的环境信息呢?**咱们写的 yaml 清单写的很简单,实际上部署之后, k8s 会给我们补充在 yaml 清单中没有写的字段,那么我们的 pod 环境信息和容器的元数据如何传递到容器中呢?是不是也是通过获取这些 k8s 默认给

    2024年02月16日
    浏览(50)
  • k8s通过命令批量删除pod

    k8s批量删除失败的pod 查看所有的pod 选择STATUS列,查看某namespace的非Running的记录,比如: 解析: 获取所有的pods及其状态 筛选出命名空间kube-system的记录,默认视default grep选出带有Evicted字段pod 通过awk,获取第一列信息,也就是NAME 使用xargs指令,循环删除失败的pod

    2024年02月11日
    浏览(47)
  • Kubernetes 启动Pod的方法-Pod的调度算法-Pod间的通信-k8s的控制器-Pod资源控制-发布Service服务

    目录 Pod 参考文档:Pod | Kubernetes Pod配置文件:simple-pod.yaml 对master进行如下操作 Pod的状态有: 参考文档:(70条消息) Pod生命周期中的状态解释_pod状态_闹玩儿扣眼珠子的博客-CSDN博客 进入Pod内的nginx容器: 当我们创建一个Pod,其中的步骤是什么?(启动Pob的流程) 大概步骤:

    2024年02月13日
    浏览(71)
  • 从外部访问K8s中Pod的五种方式

    hostNetwork、 hostPort、 NodePort、 LoadBalancer、 Ingress 暴露Pod与Service一样,因为Pod就是Service的backend 这是一种直接定义 Pod 网络的方式。 如果在 Pod 中使用 hostNetwork:true 配置, pod 中运行的应用程序可以直接看到 pod 启动的主机的网络接口。 在主机的所有网络接口上都可以访问到该

    2024年02月12日
    浏览(38)
  • k8s外部访问pod内部容器的端口-NodePort

    Kubernetes的Pod IP和Cluster IP都只能在集群内部访问,而我们通常需要从外部网络上访问集群中的某些服务,Kubernetes提供了下述几种方式来为集群提供外部流量入口。 有一pod,里面有rabbitmq服务,先想从外部通过ip:15672访问MQ的管理员界面查看队列消费情况。 方法1(pod会重启): 方法

    2023年04月23日
    浏览(36)
  • k8s自定义Endpoint实现内部pod访问外部应用

    endpoint除了可以暴露pod的IP和端口还可以代理到外部的ip和端口 使用场景 公司业务还还没有完成上云, 一部分云原生的,一部分是实体的 业务上云期间逐步实现上云,保证各个模块之间的解耦性 比如使用云数据库或者实体数据库服务器啥的,因为像数据库实现容器化的话在

    2024年01月25日
    浏览(52)
  • 【Java】基于fabric8io库操作k8s集群实战(pod、deployment、service、volume)

    一开始了解到Java Api库操作k8s集群,有两个,分别为: kubernetes-client/java fabric8io/kubernetes-client 但个人对比使用了两个发现,还是 fabric8io更易用 ,用的人多是有道理的, fabric8io和yaml文件十分贴切 ,所以 通俗易懂 。本文前提是已配置好集群,已经熟悉了kubectl工具常用命令。

    2024年02月02日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包