Kubernetes-Service

1. 简介

kubernets service 是将运行一组pods上的应用程序公开为网络服务的抽象方法。

有了 kubernets service,你就无需修改应用程序即可使用服务发现机制,kubernets 为 pods 提供自己的ip地址,并为一组pod提供相同的DNS名,并且可以在它们之间进行负载均衡。

2. 为什么要用services

创建和销毁 kubernets pod 以匹配集群状态。pod 是非永久性资源。如果你使用 Deployment 来运行你的应用程序,则它可以动态创建和销毁 Pod。

每个 Pod 都有自己的 IP 地址,但是在 Deployment 中,在同一时刻运行的 Pod 集合可能与稍后运行该应用程序的 Pod 集合不同。

这导致了一个问题: 如果一组 Pod(称为”后端”)为集群内的其他 Pod(称为”前端”)提供功能, 那么前端如何找出并跟踪要连接的 IP 地址,以便前端可以使用提供工作负载的后端部分?

3. quick start

3.1 创建svc

资源模板 svc-deploy-nginx.yaml信息如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-test
  name: nginx-test-1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        imagePullPolicy: IfNotPresent


apiVersion: v1
kind: Service
metadata:
  name: my-service-2
spec:
  type: NodePort
  selector:
    app: nginx-test-02
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 80
      # 可选字段
      # 默认情况下,为了方便起见,Kubernetes 会从范围内分配一个端口号(默认:30000-32767)
      nodePort: 30007
  1. 访问svc
    Kubernetes-Service

4.3 LoadBalancer

使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。

4.4 ExternalName

类型为 ExternalName 的服务将服务映射到 DNS 名称,而不是典型的选择器,例如 其他svc 或者 公网域名。 你可以使用 spec.externalName 参数指定这些服务。

  1. 创建服务 例如,以下 Service 定义将 default 名称空间中的 my-service-2 服务映射到 my-service-1.test.svc.cluster.local(test 名称空间中的 my-service-1 service):
apiVersion: v1
kind: Service
metadata:
  name: my-service-2
spec:
  type: ExternalName
  externalName: my-service-1.test.svc.cluster.local

服务信息如下:

服务是在default namespace 下 没有分配CLUSTER-IP,但是有我们指定的 EXTERNAL-IP

$ kubectl get svc -owide

NAME           TYPE           CLUSTER-IP   EXTERNAL-IP                           PORT(S)   AGE    SELECTOR
kubernetes     ClusterIP      10.96.0.1                                    443/TCP   170d
my-service-2   ExternalName          my-service-1.test.svc.cluster.local       41s

为了验证映射效果,我们再创建一个 my-service-1.test service

注意 服务都是在test namespace 下

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-test
  name: nginx-test-1
  namespace: test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        imagePullPolicy: IfNotPresent


apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web

服务信息如下:

$ kubectl get deploy -owide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES   SELECTOR
web    2/2     2            2           3h25m   nginx        nginx    app=nginx

$ kubectl get svc/nginx -owide
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP     PORT(S)    AGE    SELECTOR
nginx        ClusterIP   10.96.41.170   192.168.0.101   8080/TCP   4m     app=nginx

Kubernetes-Service

如果在集群节点上访问 192.168.0.101:8080,是不能将结果导入到deploy上的,只有在集群服务内部访问才有效
4. 此时我们将svc/nginx 删除掉,看下访问的结果
符合预期

Kubernetes-Service

6. 管理外部的服务

场景:如果我们的中间件或者数据库服务不是在k8s集群内的,而是在其他的服务器上,但是我们还是想通过访问svc的方式去访问这些外部的服务,我们应该怎么做呢?

  1. 声明一个没有选择符的svc
  2. 创建一个同名(和第一步中的svc name 相同)的 endpoints 服务去管理这些外部的服务地址

实例:

实例通过创建svc 和 endpoints,实现访问svc-name,svc 将流量导出到外部的springboot(项目信息如5.0中提到的)项目中

  1. 创建服务

`yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
– protocol: TCP
port: 80
targetPort: 8080

Original: https://www.cnblogs.com/ludangxin/p/15760914.html
Author: 张铁牛
Title: Kubernetes-Service

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581152/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Elasticsearch索引生命周期管理方案

    一、前言 在 Elasticsearch 的日常中,有很多如存储 系统日志、 行为数据等方面的应用场景,这些场景的特点是数据量非常大,并且随着时间的增长 索&…

    Java 2023年6月6日
    090
  • Micrometer + Prometheus 监控 Feign 调用实战

    可观测性是系统架构的基石,准确详细的度量是工程师的重要决策来源。对于微服务系统,除了传统意义上系统边界层的监控指标,服务内部调用的情况也需引起重视,这回就来分享下笔者在实现Feig…

    Java 2023年6月5日
    092
  • 深入理解Java虚拟机之Java内存区域与内存溢出异常

    Java内存区域与内存溢出异常 运行时数据区域 程序计数器 用于记录从内存执行的下一条指令的地址,线程私有的一小块内存,也是唯一不会报出OOM异常的区域 Java虚拟机栈 Java…

    Java 2023年6月6日
    094
  • 1、spingIOC+IDEA+Maven

    1、先配置spring、springmvc通用xml文件的头部信息 spring、springmvc通用xml文件的模板内容如下: 1 <?xml version=&quot…

    Java 2023年6月13日
    085
  • C#、Java和JS实现SHA256+BASE64加密总结

    C#、Java和JS实现SHA256+BASE64加密总结 https://www.cnblogs.com/muphy/p/10781449.html posted on2021-…

    Java 2023年5月29日
    0107
  • 王者荣耀第一弹

    1 当前使用 AI 玩对抗性游戏的主要分两种:以星际为首的 RTS 游戏,和以 DOTA为 首的 MOBA 游戏。两种游戏侧重的学习难点不同:对于星际类的游戏来说,单个 unit …

    Java 2023年6月5日
    091
  • JVM_字符串常量池地址问题

    先看下代码 public class JVMDemo { public static void main(String[] args) { String s1 = "ab…

    Java 2023年6月5日
    074
  • Jenkins移动指定目录文件到指定tomcat,并启动tomcat

    一.安装Jenkins(略),请自行百度 二.任务创建 1.新建任务 2.进入任务内,选择构建 写入脚本 脚本如下: Xcopy D:\bioknowshell64\apache-…

    Java 2023年6月6日
    074
  • 简单明了的设计模式-立意篇

    1.岁月的沉淀 我们为什么要学设计模式? 如果是在我刚成为程序员的时候,我大概会这么回答: 因为设计模式是前人经验的总结,可以用来解决特定环境下,重复出现的特定问题。 同时也是程序…

    Java 2023年6月15日
    086
  • SpringBoot整合Filter过滤器

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    076
  • 维基动漫

    维基动漫 软件支持右键详情页预览,右键删除收藏列表等功能 ① 3.0.1 增加界面右下方引擎切换功能,切换引擎可能会比较慢。 软件版本更新V3.0.1:(替换原路径即可) 链接: …

    Java 2023年5月30日
    075
  • Sword nginx slab源码解析五(申请空间释放)

    oid ngx_slab_free(ngx_slab_pool_t *pool, void *p) { ngx_shmtx_lock(&pool->mutex); n…

    Java 2023年5月30日
    059
  • Flutter水印

    如何给Flutter页面添加水印? 可以通过OverlayState实现 如下效果图: 具体实现源码 时刻怀有一颗虔诚之心,乐于分享。知识才更有意义。 posted @2020-0…

    Java 2023年5月29日
    093
  • 好书推荐之《深入理解JAVA虚拟机》

    大佬推进 这本书作为JVM的入门书籍,是每一个JAVA工程师必备的。 简介 这是一部从 工作原理和 工程实践两个维度深入剖析JVM的著作,是计算机领域公认的经典,繁体版在台湾也颇受…

    Java 2023年6月15日
    0101
  • Java反射机制

    概述 Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以…

    Java 2023年6月7日
    079
  • spring cloud 分布式事务 seata

    seata安装与部署 什么是seata? Seata是阿里开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。 官方中文文档:https://seata.io/z…

    Java 2023年6月5日
    0131
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球