Service是k8s的核心,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求进行负载分发到各个容器应用上。

目录:

Service定义详解

Service基本用法

集群外部访问Pod和Service

Service定义详解

Service的定义比Pod简单。

apiVersion: v1kind: Servicemetadata:  name: string  labels:    name: string  annotations:    name: stringspec:  type: string    selector:    name: string  clusterIP: string   #虚拟服务ip,缺省默认分配  sessionAffinity: string    #是否支持session,可选值为ClientIP,表示同一个客户端  ports:  - name: string    protocol: string    #端口协议,支持TCP、UDP,默认是TCP    port: int  #宿主机端口    targetPort: int  #目标Pod的端口    nodePort: int  #k8s内部端口  status:    loadBalancer:      ingress:        ip: string        hostname: string

上述定义中的spec.type有两个选项:

当为NodePort时,需要配置nodePort映射到指定端口当为LoadBalancer,需要在status中设置外部负载均衡器

Service基本用法

(1)通过yaml文件创建:

apiVersion: v1kind: Servicemetadata:  name: nginx-servicespec:  type: NodePort  selector:    name: nginx-pod  ports:  - name: nginx-service    port: 80    targetPort: 80    nodePort: 30080

比如上述,定义了一个Service,对应的是具有key=name,value=nginx-pod这个标签的Pod,type定义为NodePort,宿主机端口为80,对应Pod端口为80,而nodePort为30080

通过如下命令创建Service

kubectl create -f service-name.yaml

创建之后查看:

可看到Service被分配的ip,对应的port以及选择的标签信息

(2)负载均衡

目前k8s提供了两种负载均衡策略:RoundRobin和SessionAffinity

1、RoundRobin:轮询模式

2、SessionAffinity:基于客户端IP地址进行会话保持模式,请求第一次到哪个Pod,则后续还会继续转发到那个Pod。

默认情况下,采用轮询模式,但也可以 通过设置spec.sessionAffinity设置为ClientIP启用SessionAffinity策略

接下来验证一下默认的轮询模式:

创建两个具有key=name,value=nginx-pod标签的Pod,容器内运行nginx。

nginx-one:

apiVersion: v1kind: Podmetadata:  name: nginx-pod1  labels:    name: nginx-podspec:  containers:  - name: nginx-pod1    image: nginx    imagePullPolicy: IfNotPresent    ports:    - containerPort: 80

nginx-two:

apiVersion: v1kind: Podmetadata:  name: nginx-pod2  labels:    name: nginx-podspec:  containers:  - name: nginx-pod2    image: nginx    imagePullPolicy: IfNotPresent    ports:    - containerPort: 80

创建完两个容器之后,分别进入两个容器修改nginx首页的字样。

进入容器:

kubectl exec -it  nginx-pod1 /bin/bash

找到文件并进行修改,此处需要注意的是,由nginx镜像创建的容器并不具有vim和vi这两个编辑工具,所以这边使用sed或echo都行

sed命令替换字符串格式是:

sed -i 's/需要被替换字符串/替换后字符串/g' file-name
sed -i 's/Welcome to nginx!/Welcome to nginx-pod two!/g' /usr/share/nginx/html/index.html

修改好后在浏览器访问:使用ip:nodePort访问

可以看到,service进行了负载均衡处理。

集群外部访问Pod和Service

(1)将Pod的端口号映射到宿主机

比如将上述的nginx-pod1映射到主机的20080端口:

apiVersion: v1kind: Podmetadata:  name: nginx-pod1  labels:    name: nginx-podspec:  containers:  - name: nginx-pod1    image: nginx    imagePullPolicy: IfNotPresent    ports:    - containerPort: 80      hostPort: 20080

然后查看此Pod在哪个节点上运行

然后在浏览器中访问此节点的20080端口:

(2)通过设置Pod级别的hostNetwork=true

该Pod的所有容器的端口号都将被直接映射到宿主机上,需要注意的是,如果不指定hostPort,则默认与containerPort一样,如果指定 ,则hostPort必须等于containerPort。

例如将上述的nginx-pod2设置hostNetwork=true

apiVersion: v1kind: Podmetadata:  name: nginx-pod2  labels:    name: nginx-podspec:  hostNetwork: true  containers:  - name: nginx-pod2    image: nginx    imagePullPolicy: IfNotPresent    ports:    - containerPort: 80

查看pod创建后在哪个节点上

在浏览器上访问:

(3)将Service的端口号映射到宿主机上

通过设置spec.type为NodePort,同时设置spec.ports.nodePort设置宿主机上的端口号。

例如在Service基本用法那一小节的Service定义,相应的使用也在那一节有

apiVersion: v1kind: Servicemetadata:  name: nginx-servicespec:  type: NodePort  selector:    name: nginx-pod  ports:  - name: nginx-service    port: 80    targetPort: 80    nodePort: 30080

END

往期推荐

k8s水平扩容深入理解Pod(三)深入理解Pod(二)深入理解Pod(一)k8s基本使用

下期见

Liusy01

一个分享Java后端学习日志的公众号

欢迎大家点个在看

分享至朋友圈

好文!点个好看!

k8s service type_k8s重器之Service相关推荐

  1. .net core i上 K8S(六).netcore程序的service网络代理模式

    正文 上一章我们讲了pod的hostip模式,但在生产环境中,我们都是通过service来访问k8s集群的,service有两种模式来暴漏端口,今天我们来分享一下 1.clusterIP模式 我们在创 ...

  2. k8s 之服务发现(service)

    文章目录 k8s 之服务发现(service) 一.基本概念 二.类型介绍 Service 在 K8S 中有以下四种类型 三.代理模式 userspace 代理模式 iptables 代理模式 ipv ...

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

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

  4. Android Service(一) Service初识

    在开发应用中,或多或少都会遇到Service有关知识.今天就来分析Service的使用. 一.概述. 首先看看官网是如何描述的. A Service is an application compone ...

  5. service mysqld restart与service mysql restart的区别

    1.前言 之前,遇到过在不同 linux 系统中启动或关闭 mysql,网上查询命令大都不一样,大致分为下面三种(以重启为例): service mysql restartservice mysqld ...

  6. 【Android 进程保活】应用进程拉活 ( 系统 Service 机制拉活 | Service 组件 onStartCommand 方法分析 | 源码资源 )

    文章目录 一. Service 组件 onStartCommand 方法分析 1. onStartCommand 函数返回值分析 2. onStartCommand 函数 START_STICKY_C ...

  7. Android Service、IntentService,Service和组件间通信

    Service组件 Service 和Activity 一样同为Android 的四大组件之一,并且他们都有各自的生命周期,要想掌握Service 的用法,那就要了解Service 的生命周期有哪些方 ...

  8. local service system账户_systemd.service学习和使用总结

    公众号:暮北林 Q Q 群 :  一起学前端 Systemd Service 学习和使用总结 什么是Systemd service system就是系统,d的意思是daemon,systemd就是系统 ...

  9. WCF学习笔记(一):WCF Service Application和WCF Service Library的区别

    近来在学习WCF,遇到了不少问题,有的让我焦头烂额,不过解决问题的过程就是学习的过程,收获也不少. 昨天有个问题开始困扰我--WCF Service Application和WCF Service L ...

最新文章

  1. 20145234黄斐《Java程序设计》第五周
  2. 如何自学python爬虫-python爬虫学习过程:
  3. 200922阶段一C++关联容器map
  4. 【C】KoobooJson在asp.net core中的使用
  5. app store 关键词
  6. Android 扫描SD卡中的所有视频文件
  7. Coolite ComboBox绑定方式
  8. 十二、流程控制之条件运算符
  9. 耗时6个月,整理了30款免费高评分软件,完爆付费
  10. B2B 网关软件 以新颖的模式 让企业步入新常态
  11. php中的列表属性,php类中的长属性列表 – 我可以缩短它吗?
  12. nodejs 遍历目录(文件夹)下的所有文件
  13. 点亮LED-STM32电控学习笔记03
  14. CCSv5.3的安装
  15. qmail邮件系统(五)vpopmail和qmailadmin对用户的管理
  16. TCP可靠传输-拥塞控制
  17. ANSYS apdl命令流耦合场分析案例4--------三维感应加热
  18. python 编程题 埃及金字塔罐子倒水
  19. 数据库的ACID四原则
  20. docusign文档打不开_DocuSign - 用手机签署你的个人文件,完美的无纸化办公就在这里 - Android 应用 - 【最美应用】...

热门文章

  1. PCL点云配准(2)
  2. 【从零开始的ROS四轴机械臂控制】(七)- ROS与arduino连接
  3. C++的STL 栈 实现四则运算
  4. 数据库1.0 -- 数据库的基本操作
  5. 吴裕雄--天生自然 高等数学学习:高阶偏导数
  6. Vue 框架-02-事件:点击, 双击事件,鼠标移上事件
  7. 洛谷1216 数字三角形
  8. 在Proteus中添加标号
  9. 【D3】transition API
  10. mysql常用语句集锦