k8s服务发现(service discovery)常用的两种方式Nodeport和ClusterIP

这篇具有很好参考价值的文章主要介绍了k8s服务发现(service discovery)常用的两种方式Nodeport和ClusterIP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

NodePort:

主要特点:

为Service在每个节点上分配一个固定的端口(NodePort),允许外部流量通过节点的IP地址和NodePort访问Service。
NodePort将流量从集群外部引入到Service内部。
Service类型为NodePort时,还会创建一个ClusterIP,但它只是一个内部的ClusterIP,通常不会直接使用。
使用场景:

当需要从集群外部访问Service,但不希望使用负载均衡器或Ingress时,可以使用NodePort。
适用于开发和测试环境,以便快速访问Service。
不推荐用于生产环境,因为NodePort通常需要手动配置负载均衡,不够灵活和安全。
ClusterIP:

主要特点:

为Service创建一个内部ClusterIP,只能在集群内部访问。
ClusterIP将流量从集群外部引入到集群内部Service。
使用场景:

当Service只需要在集群内部访问,不需要从外部访问时,通常使用ClusterIP。
适用于微服务之间的通信,内部服务发现和负载均衡。
在生产环境中更为常见,因为ClusterIP提供了更好的安全性和控制,不暴露Service到公共网络。

准备

准备一个k8s集群,要求有一个master节点和一个node节点

Nodeport实现服务发现

在master节点上编写yaml配置文件:

[root@master ~]# mkdir  /service
[root@master ~]# cd /service/
[root@master service]# ls
[root@master service]# vim scnginx.yaml
[root@master service]# cat scnginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: scnginx-deployment
  labels:
    app: scnginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: scnginx
  template:
    metadata:
      labels:
        app: scnginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: scnginx-service
spec:
  type: NodePort    
  selector:
    app: scnginx
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30009

下面是对每行命令的解释:

apiVersion: apps/v1: 指定了使用的Kubernetes API版本,这是Deployment对象的版本。
kind: Deployment: 指定了要创建的Kubernetes资源类型,这是一个Deployment(部署)对象。
metadata: Deployment的元数据部分,包含有关部署的信息。
name: scnginx-deployment: 部署的名称是 “scnginx-deployment”。
labels: 为部署添加了标签,标签的键是 “app”,值是 “scnginx”。
spec: 部署的规范部分,定义了部署的配置。
replicas: 3: 指定要创建的副本数为3,这意味着将运行3个相同的Pod实例。
selector:: 用于选择要控制的Pod的标签。
matchLabels:: 匹配Pod的标签,以确保Deployment可以控制正确的Pod。
app: scnginx: 匹配标签 “app” 的值为 “scnginx” 的Pod。
template:: 定义了要创建的Pod的模板。
metadata:: Pod的元数据部分,包含有关Pod的信息。
labels:: 为Pod添加了标签,标签的键是 “app”,值是 “scnginx”。
spec:: Pod的规范部分,定义了Pod的配置。
containers:: 定义了要在Pod中运行的容器。
name: nginx: 容器的名称是 “nginx”。
image: nginx: 使用的容器镜像是 “nginx”。
imagePullPolicy: IfNotPresent: 定义了拉取镜像的策略,如果本地不存在该镜像,则拉取。
ports:: 定义了容器的端口配置。
containerPort: 80: 将容器的端口80映射到Pod的端口。

以下部分定义了一个Service:
apiVersion: v1: 指定了使用的Kubernetes API版本,这是Service对象的版本。
kind: Service: 指定了要创建的Kubernetes资源类型,这是一个Service(服务)对象。
metadata:: Service的元数据部分,包含有关服务的信息。
name: scnginx-service: 服务的名称是 “scnginx-service”。
spec:: 服务的规范部分,定义了服务的配置。
type: NodePort: 定义了服务的类型为NodePort,这意味着Service将会公开一个节点的端口供外部访问。
selector:: 通过标签选择要路由流量到的Pod。
app: scnginx: 匹配标签 “app” 的值为 “scnginx” 的Pod。
ports: 定义了服务的端口配置。
name: name-of-service-port: 服务端口的名称。
protocol: TCP: 指定端口协议为TCP。
port: 80: 服务监听的端口号。
targetPort: 80: 将流量路由到Pod的端口80。
nodePort: 30009: 指定NodePort的端口号为30009,外部可以通过节点的IP地址和这个端口来访问Service。
这个配置文件创建了一个名为 “scnginx-deployment” 的Deployment,其中运行3个Nginx容器的Pod,并创建了一个名为 “scnginx-service” 的NodePort类型的Service,将流量路由到这三个Pod中的任何一个,通过任意节点的IP地址和端口30009进行访问。

下面检查服务是否成功运行:

[root@k8smaster service]# kubectl apply -f scnginx.yaml 
deployment.apps/scnginx-deployment created
service/scnginx-service unchanged
[root@k8smaster service]# kubectl get svc
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes        ClusterIP   10.96.0.1        <none>        443/TCP          5d21h
mysql-service     NodePort    10.100.48.98     <none>        3306:30008/TCP   17m
nginx-service     ClusterIP   10.111.156.94    <none>        80/TCP           3h44m
nginx-service-2   NodePort    10.102.129.209   <none>        80:30007/TCP     3h34m
php-apache        ClusterIP   10.106.101.193   <none>        80/TCP           24h
scnginx-service   NodePort    10.98.63.131     <none>        80:30009/TCP     2m21s
[root@k8smaster service]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
mysql                                1/1     Running   0          17m
nginx                                1/1     Running   0          3h45m
nginx-2                              1/1     Running   0          3h35m
nginx-deployment-559d658b74-62hxx    1/1     Running   0          4h24m
nginx-deployment-559d658b74-zwlh4    1/1     Running   1          24h
php-apache-567d9f79d-rfv9b           1/1     Running   0          4h24m
scnginx-deployment-b975997c7-glfdb   1/1     Running   0          55s
scnginx-deployment-b975997c7-mk92v   1/1     Running   0          55s
scnginx-deployment-b975997c7-vsbt5   1/1     Running   0          55s
[root@k8smaster service]# 

在Windows机器上访问,测试是否可以看到页面:
http://192.168.74.156:30009/ (任何节点IP+端口号30009)
nodeport和clusterip,kubernetes,服务发现,容器

ClusterIP服务发现

在master节点编写yaml配置文件:


[root@master service] cd /service
[root@master service] vim scnginx-2.yaml 
[root@master service] cat scnginx-2.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: scnginx-deployment-2
  labels:
    app: scnginx-2
spec:
  replicas: 3
  selector:
    matchLabels:
      app: scnginx-2
  template:
    metadata:
      labels:
        app: scnginx-2
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: scnginx-service-2
spec:
  type: ClusterIP
  selector:
    app: scnginx-2
  ports:
  - name: name-of-service-port-2
    protocol: TCP
    port: 80
    targetPort: 80
    #nodePort: 30009

验证服务是否启动

[root@master-1 nginx] kubectl get svc
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes          ClusterIP   10.96.0.1        <none>        443/TCP   19d
php-apache          ClusterIP   10.107.194.238   <none>        80/TCP    16d
scnginx-service-2   ClusterIP   10.110.242.117   <none>        80/TCP    14m

在任意节点访问
该服务只能在集群内部使用,外面不能访问过来

[root@master-1 nginx] curl 10.110.242.117
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

成功

总结

NodePort适用于需要从集群外部直接访问Service的情况,但通常不是生产环境的首选。ClusterIP适用于内部通信和服务发现,提供了更好的隔离和安全性,适合生产环境中的大多数用例。在实际部署中,通常会结合使用不同类型的Service来满足不同的需求。文章来源地址https://www.toymoban.com/news/detail-753792.html

到了这里,关于k8s服务发现(service discovery)常用的两种方式Nodeport和ClusterIP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • k8s服务发现之第二弹Service详解

    Kubernetes Servies 是一个 RESTFul 接口对象,可通过 yaml 文件创建。 例如,假设您有一组 Pod: 每个 Pod 都监听 9376 TCP 端口 每个 Pod 都有标签 app=MyApp 上述 YAML 文件可用来创建一个 Service: 名字为 my-service 目标端口为 TCP 9376 选取所有包含标签 app=MyApp 的 Pod 关于 Service,您还需要了解

    2024年02月16日
    浏览(40)
  • k8s服务发现之第一弹Service概述

    Kubernetes 中 Pod 是随时可以消亡的(节点故障、容器内应用程序错误等原因)。如果使用 Deployment 运行您的应用程序,Deployment 将会在 Pod 消亡后再创建一个新的 Pod 以维持所需要的副本数。每一个 Pod 有自己的 IP 地址,然而,对于 Deployment 而言,对应 Pod 集合是动态变化的。

    2024年02月12日
    浏览(41)
  • Kubernetes(k8s)服务service:service的发现和service的发布

    目录 一.系统环境 二.前言 三.Kubernetes service简介 四.使用hostPort向外界暴露应用程序 4.1 创建deploy 4.2 使用hostPort向外界暴露pod的端口 五.使用service服务向外界暴露应用程序 5.1 使用service服务向外界暴露pod 5.1.1 创建service服务 5.1.2 测试svc的负载均衡 六.service服务的发现 6.1 使用

    2024年02月08日
    浏览(42)
  • 【云原生】k8s Service 实现服务发现和负载均衡

    在容器编排系统中,如 Kubernetes,Pod 是最小的部署单元。而一组 Pod 通常对外提供某种服务。在 Kubernetes 中,Service 就是用来对外暴露一组 Pod 的服务的资源对象。Service 可以通过 IP 地址和端口号访问,从而对外提供服务。 Service 是 Kubernetes 中一个非常重要的概念,它可以将一

    2023年04月16日
    浏览(27)
  • k8s服务发现之第五弹--使用 Service 连接到应用

    通过前面教程的学习,我们已经可以将容器化的应用程序在 Kubernetes 中运行起来,并且发布到 Kubernetes 内/外的网络上。 通常,Docker 使用一种 host-private 的联网方式,在此情况下,只有两个容器都在同一个节点(主机)上时,一个容器才可以通过网络连接另一个容器。为了使

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

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

    2024年02月06日
    浏览(40)
  • 【Spring Cloud Kubernetes】使用k8s原生service实现服务注册和发现

    @TOC 现在微服务开发模式应用的越来越广泛,注册中心 Eureka 也逐渐被其它注册中心产品替代,比如阿里出品的 Nacos 。随着云原生相关技术的普及, k8s 迅猛发展,我们把 K8s 中的 Pod 暴露给外部访问,通过少了 Service ,这也是今天的主角。 有没有发现,其实 Service 已经解决了

    2024年02月12日
    浏览(39)
  • K8s暴露服务-服务发现(三种常用方式)

    NodePort:后期维护困难,不支持虚拟路径 LoadBlancer:需要云厂商支持,有局限性 ClusterIP:只能在集群内部访问 Ingress:灵活,无依赖 前三种方式都是在service的维度提供的,service的作用体现在两个方面,对集群内部它不断跟踪pod变化,更新endpoint中对应的pod的对象,提供IP不断变化

    2024年02月15日
    浏览(47)
  • k8s快速生成yaml的两种方式

    第四. 验证nginx的pod是否正常

    2024年02月15日
    浏览(43)
  • k8s(kubernetes)的两种部署方式(kubeadm)

    在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 一台或多台机器,操作系统CentOS7.x-86_x64 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点禁止swap分区 角色 IP master 192.168.1.11 node1 192.16

    2024年02月22日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包