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

目录:

Service定义详解

Service基本用法

集群外部访问Pod和Service

一、Service定义详解

Service的定义比Pod简单。

apiVersion: v1
kind: Service
metadata:
name: string
labels:
name: string
annotations:
name: string
spec:
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: v1
kind: Service
metadata:
name: nginx-service
spec:
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: v1
kind: Pod
metadata:
name: nginx-pod1
labels:
name: nginx-pod
spec:
containers:
- name: nginx-pod1
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80

  

nginx-two:

apiVersion: v1
kind: Pod
metadata:
name: nginx-pod2
labels:
name: nginx-pod
spec:
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: v1
kind: Pod
metadata:
name: nginx-pod1
labels:
name: nginx-pod
spec:
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: v1
kind: Pod
metadata:
name: nginx-pod2
labels:
name: nginx-pod
spec:
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: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
name: nginx-pod
ports:
- name: nginx-service
port: 80
targetPort: 80
nodePort: 30080

  

===============================

我是Liusy,一个喜欢健身的程序员。

欢迎关注微信公众号【Liusy01】,一起交流Java技术及健身,获取更多干货,领取Java进阶干货,领取最新大厂面试资料,一起成为Java大神。

来都来了,关注一波再溜呗。

k8s重器之Service的更多相关文章

  1. k8s实战之Service

    一.概述 为了适应快速的业务需求,微服务架构已经逐渐成为主流,微服务架构的应用需要有非常好的服务编排支持,k8s中的核心要素Service便提供了一套简化的服务代理和发现机制,天然适应微服务架构,任何 ...

  2. k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡

    k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡 前言 endpoint kube-proxy userspace 模式 iptables ipvs kernels ...

  3. idou老师教你学Istio 14:如何用K8S对Istio Service进行流量健康检查

    Istio利用k8s的探针对service进行流量健康检查,有两种探针可供选择,分别是liveness和readiness: liveness探针用来侦测什么时候需要重启容器.比如说当liveness ...

  4. 六,k8s集群service资源

    目录 Service简介 ClusterIP Headless(无头service) NodePort Service简介 service的基本说明: Service 是作用于客户端可服务端(Pod) ...

  5. 关于k8s里的service互访,有说法

    昨天,测试了一个项目的接入.明白了以下几个坑: 1,traefik有可能有性能问题,如果daemonset安装,可重建.也需要通过8580端口查看性能. 2,集群中的service访问自己时,好像性能 ...

  6. Kubernetes 控制器之 Service 讲解(七)

    一.背景介绍 我们这里准备三台机器,一台master,两台node,采用kubeadm的方式进行安装的,安装过程大家可以参照我之前的博文. IP 角色 版本 192.168.1.200 master ...

  7. k8s入门之Service(六)

    将一组pod公开为网络服务,通过service代理,可以实现负载均衡 一.ClusterIP 此方式只能在集群内访问 1.使用命令暴露已存在的pod (1)继续使用前面章节的案例,查看名称为nginx ...

  8. k8s nod rc service 使用

    引用自:https://blog.csdn.net/dream_broken/article/details/53115770

  9. Linux重器之 Vim 实用命令

    Vim 常用的命令 光标定位; hjkl  上下左右移动 0 $ 跳到行首或行尾 gg   shift+G 跳到整个文件的开头行或者结尾行 1G ,2G,3G........NG ,跳到第1.2.3 ...

随机推荐

  1. 文艺splay,占坑等着填

    昨天CF上去就A了前三道题,然后自闭罚坐一个小时什么也没写出来23333.似乎D题人均wa3发就很烦.还是肤浅了 今天精神状态不太好,可能是晚睡的缘故,那不如明天一起写了算了 蹲一波大选结果,蹲一波s ...

  2. python核心高级学习总结6------面向对象进阶之元类

    元类引入 在多数语言中,类就是一组用来描述如何生成对象的代码段,在python中同样如此,但是在python中把类也称为类对象,是的,你没听错,在这里你只要使用class关键字定义了类,其解释器在执行 ...

  3. error: src refspec master does not match any(个人经验)

    分支名写错了,推送不到远程 修改本地分支名称 git branch -m oldName newName 再推送到远程就好了

  4. moviepy音视频开发:音频剪辑基类AudioClip

    ☞ ░ 前往老猿Python博文目录 ░ 一.背景知识介绍 1.1.声音三要素: 音调:人耳对声音高低的感觉称为音调(也叫音频).音调主要与声波的频率有关.声波的频率高,则音调也高. 音量:也就是响度 ...

  5. moviepy音视频剪辑VideoClip类to_ImageClip方法使用注意事项

    ☞ ░ 前往老猿Python博文目录 ░ moviepy音视频剪辑VideoClip类to_ImageClip方法将剪辑对应时刻t的帧转换成ImageClip图像剪辑,图像剪辑是所有帧都是固定图像数据 ...

  6. 第15.17节 PyQt(Python+Qt)入门学习:PyQt图形界面应用程序的事件捕获方法大全及对比分析

    老猿Python博文目录 老猿Python博客地址 按照老猿规划的章节安排,信号和槽之后应该介绍事件,但事件在前面的随笔<PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法 ...

  7. unity入门—五分钟制作一个理论上的游戏

    unity入门 前言:这可不是标题党,虽然都是基础的操作,不过含括了基本的流程,比起脑海中的五花八门的画面,入门还是这个现实一点. 这里插两句,unity国外官网下载会推荐你看一个简短的视频,国内官网 ...

  8. 学习笔记:四边形不等式优化 DP

    定义 & 等价形式 四边形不等式是定义在整数集上的二元函数 \(w(x, y)\). 定义:对于任意 \(a \le b \le c \le d\),满足交叉小于等于包含(即 \(w(a, c ...

  9. BJOI2017 机动训练

    落谷.Loj. Description 定义机动路径为: 没有自环 路径至少包含两个格子 从起点开始每一步都向不远离终点的方向移动 相同地形序列指路径上顺序经过的地形序列. 定义机动路径的权值为相同地 ...

  10. (数据科学学习手札100)搞定matplotlib中的字体设置

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 matplotlib作为数据可视化的利器,被广泛 ...