K8S内部pod之间相互调用案例和详解

这篇具有很好参考价值的文章主要介绍了K8S内部pod之间相互调用案例和详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、部署nginx容器

二、部署tomcat服务

三、使用nginx代理tomcat服务

四、测试


服务发现简介:

1、service是用于K8S的服务发现的重要组件,pod作为运行业务的承载方式,要想被客户端访问或者集群内部其它服务访问,就需要提供一个访问入口;

 2、传统来说ip+端口是普适的访问方式,但是pod是一种动态的资源,它会因故障被重建或重启,因而pod ip会发生变化,所以使用ip作为pod的访问入口并不合适;而K8S是通过service来充当pod与访问端的中间代理,要访问pod首先访问pod对应的service,再由service代理到对应的pod

3、而pod采用了标签来代替ip作为唯一标识,以供service筛选。service对应的也有标签选择器用来筛选pod标签

4、 而service本身是ipvs规则,是由kube-porxy组件生成的,这个规则只要不删除就会一直存在,但是删除了service ip也会发生变化,这样一来客户端仍有无法访问到service ip的风险

 5、因此K8S使用了DNS来记录service ip和service域名的记录,客户端使用域名就可以通过DNS中拿到对应的service ip了,而当service ip发生变化时,DNS也会动态的即使跟新到记录表中,这样即使service ip发生改变,仍然可以通过service的域名拿到对应的service ip,有了service ip就可以访问到Service 而后service代理到对应的pod上

service类型:(主要用两种)

        1、clusterIP:   在K8S集群内部通信使用,无法接入集群外部流量

        2、NodePort:  可以接入集群外部流量,在每个node节点监听一个和service定义的相同的端口,用于客户端的访问,把请求转发到对应的service,然后service再转发给pod; 用于将K8S服务暴露给K8S以外的客户端访问

注:serviceIP=clusterIP

NodePort 访问流程如下:

    客户端client ------->node_IP+端口------->cluster_IP+端口-------->pod_IP+端口

上面的访问流程可以看出NodePort类型还是需要借助clusterIP才能把集群外的访问引入到集群内

3、何为无头服务?

service的不同模式都是在上一种模式的基础上增强版,nodePort就是在clusterIP的基础上新增了功能,并不是一种新的功能模式,因为nodePort模式下客户端访问过程中还是要经过clusterIP的,这意味着clusterIP是service最基本要件,但也可以把这个clusterIP移除掉,而一旦No cluster,就称为无头服务了,无头服务的主要作用在于可以把服务名称(service_name)直接解析到后端的podIP;而本来只能解析到serviceIP
 

NodePort 示例:

部署nginx和tomcat这两个前后端服务pod,通过NodePort类型service 相互调用

一、部署nginx容器

1、编写yaml文件

root@k8s-deploy:~# vim nginx.yaml
kind: Deployment
apiVersion: apps/v1       #可查询它的api版本 kubectl explain deployment.apiVersion
metadata:               #定义pod元数据信息,可查询它的下级子字段kubectl explain deployment.metadata
  labels:               #定义deployment控制器标签
    app: nginx-deployment-label  #标签名称以键值形式定义,可以定义多个,这里标签是app值为nginx-deployment-label
  name: nginx-deployment   #deployment资源的名字
  namespace: myserver          #deployment所属的namespace,默认是defaule
spec:                   #定义Deployment中容器的详细信息,可通过kubectl explain deployment.spec查询
  replicas: 1           #定义创建出pod的副本数,默认值是1个pod
  selector:             #定义标签选择器,它跟上面的Deployment标签不是一回事,它是找下面template中定义的labels标签
    matchLabels:        #定义匹配的标签,必须要设置
      app: nginx-selector       #匹配的目标标签,控制器会拿这个标签匹配下面的pod
  template:             #定义模板,用来描述需要创建的pod作用
    metadata:           #定义模板元数据
      labels:             #这个labels会继承给这个yaml文件Deployment控制器创建的所有pod
        app: nginx-selector   #这个labels的key是app,值是nginx-selector,它会继承给下面的pod,和上面matchLabels.app: nginx-selector一样
    spec:                  #定义pod的详细信息
      containers:          #定义pod中容器列表,可以定义多个pod
      - name: nginx-container     #容器名称
        image: nginx:1.20       #容器镜像
        imagePullPolicy: Always                       #镜像拉取策略
        ports:                    #定义容器端口列表
        - containerPort: 80     #定义一个端口
          protocol: TCP           #定义协议
          name: http              #端口名称
        - containerPort: 443
          protocol: TCP
          name: https
        env:                      #给容器传递环境变量
        - name: "password"        #变量名称,必须引号引起来
          value: "123"            #上面变量的值
        - name: "age"
          value: "18"
---

kind: Service
apiVersion: v1
metadata:
  name: nginx-service
  labels:
    app: nginx-service-label   #service资源的标签
  namespace: myserver          #所在的命名空间,与上面控制器必须在同一个命名空间
spec:
  type: NodePort          #service类型是NodePort  
  ports:                  #定义访问端口,一个service可以定义多个端口的映射关系
  - name: http            #定义协议名称
    port: 80              #定义service端口,它可以和pod,node端口都不同,它是K8S中一个独立子网
    protocol: TCP         #定义类型
    targetPort: 80        #目标pod端口,当访问宿主机30004端口时就会转达到pod的80端口
    nodePort: 30004       #手动指定node节点暴露的端口,如果没有指定端口,那service会随机分配一个端口
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
    nodePort: 30443
  selector:
    app: nginx-selector   #这个标签就是上面pod的标签,service通过这个标签来匹配对应的pod

2、创建资源

创建资源
# kubectl apply -f nginx.yaml

查看nginx pod已经启动
root@k8s-deploy:~# kubectl get pod -A | grep nginx
myserver               nginx-deployment-766fc9dfdd-f488k            1/1     Running   0               8m11s

查看nginx-service已经创建
root@k8s-deploy:~# kubectl get svc -A | grep nginx-service
default                nginx-service               NodePort    10.100.57.113   <none>        80:30004/TCP,443:30443/TCP   2m11s

3、访问node节点的http协议的30004端口

因为service中定义了nodePort规则,因此要访问nginx容器的80端口,直接访问任意node节点的30004端口即可转发到nginx容器的80端口

k8s内部服务之间如何调用,kubernetes,运维,容器

二、部署tomcat服务

1、编写yaml文件

root@k8s-deploy:~# vim tomcat.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: tomcat-deployment
  namespace: myserver
  labels:
    app: tomcat-deployment-label
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat-selector
  template:
    metadata:
      labels:
        app: tomcat-selector
    spec:
      containers:
      - name: tomcat-container
        image: tomcat:7.0.109-jdk8-openjdk
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http
        env:
        - name: "password"
          value: "123"
        - name: "age"
          value: "18"

---
kind: Service
apiVersion: v1
metadata:
  name: tomcat-serivce
  namespace: myserver
  labels:
    app: tomcat-service-label
spec:
  type: NodePort  #service有四种类型,默认是cluser ip
  ports:
  - name: http
    port: 80
    protocol: TCP
    nodePort: 30005
    targetPort: 8080
  selector:
    app: tomcat-selector

2、创建资源

root@k8s-deploy:~# kubectl apply -f tomcat.yaml

3、访问tomcat

可以访问下node节点的30005端口,报404是因为还没有页面,下面进入tomcat容器中手动创建一个页面

root@k8s-deploy:~# kubectl get pod -A | grep tomcat
myserver               tomcat-deployment-5576d59694-rv2sb           1/1     Running   0             7m16s

进入容器
root@k8s-deploy:~# kubectl exec -it nginx-deployment-7d7bd78b5c-v9mjs bash -n myserver
root@tomcat-deployment-5576d59694-rv2sb:/usr/local/tomcat# cd webapps
root@tomcat-deployment-5576d59694-rv2sb:/usr/local/tomcat/webapps# mkdir myapp
root@tomcat-deployment-5576d59694-rv2sb:/usr/local/tomcat/webapps# echo "myapp web magedu n70" > myapp/index.jsp

而后再来访问这个页面就有内容了,说明现在tomcat服务是正常的

k8s内部服务之间如何调用,kubernetes,运维,容器

三、使用nginx代理tomcat服务

这个tomcat端口其实不是必须要暴露的,测试完后,我这里再把它注释掉,去掉之后就没有nodeport了,就是仅在K8S内部的一个cluser ip了 ,仅能在K8S内部访问,下面用nginx代理tomcat服务,实现在K8S内部两个服务之间通过service相互转发

 1、注释

k8s内部服务之间如何调用,kubernetes,运维,容器

2、 注释后再执行下apply,可以看见tomcat-deployment是不变的,tomcat-serivce配置了

k8s内部服务之间如何调用,kubernetes,运维,容器

 3、 查看tomcat service的名称,下面配置nginx代理tomcat文件要用

k8s内部服务之间如何调用,kubernetes,运维,容器

4、修改nginx容器的配置文件

下面用nginx作为代理访问tomcat,进入nginx容器中进行配置

root@k8s-deploy:~# kubectl get pod -A | grep nginx
myserver               nginx-deployment-766fc9dfdd-f488k            1/1     Running   0               8m11s

进入nginx容器
root@k8s-deploy:~# kubectl exec -it nginx-deployment-766fc9dfdd-f488k bash -n myserver
root@nginx-deployment-766fc9dfdd-f488k:/etc/nginx# vim conf.d/default.conf

 修改nginx容器的配置文件/etc/nginx/conf.d/default.conf  (这是在nginx容器里配置的,配置如下图),添加完配置后nginx -s reload重置下再curl访问

k8s内部服务之间如何调用,kubernetes,运维,容器

 全路径访问如下:k8s内部服务之间如何调用,kubernetes,运维,容器 这里cluster.local是当时创建集群时候在hosts文件里定义的

可以看下当时定义的K8S集群域名

k8s内部服务之间如何调用,kubernetes,运维,容器

四、测试

访问nginx的30004端口,就可以代理到tomcat服务了

k8s内部服务之间如何调用,kubernetes,运维,容器

 可以看下nginx的日志,每当请求/myapp/index.jsp文件就由nginx通过tomcat service转发给tomcat  service后面的pod了

root@k8s-deploy:~# kubectl logs -f nginx-deployment-766fc9dfdd-nq4ck -n myserver
10.200.166.128 - - [18/Nov/2022:07:50:45 +0000] "GET /myapp/ HTTP/1.1" 200 21 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0" "-"
10.200.166.128 - - [18/Nov/2022:07:50:53 +0000] "GET /myapp/index.jsp HTTP/1.1" 200 21 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0" "-"
10.200.166.128 - - [18/Nov/2022:07:52:09 +0000] "GET /myapp/index.jsp HTTP/1.1" 200 21 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0" "-"
10.200.166.128 - - [18/Nov/2022:07:52:10 +0000] "GET /myapp/index.jsp HTTP/1.1" 200 21 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0" "-"

注意:

上面使用curl访问的是tomcat-service,是因为nginx和tomcat都在同一个namesapce中,所以可以之间访问名称简写

如果不在一个namespace中需要名字全称,如果不在一个namespace就需要把nginx容器里的配置文件修改  ,其中80端口可以不写,因为这里调用的是service,而tomcat service的端口定义的就是80k8s内部服务之间如何调用,kubernetes,运维,容器

 因为在tomcat.yaml文件中定义的service 端口是80,所以在nignx配置文件中调用这个端口,这个80端口会转给pod的8080端口

总结:

客户端访问node节点的30004端口,而后转发到nginx-service, 如果nginx-pod是多副本的,再由nginx-service根据算法转发给某个nginx-pod;  然后nginx-pod把请求转发给tomcat-service,最后再由tomcat-service根据算法转发给tomcat-pod进行处理

k8s内部服务之间如何调用,kubernetes,运维,容器文章来源地址https://www.toymoban.com/news/detail-778365.html

到了这里,关于K8S内部pod之间相互调用案例和详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • k8s 不同node之间pod ip不通

    底层k8s使用calico网络,ipip网络模式,kubevirt启动了2台虚拟机;在这两台虚拟机上再搭建k8s,calico网络,ipip网络模式。 在虚拟机上的k8s上启动了2个pod,分布在不同的node上,这两个pod不能ping通对方的pod ip。 1、calico无问题; 2、主机路由无问题。 修改虚拟机之上的k8s集群的c

    2024年02月13日
    浏览(30)
  • 【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?

    首先来回顾一下Pod: Pod 是用于构建应用程序的最小可部署对象。单个 Pod 代表集群中正在运行的工作负载,并 封装一个或多个 Docker 容器、任何所需的存储以及唯一的 IP 地址 。 集群中每一个 Pod 都会获得自己的、 独一无二的 IP 地址。一个Pod里的一组容器共享相同的IP地址。

    2024年04月28日
    浏览(45)
  • K8s:一文认知 CRI,OCI,容器运行时,Pod 之间的关系

    博文内容整体结构为结合 华为云云原生课程 整理而来,部分内容做了补充 课程是免费的,有华为云账户就可以看,适合理论认知,感觉很不错。 有需要的小伙伴可以看看,链接在文末 理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守

    2024年02月09日
    浏览(28)
  • 案例分享-full gc导致k8s pod重启

     在之前的记一次k8s pod频繁重启的优化之旅中分享过对于pod频繁重启的一些案例,最近又遇到一例,继续分享出来希望能给大家带来些许收获。 报警群里突然显示某pod频繁重启,我随即上去查看日志,主要分这么几步:   1.查看pod重启的原因,kubectl descirbe pod 上面的Reason:

    2024年02月02日
    浏览(43)
  • 【k8s】pod详解

    Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象,一个pod代表着集群中运行的一个进程。kubernetes中其它大多数组件都是围绕着pod来进行支持和扩展pod功能的。 例如,用于管理pod运行的statefulset和deployment 等控制器对象,用于暴露应用的service和i

    2024年02月06日
    浏览(32)
  • K8s Pod详解

    每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的容器,数量可多可少 Pause容器,这是每个Pod都会有的一个 根容器 ,它的作用有两个: 可以以它为依据,评估整个Pod的健康状态 可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现

    2024年02月01日
    浏览(29)
  • k8s --pod详解

    目录 一、Pod基础概念 1、pod简介 2、在Kubrenetes集群中Pod有如下两种使用方式 3、pause容器使得Pod中的所有容器可以共享两种资源:网络和存储。 (1)网络 (2)存储 4、kubernetes中的pause容器主要为每个容器提供以下功能 6、Pod分类 (1)自主式Pod   (2)控制器管理的Pod  (3)

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

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

    2024年02月06日
    浏览(40)
  • 【K8s】Pod一文详解

    每个Pod中都可以包含一个或者多个容器 ,这些容器可以分为两类: 1) 用户容器 :用户程序所在的容器,数量可多可少 2) 根容器 :Pause容器,由Kubernetes创建,这是每个Pod都会有的一个根容器,它的作用有两个: 可以以它为依据,评估整个Pod的健康状态 可以在根容器上设

    2024年02月04日
    浏览(23)
  • k8s之Pod详解

    Pod是kubernetes中最小的资源管理组件 ,Pod也是最小化运行容器化应用的资源对象。 一个Pod代表着集群中运行的一个进程 。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和

    2024年02月16日
    浏览(21)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包