k8s service使用详解(云原生kubernetes)

目录
  • 一、什么是服务service?
  • 二、service分类
    • 2.1 ClusterIP
    • 2.2 NodePort
    • 2.3 LoadBalancer(付费方案)
    • 2.4 ExternalName (使用较少)
  • 三、service和pod的关系
  • 四、Service 之 ClusterIP 使用
    • 4.1 在当前目录下,创建一个deploy-nginx-pod.yaml,配置如下
    • 4.2 暴露服务为 clusterIP 类型
    • 4.3 查看服务
  • 五、Service 之 NodePort 使用
    • 5.1 关于NodePort
    • 5.2 创建NodePort类型的服务
      • 查看服务详情
      • 关于NodePort暴露对外端口说明
      • 关于Endpoint参数说明
      • 关于Service如何分发请求到后端的多个Pod
      • NodePort 负载均衡机制验证

一、什么是服务service?

在k8s里面,每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失,重启pod的ip地址会发生变化,此时客户如果访问原先的ip地址则会报错 ;

Service (服务)就是用来解决这个问题的, 对外服务的统一入口,防止pod失联,定义一组pod的访问策略(服务发现、负载均衡) ;

一个Service可以看作一组提供相同服务的Pod的对外访问接口,作用于哪些Pod是通过标签选择器来定义的 ,Service是一个概念,主要作用的是节点上的kube-proxy服务进程 ;

举例来说,定义了3个商品微服务,由网关作为统一访问入口, 前端不需要关心它们调用了哪个后端副本。 然而组成这一组后端程序的 Pod 实际上可能会发生变化, 前端客户端不应该也没必要知道,而且也不需要跟踪这一组后端的状态。

简而言之,Service 定义的这种抽象能够解耦这种关联;

二、service分类

根据使用场景的不同,service可以分成下面几类

2.1 ClusterIP

默认类型,自动分配一个【仅集群内部】可以访问的虚拟IP

2.2 NodePort

对外访问应用使用,在ClusterIP基础上为Service在每台机器上绑定一个端口,就可以通过: ip+NodePort来访问该服务 ,在之前搭建k8s集群部署nginx的时候我们使用过;

2.3 LoadBalancer(付费方案)

  • 使在NodePort的基础上,借助公有云创建一个外部负载均衡器,并将请求转发到NodePort ;
  • 可以实现集群外部访问服务的另外一种解决方案,不过并不是所有的k8s集群都会支持,大多是在公有云托管集群中会支持该类型 ;

2.4 ExternalName (使用较少)

把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有 Kubernetes 1.7或更高版本的kube-dns才支持。

三、service和pod的关系

service和pod之间是通过 selector.app进行关联的 ,对应到yaml中的核心配置如下:

spec: # 描述
  selector: # 标签选择器,确定当前service代理控制哪些pod
    app: test-nginx

yaml 配置模板文件

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  name: test-svc
spec:
  ports:
  - port: 80  # service服务端口
    protocol: TCP
    targetPort: 80 # pod端口,常规和容器内部端口一致
  selector:
    app: test-nginx-pod
status:
  loadBalancer: {}

四、Service 之 ClusterIP 使用

ClusterIP 属于service的一种,一般作为集群内部应用互相访问时使用,接下来通过实际演示进行详细的说明;

4.1 在当前目录下,创建一个deploy-nginx-pod.yaml,配置如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: congge-deploy
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: congge-nginx-pod
  template:
    metadata:
      labels:
        app: congge-nginx-pod
    spec:
      containers:
      - name: congge-nginx
        image: nginx:1.23.0

使用apply命令创建pod,

kubectl apply -f deploy-nginx-pod.yaml

可以看到,成功创建了一个3副本的pod集群;

4.2 暴露服务为 clusterIP 类型

kubectl expose deploy congge-deploy --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n default

执行成功之后,可以看到创建了一个clusterIP类型的service;

有了这个clusterIp服务之后,后续不管nginx服务扩缩容,还是nginx的pod的IP地址如何变化,外部只需要统一访问这个clusterIP分配的这个IP+端口即可;

4.3 查看服务

多了个类型是ClusterIP的,通过curl clusterIp+port可以访问

kubectl get deployment,pod,svc -n dev -o wide

五、Service 之 NodePort 使用

上面了解到clusterIp这种方式一般作为集群内部各应用访问时使用,但实际业务场景中,有些应用服务需要暴露出去,通过外网去访问,这时候就需要创建NodePort,这个在k8s搭建篇中最后部署nginx的时候有提到;

5.1 关于NodePort

  • 常规业务的场景不全是集群内访问,也需要集群外业务访问 ;
  • 那么ClusterIP就满足不了了,NodePort是其中的一种实现集群外部访问的方案 ;
  • 对外访问应用使用,在ClusterIP基础上为Service在每台机器上绑定一个端口,就可以通过: ip+NodePort来访问该服务 ;

5.2 创建NodePort类型的服务

在上面我们创建了一个基于clusterIp类型的service

使用下面的命令创建一个基于 NodePort 的service

kubectl expose deploy congge-deploy --name=svc-nodeport-nginx1 --type=NodePort --port=80 --target-port=80 -n default

执行完成之后,就多了一个NodePort的service

使用浏览器访问下当前主机的公网IP就可以访问了(master或者node节点都可以访问);

查看服务详情

通过这个命令,可以查看上述创建的NodePort详细信息;

kubectl describe svc svc-nodeport-nginx1 -n default

关于NodePort暴露对外端口说明

Kubeadm部署,暴露端口对外服务,会随机选端口,默认范围是30000~32767,也可以手动修改和指定端口范围

关于Endpoint参数说明

  • 是k8s中的一个资源对象,存储在etcd中,记录service对应的所有pod的访问地址 ;
  • 里面有个Endpoints列表,就是当前service可以负载到的pod服务入口 ;
  • service和pod之间的通信是通过endpoint实现的 ;

可以使用下面的命令查看endpoint列表

kubectl get ep svc-nodeport-nginx1 -n default -o wide

关于Service如何分发请求到后端的多个Pod

Service所处的位置就如同图中展示的,处在客户端和pod之间,这就很像nginx或者其他具备网关的组件的能力了,事实上,也差不多就是我们理解的那样,一个Service的服务背后可能挂载着N多个Pod,那么具体来说,Service如何分发请求到后端的多个Pod的呢?

kubernetes提供了两种负载均衡策略 :

  • 默认,kube-proxy的策略,如随机、轮询 ;
  • 使用会话保持模式,即同个客户端的请求固定到某个pod,在spec中添加sessionAffinity:ClientIP即可 ;

NodePort 负载均衡机制验证

查看pod信息,显示了上面创建的以congge-deploy开头的3个nginx

其实来说,这也就是对应了3个pod中的3个nginx容器,如果使用curl的方式查看其中某个nginx,可以正常输出nginx欢迎页面的内容;

接下来,我们只需要进入到nginx容器内部,修改下nginx欢迎页的html内容,就可以看出Service的负载均衡效果了;

进入docker容器进行html内容的修改

#进入容器
kubectl exec -it congge-deploy-768455649c-2kv5r -n default /bin/sh
kubectl exec -it congge-deploy-768455649c-mfkbf -n default /bin/sh
kubectl exec -it congge-deploy-768455649c-xlh7s -n default /bin/sh
#执行修改
echo "hello this is node1 " > /usr/share/nginx/html/index.html
echo "hello this is node2 " > /usr/share/nginx/html/index.html
echo "hello this is node3 " > /usr/share/nginx/html/index.html

执行过程

接下来使用当前主机节点IP+图中的端口在浏览器访问下

我们连续访问多次,看下返回的内容如何

第一次:

 第二次:

当然,可以通过在当前节点上通过curl cluserIP的方式,效果类似

其实也可以查看下当前创建这个SVC的时候默认的配置,使用yaml格式输出一下

kubectl get svc svc-nodeport-nginx1 -n default -o yaml

总结:通过上面的实际操作,在默认情况下,负载均衡为基于随机的这种策略;

到此这篇关于k8s service使用详解(云原生kubernetes)的文章就介绍到这了,更多相关k8s service使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • k8s service nodePort无法访问的问题解决

    目录 0. 前言 1.背景 2. 配置如下 3.集群信息如下 4. 问题 5.解决方案 总结 0. 前言 本文主要针对的是:不在同一内网且机器的公网IP并未显示的绑定在机器网卡上(也就是云主机,比如阿里云.腾讯云等等)出现的pod之间无法访问的问题,如果不是的话就可以撤退了,节约时间~~ 1.背景 我有闲置的腾讯云两台服务器,最近想搭建个k8s集群玩玩,于是按照b站某教程搭建,出现了网络问题,具体如下. 2. 配置如下 公网ip已打码,毕竟还在使用,见谅master节点叫:k8s-master-

  • 关于k8s 使用 Service 控制器对外暴露服务的问题

    目录 部署 deploy 部署 service 查看 service 和 pod 的关系 查看 service 查看端口 导出 yaml 筛选 service 关联 pod 扩容测试 Service 三种常用类型 Service 引入主要是解决 Pod 的动态变化,提供统一访问入口: 防止 Pod 失联,准备找到提供同一个服务的 Pod (服务发现) 定义一组 Pod 的访问策略 (负载均衡) 部署 deploy kubectl apply -f deploy.yaml apiVersion:

  • k8s 中的 service 如何找到绑定的 Pod 及实现 Pod 负载均衡的方法

    目录 k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡 前言 endpoint kube-proxy userspace 模式 iptables ipvs kernelspace 服务发现 环境变量 DNS 总结 参考 k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡 前言 Service 资源主要用于为 Pod 对象提供一个固定.统一的访问接口及负载均衡的能力. service 是一组具有相同 label pod 集合的抽

  • k8s service使用详解(云原生kubernetes)

    目录 一.什么是服务service? 二.service分类 2.1 ClusterIP 2.2 NodePort 2.3 LoadBalancer(付费方案) 2.4 ExternalName (使用较少) 三.service和pod的关系 四.Service 之 ClusterIP 使用 4.1 在当前目录下,创建一个deploy-nginx-pod.yaml,配置如下 4.2 暴露服务为 clusterIP 类型 4.3 查看服务 五.Service 之 NodePort 使用 5.1 关

  • 云原生Kubernetes初始化容器Init使用介绍

    目录 一.基本介绍 使用 Init 容器的作用: 一.基本介绍 Kubernetes 中 Init 容器,也叫做初始化容器,是 K8s 官方为我们提供的一个 可以用来判断我们的环境是否已经满足运行 Pod 应用前所需要的条件. 比如,我们有一个应用是 Tomcat,但是需要向 ZooKeeper 中进行注册. 而恰好我们在运行 Tomcat 时,ZooKeeper 出现了故障,从而导致我们的 Tomcat 因为注册不上数据而导致系统报错. 但是当我们给 Tomcat 配置上 Init 容器后,效

  • 云原生Kubernetes初始化容器Init使用教程

    目录 一.基本介绍 使用 Init 容器的作用: 二.Init 容器使用介绍 一.基本介绍 Kubernetes 中 Init 容器,也叫做初始化容器,是 K8s 官方为我们提供的一个 可以用来判断我们的环境是否已经满足运行 Pod 应用前所需要的条件. 比如,我们有一个应用是 Tomcat,但是需要向 ZooKeeper 中进行注册. 而恰好我们在运行 Tomcat 时,ZooKeeper 出现了故障,从而导致我们的 Tomcat 因为注册不上数据而导致系统报错. 但是当我们给 Tomcat

  • k8s之ingress-nginx详解和部署方案

    目录 1.ingress介绍 2.ingress的工作原理 3.ingress可以解决的问题 1)动态配置服务 2)减少不必要的端口暴露 4.部署ingress(deployment的方式) 1)配置文件准备(粘贴下面网址的yanl文件) 2)配置文件介绍和设置ingress的网络模式 3)修改配置文件 4)拉取镜像(通过查看ingress的yaml文件可以看出)和创建svc文件 5)指定运行节点(需要打标签) 5.部署ingress(DaemonSet的方式) 1)添加hostNetwork

  • Android O对后台Service限制详解

    目录 Service问题 什么是前台应用 前台Service和后台Service 后台Service限制 解决后台Service限制 Service问题 Service没有界面,运行于后台,它会消耗设备资源,并且可能会导致不好的用户体验,例如资源占用过多,导致设备运行不流畅.为了缓解这个问题,Android O版本(Android 8.0, API 26)对后台Service强加了一些限制.注意,只是对后台Service加了限制,前台Service不受影响. 什么是前台应用 在解释后台Servi

  • Android中Service服务详解(二)

    本文详细分析了Android中Service服务.分享给大家供大家参考,具体如下: 在前面文章<Android中Service服务详解(一)>中,我们介绍了服务的启动和停止,是调用Context的startService和stopService方法.还有另外一种启动方式和停止方式,即绑定服务和解绑服务,这种方式使服务与启动服务的活动之间的关系更为紧密,可以在活动中告诉服务去做什么事情. 为了说明这种情况,做如下工作: 1.修改Service服务类MyService package com.ex

  • Android中 service组件详解

    service组件跟activity组件及其类似,可以说service是没有界面的activity, 当然service的生命周期和activity还是有一定的差别的. service组件一般用在什么地方的,上面讲了service组件没有界面,不用跟用户直接交互, 所以service组件一般运行在后台.比如做一些不需要界面的数据处理等等. 开发service需要两个步骤: 1,定义一个基础service的子类.     2,在AndroidManifest.xml 文件中配置该service.

  • AngularJs Managing Service Dependencies详解

    angular允许service将其他service声明为依赖,使用在自身实例化时使用的构造函数中. 为了声明依赖,我们需要在工厂方法声明中指定它们,并且在工厂方法中通过$inject属性(字符串标识数组)或者使用array notation. 通常$inject属性声明可以被丢弃(即http://www.jb51.net/article/91815.htm中提到的隐式依赖注入,但这个是实验属性,在而且在压缩混淆后会失效,慎用!). 使用array notation function myMod

  • 详解云与备份之VMware虚机备份和恢复

    1. 与备份有关的VMWare基础知识 1.1 VMware 虚机磁盘在 ESXi 宿主机上的文件 简单来说,虚机的每个虚拟磁盘由ESXi 宿主机上的三个文件组成(这里的虚机名字是 sammy-target-win-small,下面是其第一个磁盘对应的三个文件): sammy-target-win-small.vmdk (配置文件,大小 633 字节) sammy-target-win-small-flat.vmdk (二进制文件,大小 12884901888 字节) sammy-target-

  • 详解用原生JavaScript实现jQuery的某些简单功能

    大致介绍 学习了妙味,用原生的JavaScript实现jQuery中的某些部分功能 定义自己的函数库lQuery $()选择器的实现 jQuery是面向对象的,所以自己编写的也要是面向对象的,看看基本的结构 // 定义lQuery对象 function lQuery(lArg){ } function lQ(lArg){ return new lQuery(lArg); } // css()方法 lQuery.prototype.css = function(){}; // html()方法 l

随机推荐