增加service_.NET Core + Kubernetes:Service
通过 .NET Core + Kubernetes:Deployment 文章的介绍,我们可以通过 Deployment 控制器快速创建一组 Pod 来提供服务,每个 Pod 都会被分配一个集群内可见的虚拟 IP 地址,然后通过一个独立的 Endpoint(Pod IP + ContainerPort)进行访问。但在提供服务时,并不能依赖 Pod 的 Endpoint,首先 Pod IP 会随着 Pod 的重建而变化,另外同一组 Pod 更希望是以整体对外提供高可用服务,组内的 Pod 在进行动态伸缩、滚动更新等操作后并不能影响服务稳定性。
因此,Kubernetes 中的 Service 对象就是解决此问题的核心,Service 代理 Pod 集合对外表现是为一个访问入口,它提供了一个虚拟的 IP 地址(ClusterIP)和端口,来自 ClusterIP + 端口 的请求将被负载均衡器 (kube-proxy)转发到后端某个 Pod 中的容器。所以借助 Service 的能力,非常方便的实现了服务发现与负载均衡。
本文将主要介绍 Kubernetes 中各 Service 类型的使用,目前有以下四种类型:
ClusterIP:默认类型,自动分配一个仅集群内部可以访问的虚拟 IP,也可使用 ClusterIP 字段指定固定 IP,选择此类型意味着只想这个服务在集群内部才可以被访问
NodePort:在 ClusterIP 基础上,在集群的每一个节点绑定一个端口,这样就可以通过任意的:NodePort 来访问服务
LoadBalancer:在 NodePort 的基础上,通过创建一个外部的负载均衡器,将流量转发到每个节点:NodePort。因为如果外部所有客户端都访问一个 NodeIP,该节点的压力将会很大,LoadBalancer 则可解决此问题
ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有 kubernetes 1.7 或更高版本的 kube-dns 才支持
下面分别对这几种类型的使用方式进行介绍,在创建 Service 之前,还是先通过 Deployment 控制器创建一组 Pod,配置文件 k8sdemo-deployment.yaml
如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8sdemo-deployment
spec:
replicas: 3
selector:
matchLabels:
name: k8sdemo
template:
metadata:
labels:
name: k8sdemo
spec:
containers:
- name: k8sdemo
image: beckjin/k8sdemo:1.0.0
ports:
- containerPort: 80
imagePullPolicy: IfNotPresent
ClusterIP 类型
创建 k8sdemo-service.yaml
文件,配置如下,主要是 ports
和 selector
字段的设置,指定了 80 端口(port) 映射到 Pod ContainerPort (targetPort) 端口,最终将通过 ClusterIP:80 访问服务。selector
字段指定将 label 含 name:k8sdemo 的 Pod 作为这个 Service 指向的目标服务。
apiVersion: v1
kind: Service
metadata:
name: k8sdemo-service
spec:
ports:
- port: 80 # Service Port
targetPort: 80 # Pod ContainerPort
selector:
name: k8sdemo
# clusterIP: 10.1.19.92 # 取消注释指定IP
执行命令 kubectl apply -f k8sdemo-service.yaml
创建 Service,然后通过 kubectl get service
查看服务状态:
从上图可以看出 k8sdemo-service
被分配的 ClusterIP 是 10.1.19.96
,所以可以在服务器上通过 curl http://10.1.19.96/WeatherForecast
来访问接口。

因为 ClusterIP 默认是自动分配的,所以每次重建会变化,如果需要固定,可通过 ClusterIP 字段设置。对于只需在集群内部提供的服务,ClusterIP 类型已足够。
NodePort 类型
基于 ClusterIP 类型中使用的配置文件 k8sdemo-service.yaml
,增加 type: NodePort
配置,重新创建 Service,如下:
apiVersion: v1
kind: Service
metadata:
name: k8sdemo-service
spec:
ports:
- port: 80
targetPort: 80
# nodePort: 30080 # 取消注释指定端口
selector:
name: k8sdemo
type: NodePort

从上图可以看出,除了类型变了, PORT(S)也变成了 80:30231/TCP
,即将 Service 的 80 端口与集群中各节点的 30231 端口进行映射,所以最终可以通过集群内任意的 NodeIP:30231
来访问,整个过程为:Client > NodeIP:NodePort > ClusterIP:ServicePort > PodIP:ContainerPort
。NodePort 默认分配的是 30000-32767 范围内随机选择的一个端口,实际使用时可以通过 nodePort
字段指定。请求结果如下:

注:192.168.124.10 是集群内某一台的 IP
LoadBalancer 类型
通过 NodePort 类型的使用介绍,已经了解可以通过 NodeIP:NodePort
方式来服务访问,而且 NodeIP 可以是集群内任意任何一台的 IP。而 LoadBalancer 则是在外层附加的负载均衡器,使请求能分摊到集群内各个节点上。
MetalLB 搭建
要使用 LoadBalancer 类型会稍微复杂一些,并不能只单纯的修改配置文件,因为一般自建的 Kubernetes 集群默认并不支持 LoadBalancer,所以它需要借助外部的负载均衡器来实现,这里将使用 MetalLB[1] (v0.9.3),安装请参考 Installation By Manifest[2] ,步骤不复杂,但需要确保依赖镜像下载顺利,完成后查看 Pod 状态:

另外需要为 Metallb 设置地址池以及协议相关配置,Metallb 会监控服务对象的变化,当有新的 LoadBalancer 服务运行,但没有可申请的负载均衡器时,就会从配置的地址池中分配一个给该服务。这里以 Metallb Layer2 工作模式为例(Metallb 支持 Layer2/BGP 两种工作模式),创建一个资源类型为 ConfigMap 的配置文件 metallb-layer2-config.yaml
,内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.124.200-192.168.124.210 # IP 地址范围需与自己的集群环境对应
Layer2 工作模式原理图:
配置修改
有了以上的准备工作后,只需要在 Service 配置文件将 type 修改为 LoadBalancer ,然后重新创建 Service,如下:
apiVersion: v1
kind: Service
metadata:
name: k8sdemo-service
spec:
ports:
- port: 80
targetPort: 80
selector:
name: k8sdemo
type: LoadBalancer

从上图可以看出,TYPE 已是 LoadBalancer,另外 EXTERNAL-IP 被分配为地址池中的 192.168.124.200
,接下来就可以通过这个 IP 进行访问了,结果如下:

ExternalName
ExternalName 类型比较特殊,它没有 selector,也没有定义任何的端口, 对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务,如下:
apiVersion: v1
kind: Service
metadata:
name: k8sdemo-external-service
spec:
type: ExternalName
externalName: mingdao.com
当访问 k8sdemo-external-service.default.svc.cluster.local
时,集群的 DNS 服务将返回值为 mingdao.com
的 CNAME 记录,访问这种类型的服务与其它的唯一不同的是重定向发生在 DNS 层,而且不会进行代理或转发。
进入 Kubernetes 集群的任意一个 Pod 中(必须是集群内部才可访问),如:kubectl exec -it k8sdemo-deployment-68cb864ff6-fzzdq -- /bin/bash
,执行 curl -L http://k8sdemo-external-service.default.svc.cluster.local/
即会重定向请求到 mingdao.com
,结果如下:

参考资料
[1]MetalLB: https://metallb.universe.tf/
[2]Installation By Manifest: https://metallb.universe.tf/installation/#installation-by-manifest
相关文章:

IIS配置相关问题:Framework 4.5 在IIS 7.5中运行
<system.webServer> <validation validateIntegratedModeConfiguration"false" /> <!--4.5 在IIS7.5中运行的时候--> <modules runAllManagedModulesForAllRequests"true" /> </system.webServer>转载于:https://…

[优先队列] 洛谷 P2085 最小函数值
题目描述 有n个函数,分别为F1,F2,...,Fn。定义Fi(x)Ai*x^2Bi*xCi (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。 输入输出格式 输入格式: 输入数据:第一行输…

leetcode-86 分隔链表
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例: 输入: head 1->4->3->2->5->2, x 3 输出: 1->2->2->4->3->5 …

[WCF编程]1.WCF入门示例
一、WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有Http和Ftp的相关技术,…

ios 自动打包命令_iOS自动打包上传脚本
自从将swift2.2升级到swift3.0, 每次使用Xcode8编译都很慢,很是不爽,于是有了研究下xcodebuild命令行打包的想法,起初不知道用shell,还是用python, 在网上大概搜了一下,关于python的比较多点,于是就先学习p…

linux系统下添加新硬盘的方法详解
对于linux新手来说,在linux上添加新硬盘,是很有挑战性的一项工作。在Linux服务器上把硬盘接好,启动linux,以root登陆。 fdisk -l ## 这里是查看目前系统上有几块硬盘 Disk /dev/sda: 36.4 GB, 36401479680 bytes 255 heads, 63 s…

【CF EDU59 E】 Vasya and Binary String (DP)
题意 给一串01串,对该串进行若干次操作,直到串为空 操作为:选择一段连续的0或者1,删除它,拼接前后两部分成为新串,得到价值为a[删除的长度](a为给定的数组) 思路 一个非常规的DP 考虑题目所给的…

leetcode-21 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 总体思路是: 比较两个链表头节点,…

log4cxx第三篇----使用多个logger
使用多个logger时,所有logger的配置写在一个配置文件里面 两个例子: 1 一个继承的例子(http://logging.apache.org/log4cxx/) // file com/foo/bar.h #include "log4cxx/logger.h"namespace com {namespace foo {class…

authy不同账户间不同步_「第七期」shopify产品还能同步到微信小程序销售?看这里...
众所周知,微信坐拥12亿用户,已经是国民应用,而其中小程序依托于微信生态日活已经超过4亿,对于国内的一些商家来讲是不可错过的流量圣地,那么对于做跨境的朋友来讲怎么利用起来了?今天给大家介绍一款无缝对接…

Ubuntu环境变量
2019独角兽企业重金招聘Python工程师标准>>> Ubuntu 环境变量 环境变量配置文件 在Ubuntu中有如下几个文件可以设置环境变量 1、 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执…

mysql 免安装
1. 解压得到如下目录 2. 配置环境变量 D:\Program Files\mysql-5.7.11-winx64\bin 3. 安装的根目录,新增 my.ini 文件 [mysqld] port 3306 character_set_serverutf8 basedir D:\Program Files\mysql-5.7.11-winx64 datadir D:\Program Files\mysql-5.7.…

leetcode-23 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 方法一: 使用vector数组存多个链表的所有节点,进行从小…

Access应用日志一
今天在确认实习生不能帮忙搭建数据库后,自己根据业务需求尝试搭了一个小型access数据库。 主要目的:储存历史月度数据,避免每次从公司数据库下载数据的麻烦,节省数据拉取时间。 搭建了以acct id为主键的两种数据。 1)客…

mongodb检查点_mongodb 监控命令mongostat
mongodb 监控命令mongostat2016/03/07 15:11 于 数据分析mongostat实用工具提供了mongoDB一个实例快速概述和当前运行的状态。mongostat功能类似于UNIX / Linux文件系统实用vmstat,mongostat只不过是提供 mongodb 的数据。监控包含的数据:服务器状态数据副本状态数据…

RunnableException与CheckedException
Checked Exception 编译时异常 编译的时候检查你的代码可能在运行的时候抛出异常,这通常在编译的时候要去处理的。 RunnableException 运行时异常,可以编译通过,但如果不处理运行时会导致崩溃,需要对其进行try....catch...处理。 …

Educational Codeforces Round 59 (Rated for Div. 2)
A.Digits Sequence Dividing 题意:给你一个1-9的数字字符串,把它划分成若干段(>2)段,使其大小递增。 错误:当长度为2的时候没考虑 #include<cstdio> #include<cmath> #include<cstring&g…

leetcode-225 队列实现栈
使用队列实现栈的下列操作: push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空 队列的特点:先入先出 栈的特点:后入先出 即我们每次添加元素到队列时,想要达到栈的效果,…

详解Java Math类的toDegrees()方法:将参数从弧度转换为角度
Java Math 类的 toDegrees() 方法是将一个角度的弧度表示转换为其度表示,返回值为double类型,表示从弧度数转换而来的角度数。这就是Java Math 类的 toDegrees() 方法的攻略。我们已经了解了该方法的基本概念、语法、注意事项以及两个示例。希望这篇攻略对你有所帮助。

python语音合成 标贝_tacotronV2 + wavernn 实现中文语音合成(Tensorflow + pytorch)
TacotronV2 WaveRNN开源中文语音数据集标贝(女声)训练中文TacotronV2,实现中文到声学特征(Mel)转换的声学模型。在GTA模式下,利用训练好的TacotronV2合成标贝语音数据集中中文对应的Mel特征,作为声码器WaveRNN的训练数据。在合成阶段&#x…

SpringBoot接口防抖(防重复提交)的一些实现方案
作为一名老码农,在开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。啥是防抖所谓防抖,一是防用户手抖,二是防网络抖动。

OC语言基础笔记
OC方面的基础笔记:1.类的基本用法#import <Foundation/Foundation.h>// 大体上就是include, 用于包含头文件, 但是即使头文件中, 没有ifndef defined endif, 仍然能够踢除重复包含的头文件// ----interface section----// OC中声明和实现是分离的, 两个都必须有.interfac…

Docker 数据卷之进阶篇
Docker 数据卷之进阶篇 原文:Docker 数据卷之进阶篇笔者在《Docker 基础 : 数据管理》一文中介绍了 docker 数据卷(volume) 的基本用法。随着使用的深入,笔者对 docker 数据卷的理解与认识也在不断的增强。本文将在前文的基础上介绍 docker 数据卷的原理及一些高级用…

leetcode-232 用栈实现队列
使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空 栈的特点:后入先出 队列的特点:先入先出 使用一个数据栈,一个辅…

sparkcore分区_Spark学习:Spark源码和调优简介 Spark Core (二)
本文基于 Spark 2.4.4 版本的源码,试图分析其 Core 模块的部分实现原理,其中如有错误,请指正。为了简化论述,将部分细节放到了源码中作为注释,因此正文中是主要内容。第一部分内容见:Spark学习:…

Tips——IndexSearcher自动更新
情景描述 为了调高效率,创建全局变量IndexReader取代每次查询新建IndexReader所带来的效率问题。 当时每天会更新一边索引8.23号部署的Index服务,Search服务,结果index都更新到了8.25,查询结果还是8.23的 Tips分享 先来看一下Inde…

公司运作 - 利润率、周转率
公司一般由市场部、研发部、财务部、人力资源部及其他辅助部门组成。分成了几个层面,如下: 宏观层面:业务范围、业务定位、专业化、多元化部门层面:各部门绩效、部门职责主体层面:跨部门事务,如产品研发涉及…

测试用例设计方法基础理论知识
一、什么是测试用例 测试用例设计:将软件测试的行为活动,作为一个科学化的组织归纳。 测试用例:设计一个情况,软件程序在这种情况下,必须能够正常运行并且达到程序所设计的执行结果。 因为我们不可能进行穷举测试&…

leetcode-155 最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。 示例: MinStack minStack new Mi…

legend位置 pyecharts_可视化入门 | pyecharts全局配置项详解
更多文章,请见:http://mp.weixin.qq.com/mp/homepage?__bizMzIxODczMDUwOA&hid2&sn7928727456d49032f08ef1fcf0ee719e&scene18#wechat_redirectmp.weixin.qq.com大家好,我是你们的机房老哥! 计算机绘图是老哥很早就…