k8s service type_k8s重器之Service

本文详细介绍了Kubernetes中的Service概念及其核心作用,包括Service的基本定义、创建方式及如何实现对外部请求的负载均衡。此外还探讨了Service在集群内外的访问方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

目录:

    Service定义详解

    Service基本用法

    集群外部访问Pod和Service

Service定义详解

Service的定义比Pod简单。

apiVersion: v1kind: Servicemetadata:  name: string  labels:    name: string  annotations:    name: stringspec:  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: v1kind: Servicemetadata:  name: nginx-servicespec:  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

创建之后查看:

699541b7e7021a5f1c7dfa2fe2e2f21b.png

可看到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: v1kind: Podmetadata:  name: nginx-pod1  labels:    name: nginx-podspec:  containers:  - name: nginx-pod1    image: nginx    imagePullPolicy: IfNotPresent    ports:    - containerPort: 80

nginx-two:

apiVersion: v1kind: Podmetadata:  name: nginx-pod2  labels:    name: nginx-podspec:  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访问

0285c5c5962b31720fc935d3166f21cd.png

b2d71d10dcb8f7da903a56ff2eb9b58a.png

可以看到,service进行了负载均衡处理。

集群外部访问Pod和Service

(1)将Pod的端口号映射到宿主机

比如将上述的nginx-pod1映射到主机的20080端口:

apiVersion: v1kind: Podmetadata:  name: nginx-pod1  labels:    name: nginx-podspec:  containers:  - name: nginx-pod1    image: nginx    imagePullPolicy: IfNotPresent    ports:    - containerPort: 80      hostPort: 20080

然后查看此Pod在哪个节点上运行

ead81e5420a1016ae035a253be77c15b.png

然后在浏览器中访问此节点的20080端口:

05d6dc9795ad3204b2acbae85e9fa7a6.png

(2)通过设置Pod级别的hostNetwork=true

该Pod的所有容器的端口号都将被直接映射到宿主机上,需要注意的是,如果不指定hostPort,则默认与containerPort一样,如果指定 ,则hostPort必须等于containerPort。

例如将上述的nginx-pod2设置hostNetwork=true

apiVersion: v1kind: Podmetadata:  name: nginx-pod2  labels:    name: nginx-podspec:  hostNetwork: true  containers:  - name: nginx-pod2    image: nginx    imagePullPolicy: IfNotPresent    ports:    - containerPort: 80

查看pod创建后在哪个节点上

91464370334821159dc27a4c270facb4.png

在浏览器上访问:

569ff640c8ee438d80dd8748dd2cf833.png

(3)将Service的端口号映射到宿主机上

通过设置spec.type为NodePort,同时设置spec.ports.nodePort设置宿主机上的端口号。

例如在Service基本用法那一小节的Service定义,相应的使用也在那一节有

apiVersion: v1kind: Servicemetadata:  name: nginx-servicespec:  type: NodePort  selector:    name: nginx-pod  ports:  - name: nginx-service    port: 80    targetPort: 80    nodePort: 30080
4bf21bfdbd4ed5de15d93b97c4c2f4a3.png

END

往期推荐

k8s水平扩容深入理解Pod(三)深入理解Pod(二)深入理解Pod(一)k8s基本使用

下期见

    5a6d1381f059a9608444f0fde6dd7ff2.png

Liusy01

一个分享Java后端学习日志的公众号

欢迎大家点个在看

分享至朋友圈

好文!点个好看!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值