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. cobbler 装机服务

    一.Cobbler 安装 $ yum install -y epel-release $ yum install -y cobbler cobbler-web pykickstart debmirro ...

  2. VisualStudio C++使用汇编函数

    Visual Studio编写C++代码使用汇编函数 新建空项目 新建如下源文件 ;test.asm ;测试函数 三个数相加 ;.386 .model flat, c ;public test_ .c ...

  3. mfc 笔记

    在类成员初始化时,使用另一个成员变量,必须满足,在.h声明时在另一个变量之后,初始 .hprivate: //K线图位置 CPoint m_KPoint; //十字光标位置 CPoint m_trac ...

  4. CSRF&SSRF-初探准备

    了解CSRF之前的必备知识 1.同源策略 同源策略-三个相同:协议.域名.端口 举例说明: 源URL为:http://www.example.com/dir/page.html 协议为:http 域名 ...

  5. 09_消息通知Toast和Notification

    1. Toast 学习创建长短不一的Toast提示,并自定义Toast在屏幕上的位置以及Toast的外观. 1 package com.example.toastdemo; 2 3 import an ...

  6. kali putty远程连接允许以root身份登录

    原文链接:https://blog.csdn.net/long_long_chuang/article/details/70227874 kali linux通过ssh+putty来实现远程登录(亲测 ...

  7. 后端程序员必备的 Linux 基础知识

    1. 从认识操作系统开始 正式开始 Linux 之前,简单花一点点篇幅科普一下操作系统相关的内容. 1.1. 操作系统简介 我通过以下四点介绍什么是操作系统: 操作系统(Operating Syste ...

  8. PyQt编程实战:画出QScrollArea的scrollAreaWidgetContents内容部署层的范围矩形

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 在<PyQt(Python+Qt)学习随笔:QScrollArea滚动区域详解> ...

  9. PyQt(Python+Qt)学习随笔:QScrollArea为什么不起作用未出现滚动条?

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 老猿在进行Scroll Area部件测试时,在下面的窗体中放置了一个Scroll Area部件,在部 ...

  10. SASRec 实践

    SASRec--2018,ICDM,论文<Self-Attentive Sequential Recommendation> 源代码链接:https://github.com/kang20 ...