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. python安装第三方库aiohtpp,sanio失败,pip install multidict 失败问题

    1.python的第三库安装地址:http://www.lfd.uci.edu/~gohlke/pythonlibs 2. 3.pip安装.whl文件指定该文件的位置

  2. volatile使用

    mq的故障延迟机制:

  3. rsync单项同步

    配置rsync+inotify实时单向同步 定期同步的缺点: 执行备份的时间固定,延期明显,实时性差 当同步源长期不变化时,密集的定期任务是不必要的(浪费资源) 实时同步的优点: 一旦同步源出现变化, ...

  4. pyhon的6大基本数据类型

    1.数字型(Number) 1.1 整型(int) 整型包括所有的正整数,负整数还有0. 在python中所有的整型数据全部默认采用十进制进行表示,但我们还可以手动表示其他进制的整型,具体表示如下: ...

  5. 关于 spring security 对用户名和密码的校验过程

    1.执行 AuthenticationManager 认证方法 authenticate(UsernamePasswordAuthenticationToken) 2.ProviderManager ...

  6. 想了解表格问答,我们先看看TA的前世

    摘要:表格问答是一种针对自然语言问题,根据表格内容给出答案的任务. 一.什么是表格问答 表1是一张综艺节目收视率报表,假如你需要了解市场份额在3%以上的综艺节目,你会选择采用什么样的方法? 首先,用肉 ...

  7. LeetCode 004 Median of Two Sorted Arrays

    题目描述:Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. F ...

  8. Golang自学系列

    为什么会有这个系列? 因为我要往架构方向靠拢啊. 关于架构,其实架构的书我看了<架构整洁之道>,也有<实现驱动领域设计>.但是我感觉明显还不够,所以我在极客时间买了一个架构相关 ...

  9. gradle插件版本号和Gradle版本号对应关系

    Plugin version Required Gradle version 1.0.0 - 1.1.3 2.2.1 - 2.3 1.2.0 - 1.3.1 2.2.1 - 2.9 1.5.0 2.2 ...

  10. JZOJ 2020.10.6 【NOIP2017提高A组模拟9.7】简单无向图

    简单无向图 题目 Description Input Output Sample Input 输入1: 4 2 1 1 2 输入2: 10 2 2 2 2 1 1 2 1 1 2 Sample Out ...