K8S Service服务发现

admin1年前笔记196

一、背景

在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;

image.png

对于测试「Tes」环境或者生产「Pro」环境,出于安全或者环境隔离性来考虑,在正常情况下只会开放网关服务,而「注册、配置」中心并不会对外暴露;

对于架构中的其它业务服务一般不会对外开放,在K8S集群内部服务间是可以正常通信的,对于「Dev」环境来说,研发会使用「注册、配置」中心,网关是系统的访问入口;

在K8S集群中,通过Service组件,可以快速简单的实现服务发现和负载均衡;

二、Service组件

1、简介

在K8S集群中是通过Pod组件来部署应用服务,Deployment组件实现Pod编排管理,Service组件实现应用的访问;

image.png

【Pod】自身的特点是临时的,使用过后直接抛弃的实体,这样在Pod创建和销毁的状态中,会导致IP地址发生变化,即无法使用固定的IP进行应用访问;

【Deployment】控制器通过管理ReplicaSet间接实现Pod管理,比如发布方式,更新和回滚策略,维持Pod副本数量,对应用进行快速的编排,但是并没有涉及应用的访问;

【Service】是将运行在一个或一组Pod上的网络应用程序公开为网络服务的方法,可以在不修改现有应用程序的情况下,使用服务发现机制访问到该应用;

基于Pod、Deployment、Service三个组件的协作,同一个应用的部署脚本可以在开发、测试、生产不同环境中复用;

2、基础语法

这里提供一个简单的【Service】语法做参考;

image.png

需要注意的是:在该脚本中没有指定服务类型即ServiceType,默认采用的是ClusterIP,通过集群的内部IP暴露服务,选择该值时服务只能够在集群内部访问;

三、内部服务发现

1、Pod创建

基于【Deployment】组件,创建「auto-serve」应用;

apiVersion: apps/v1 
kind: Deployment 
metadata:   
name: serve-deployment   
labels:     
app: auto-serve 
spec:   
replicas: 1   
selector:     
matchLabels:       
app: auto-serve   
template:     
metadata:       
labels:         
app: auto-serve     
spec:       
containers:         
- name: auto-serve           
image: auto-serve:latest           
imagePullPolicy: Never           
ports:             
- containerPort: 8082               
name: auto-serve-port


执行创建命令

kubectl apply -f serve-deployment.yaml


2、Service创建

简单的脚本文件:app-service.yaml

apiVersion: v1 
kind: Service 
metadata:   
name: app-service 
spec:   
selector:     
app: auto-serve   
ports:   
- name: app-service-port     
protocol: TCP     
port: 8082     
targetPort: auto-serve-port


创建【Service】

kubectl apply -f app-service.yaml


查看【Service】,可以使用命令行或者界面;

kubectl describe svc app-service


image.png

删除【Service】

kubectl delete -f app-service.yaml


3、内部访问

在上面已经说明,当Type不指定时采用的是ClusterIP,只能在集群内部访问,集群外部的网络是无法访问的;

在【auto-client】服务中提供一段访问【auto-serve】接口的代码,并制作镜像【auto-client:3.3.3】,完成部署后查看日志打印;

image.png

在代码中通过服务名:端口IP:端口都可以正常访问,在Pod中查看两个应用的日志,请求和响应都正常;

image.png

四、外部服务发现

1、NodePort类型

指定类型为NodePort的脚本:app-np-service.yaml

image.png

创建【Service】

kubectl apply -f app-np-service.yaml


使用NodePort类型,K8S控制平面会在指定的范围内分配端口,如果需要特定的端口号可以指定nodePort字段中的值,但是该类型需要自己设置负载均衡解决方案;

2、LoadBalancer类型

指定类型为LoadBalancer的脚本:app-lb-service.yaml

image.png

创建【Service】

kubectl apply -f app-lb-service.yaml


查看【Service】

在查看「app-lb-service」时,值得注意一下Endpoints的字段属性,这里就是Pod选择器选中的Pod

image.png

image.png



相关文章

搭建Nginx服务器

搭建Nginx服务器

搭建Nginx服务器Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,占有内存少,并发能力强,并发能力在同类型的网页服务器中表现较好。本文档将介绍如何搭...

如何使用U盘安装Ubuntu 14.04

如何使用U盘安装Ubuntu 14.04

对于做运维的同学来说U盘装个系统不就是分分钟的事吗,这有什么好说的?U盘安装系统一般就是如下几步:下载系统镜像。通过刻录软件写入U盘。修改BIOS,从U盘引导。喝杯咖啡,愉快的等待安装完成。通常按操上...

HTML5 Geolocation(地理定位)简介

HTML5 Geolocation(地理定位)简介

定位用户的位置HTML5 Geolocation API 用于获得用户的地理位置。鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的。浏览器支持Internet Explorer...

前端SEO—详细讲解

一、搜索引擎工作原理当我们在输入框中输入关键词,点击搜索或查询时,然后得到结果。深究其背后的故事,搜索引擎做了很多事情。在搜索引擎网站,比如百度,在其后台有一个非常庞大的数据库,里面存储了海量的关键词...

教你实现Vscode的Markdown预览

教你实现Vscode的Markdown预览

vscode 的 markdown 预览是我们整天都在用的功能,有没有想过它是怎么实现的。或许有一天你会接到个定制 markdown 预览的需求,应该怎么做呢?其实整体思路比较简单,就是创建一个 we...

修复 Linux 上的文件权限错误

修复 Linux 上的文件权限错误

如果你通过网络或“跑腿网络”(将文件保存到硬盘,以将其复制到一台计算机)在两个用户之间共享文件,那么在尝试读取或写入文件时可能会遇到权限错误。即使你了解它的概念,你也可能不知道该如何诊断或解决问题。我...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。