8.k8s中网络资源service

embedded/2024/10/22 5:04:06/

目录

一、service资源概述

二、service资源类型

1.ClusterIP类型

 2.service的nodeport类型

 3.service的loadbalancer类型(了解即可)

 4.service的externalname类型(了解即可)

 三、nodeport的端口范围设置和svc的endpoint列表

 1.修改apiservice的宿主机映射端口范围

 2.创建service和pod测试端口

四、service小结(重点) 

1.service资源的四种类型:

2.修改svc的NodePort类型中宿主机映射端口的范围

3.svc的endpoint列表

 五、service资源中endpoint列表关联外部服务

1.创建一个svc资源并查看

1.1编辑资源清单

1.2.查看svc资源

2.svc资源与endpoint资源关联

2.1k8s集群外部拉取一个mysql服务容器

六、案例:wordpress博客案例

1.创建wordpress的pod和svc资源

2.浏览器访问测试


一、service资源概述

每当我们企业的业务pod迭代功能的时候,都会修改pod,修改后重新启动pod,ip就会变化,那么在生产环境当中,从用户到宿主机、从宿主机到pod,这一个访问流程,都是事先写好的,一旦pod修改后,ip产生变化,就需要重新配置,因此,k8s提供了service资源用于解决这一问题;

  1. Service将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
  2. Service为一组 Pod 提供相同的 DNS 名,并且在它们之间进行负载均衡。
  3. Kubernetes 为 Pod 提供分配了IP 地址,但IP地址可能会发生变化。集群内的容器可以通过service名称访问服务,而不需要担心Pod的IP发生变化。

二、service资源类型

  1. ClusterIP:将服务公开在集群内部。kubernetes会给服务分配一个集群内部的 IP,集群内的所有主机都可以通过这个Cluster-IP访问服务。集群内部的Pod可以通过service名称访问服务。
  2. NodePort:通过每个节点的主机IP 和静态端口(NodePort)暴露服务。 集群的外部主机可以使用节点IP和NodePort访问服务。
  3. ExternalName:将集群外部的网络引入集群内部。
  4. LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 

1.ClusterIP类型

# 编写pod资源清单[root@k8s1 service]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: p1-svclabels:k8s: oslee
spec:containers:- name: c1image: nginx:1.20.1-alpineports:- containerPort: 80
# 编写service资源清单[root@k8s1 service]# cat 01-service-clusterip.yaml 
apiVersion: v1
kind: Service
metadata:name: svc-01
spec:#声明clusterip类型,不指定默认也是这个类型;type: ClusterIP#指定pod的标签selector: k8s: oslee#指定service的ip地址clusterIP: 10.200.100.100#用户访问service时,访问哪个端口?ports:#指定访问协议,若不指定协议,默认也是TCP- protocol: TCP#service的端口port: 80#pod的容器端口(目标端口)targetPort: 80# 创建资源
[root@k8s1 service]# kubectl apply -f .
service/svc-01 created
pod/p1-svc created
[root@k8s1 service]# kubectl get all -owide
NAME           READY   STATUS    RESTARTS   AGE    IP            NODE   NOMINATED NODE   READINESS GATES
pod/p1-svc     1/1     Running   0          4m1s   10.100.1.36   k8s2   <none>           <none>
pod/pod1-svc   1/1     Running   0          13s    10.100.1.38   k8s2   <none>           <none>NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE     SELECTOR
service/kubernetes   ClusterIP   10.200.0.1       <none>        443/TCP   2d11h   <none>
service/svc-01       ClusterIP   10.200.100.100   <none>        80/TCP    4m1s    k8s=oslee
[root@k8s1 service]# curl -I 10.200.100.100
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Fri, 03 May 2024 02:55:15 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 25 May 2021 13:41:16 GMT
Connection: keep-alive
ETag: "60acfe7c-264"
Accept-Ranges: bytes

 2.service的nodeport类型

nodeport类型,就是clusterip类型的升级版,它可以使用宿主机的端口,映射到service开放的端口上,从而,使得用户访问宿主机,宿主机转发到service资源,进而访问到pod资源;

[root@k8s1 service]# cat 02-service-nodeport.yaml 
apiVersion: v1
kind: Service
metadata:name: svc-02
spec:#声明nodePort类型;type: NodePort#指定pod的标签selector: k8s: oslee#指定service的ip地址(在nodeport类型中可以不设置,会随机生成)clusterIP: 10.200.100.101#用户访问service时,访问哪个端口?ports:#指定访问协议,若不指定协议,默认也是TCP- protocol: TCP#service的端口port: 80#pod的容器端口(目标端口)targetPort: 80#访问宿主机的哪个端口,可以转发访问到service?#注意,默认只能使用宿主机的30000-32767区间的端口号(可以放开限制,之后再说);nodePort: 30000
  1. port:port字段定义了Service暴露给集群内部和外部的端口号。当你创建一个Service时,其他应用或服务可以通过该端口与Service进行通信,将请求发送到Service上。这个端口号是Service在Kubernetes集群内部和外部可见的端口。
  2. targetPort:targetPort字段定义了Service将流量转发到后端Pod的容器端口号。当请求进入Service时,Service会根据其定义将请求转发到后端Pod的这个指定端口。通常,后端Pod中的应用程序在指定的容器端口上监听并处理请求。
  3. NodePort:NodePort是一种Service类型,它允许通过Kubernetes集群中的每个节点的IP地址和指定的端口号访问Service。NodePort是将外部流量导入到Service的一种方式。Kubernetes会在集群中的每个节点上打开一个高端口(默认30000-32767范围内),并将该端口映射到Service的port和targetPort上。这样,你可以通过任何节点的IP地址和NodePort来访问Service。

3.service的loadbalancer类型(了解即可)

我们使用云环境负载均衡器的时候,就将vip地址填写到这个类型之下,就可以实现云负载均衡访问svc访问pod;

[root@k8s1 service]# cat 03-service-loadbalancer.yaml 
kind: Service
apiVersion: v1
metadata:name: svc-loadbalancer
spec:# 指定service类型为LoadBalancer,注意,一般用于云环境type: LoadBalancerselector:k8s: osleeports:- protocol: TCPport: 80targetPort: 80# 注意,将来这个nodeProt也对应的是云环境负载均衡的地址nodePort: 30001# 指定LoadBalancer云环境的负载均衡地址,要确保K8S集群能和负载均衡的IP地址进行通信!#用户通过vip:10.0.0.88就可以访问到svc资源了;externalIPs:- 10.0.0.88

 4.service的externalname类型(了解即可)

域名转发功能,就是做了一个跳转,将来用户访问svc就会直接访问到我们设置的地址上,写上“百度”,就跳转到“百度”。

[root@k8s1 service]# cat 06-svc-ex.yaml 
apiVersion: v1
kind: Service
metadata:name: svc-externalname
spec:# svc类型type: ExternalName# 指定跳转到外部的域名地址externalName: www.baidu.com---apiVersion: v1
kind: Pod
metadata:name: p1
spec:containers:- name: c1image: nginx:1.20.1-alpine
[root@k8s1 service]# kubectl exec p1 -it -- sh
/ # cat /etc/resolv.conf 
nameserver 10.200.0.10
search default.svc.oslee.com svc.oslee.com oslee.com
options ndots:5
# yum安装dig
[root@k8s1 service]# yum -y install bind-utils# 从指定的 DNS 服务器上查询
[root@k8s1 service]# dig @10.200.0.10 svc-externalname.default.svc.oslee.com +short
www.baidu.com.
www.a.shifen.com.
183.2.172.185
183.2.172.42

 三、nodeport的端口范围设置和svc的endpoint列表

还记得在svc资源nodeport类型中,宿主机端口映射的范围必须在30000-32767之间,否则会报错;

但是,这个范围是可以修改的;只需要进入到静态pod目录中,找到kube-apiserver的pod资源,进入添加一条命令【--service-node-port-range=3000-50000】;

提交这个命令后,宿主机端口映射就变成了3000-50000了;

 1.修改apiservice的宿主机映射端口范围

[root@k8s1 service]# vim /etc/kubernetes/manifests/kube-apiserver.yaml# 增加这条命令
- --service-node-port-range=3000-50000

 2.创建service和pod测试端口

四、service小结(重点) 

1.service资源的四种类型:

  1. ClusterIP:给svc资源一个固定的IP地址,默认的类型;
  2. NodePort:在ClusterIP基础上,映射到宿主机(物理机)的端口号,默认是30000-32767可修改;
  3. LoadBalancer:可以添加云环境的负载均衡VIP地址和负载均衡器的宿主机端口号,用户通过访问VIP+负载均衡器的端口访问到svc资源,进而访问到pod==容器==服务中;
  4. ExternalName:类似于HTTP请求的302/301跳转,可以将访问svc的请求转发到指定的地址上;主要是转发功能;

2.修改svc的NodePort类型中宿主机映射端口的范围

默认是30000-32767,可以通过静态pod目录下的kube-apiserver.yaml的pod资源清单中加上一条命令,来设置宿主机的映射端口范围;

3.svc的endpoint列表

用户通过访问SVC资源,进而将请求转发到endpoint列表中的pod中,endpoint列表,就是svc将请求转发到的目的地;

 五、service资源中endpoint列表关联外部服务

1.创建一个svc资源并查看

1.1编辑资源清单

[root@k8s1 service]# cat svc-out.yaml 
apiVersion: v1
kind: Service
metadata:name: svc-out
spec:ports:- port: 30002
[root@k8s1 service]# kubectl apply -f svc-out.yaml 
service/svc-out created

1.2.查看svc资源

 可以看到endpoint列表中什么都没有,也就是说,现在访问svc资源,什么都访问不到;我们还记得上面说的,svc资源是通过“标签选择”来将pod提那家到svc的endpoint列表中的,那么我们如何将k8s集群外部的容器添加到endpoint列表中呢?

举例:在生产环境中,我们的数据库服务,都是常年运行的历史性业务服务,当企业的应用上k8s时,数据库的迁移工作非常的繁琐,所以,如果能将外部的SQL服务,提那家到svc资源的endpoint列表中,就节省了数据库迁移k8s的繁杂工作;

2.svc资源与endpoint资源关联

endpoint本质上也是一个单独的资源,只是在我们创建svc资源的时候,系统自动给我们创建的

svc资源与endpoint资源是通过元数据(metadata中的)名称,进行关联的,只要endpoint资源的名称与svc资源的名称相同,则,endpoint资源的服务IP就会出现在svc资源的endpoint列表中,即关联成功;

2.1k8s集群外部拉取一个mysql服务容器

找一个k8s集群之外的虚拟机,docker安装mysql

docker run --name=oslee-mysql \-p 13306:3306 -d \-e MYSQL_ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_DATABASE=wordpress \-e MYSQL_USER=admin \-e MYSQL_PASSWORD=admin123 \--restart always \mysql:8.0 \--default-authentication-plugin=mysql_native_password \--character-set-server=utf8 \--collation-server=utf8_bin

测试登录mysql

[root@node1 data]# docker exec -it oslee-mysql mysql -u admin -padmin123mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| wordpress          |
+--------------------+
2 rows in set (0.00 sec)

k8s集群中创建endpoint资源

[root@k8s1 service]# cat endpoint.yaml 
apiVersion: v1
kind: Endpoints
metadata:name: svc-out
subsets:
#指定外部endpoints的宿主机ip
- addresses:- ip: 10.128.172.46ports:- port: 13306
[root@k8s1 service]# kubectl apply -f endpoint.yaml 
endpoints/svc-out created

六、案例:wordpress博客案例

上述内容中,我们已经有了mysql,那么接下来,我们就搭建一套简单的架构,用户通过访问宿主机,转发到wordpress服务pod容器中,wordpress通过svc资源,访问到k8s外部数据库服务实现数据存储于查询;

wordpress ---> svc-out ---> endpoint ---> k8s集群外的宿主机mysql

1.创建wordpress的pod和svc资源

[root@k8s1 service]# cat wp-demo.yaml 
apiVersion: v1
kind: Pod
metadata:name: wp-podlabels: k8s: oslee
spec:containers:- name: wp-c1image: wordpress:latestports:- containerPort: 80env:- name: WORDPRESS_DB_HOST#外部mysql服务的svc资源名称及端口;value: svc-out:30002- name: WORDPRESS_DB_USERvalue: admin- name: WORDPRESS_DB_PASSWORDvalue: admin123
---apiVersion: v1
kind: Service
metadata:name: wp-svc
spec:type: NodePortselector:k8s: osleeports:- port: 80targetPort: 80nodePort: 30080
[root@k8s1 service]# kubectl apply -f wp-demo.yaml 
pod/wp-pod created
service/wp-svc created

2.浏览器访问测试

至此,已成艺术


http://www.ppmy.cn/embedded/30667.html

相关文章

【QT学习】13.使用TCP实现文件传输

一。传输文件流程 二。实现 结果&#xff1a; 1. server server类属性 Ui::Widget *ui;QTcpServer* pTcpServer;QTcpSocket* pTcpSocket;//文件与文件信息QFile file;QString m_fileName;qint64 m_fileSize; //整个文件大小qint64 fileSize; //当前已经发送的文件大小bool …

CSS中文本样式(详解网页文本样式)

目录 一、Text介绍 1.概念 2.特点 3.用法 4.应用 二、Text语法 1.文本格式 2.文本颜色 3.文本的对齐方式 4.文本修饰 5.文本转换 6.文本缩进 7.color&#xff1a;设置文本颜色。 8.font-family&#xff1a;设置字体系列。 9.font-size&#xff1a;设置字体大小。…

真机无需root实现抓包的两种方式之一小黄鸟篇

最新买了一部vivo Y30手机(V2034,android版本10,内存8G,存储128G)。 pc环境:win10,python3.8.10。 目的:实现vivo Y30上浏览器以及各类APP的https抓包。 众所周知,在Andorid7(含)以上系统内抓包,需要root环境,将https证书从用户证书转移到系统证书中来,在没有…

高德地图在vue3项目中使用:实现画矢量图、编辑矢量图

使用高德地图实现画多边形、矩形、圆&#xff0c;并进行编辑保存和回显。 1、准备工作 参考高德地图官网&#xff0c;进行项目key申请&#xff0c;链接: 准备 2、项目安装依赖 npm i amap/amap-jsapi-loader --save3、地图容器 html <template><!-- 绘制地图区域…

课程35:Docker容器:Windows Containers与Linux Containers区别

这里写目录标题 🚀前言一、Windows Containers与Linux Containers区别二、基于Linux本地Docker调试2.1 添加Docker支持2.2 Windows与Linux本地Docker调试的区别2.2.1 对比不同目标OS2.2.2 Dockerfile区别2.2.3 项目文件2.3 总结三、Windows下基于Linux Containers部署3.1 发布…

快讯! MySQL 8.4.0 LTS 发布(MySQL 第一个长期支持版本)

MySQL 第一个长期支持版本 8.4.0 LTS 发布&#xff0c;社区版下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 功能变更 添加或更改的功能 组复制&#xff1a;与组复制相关的两个服务器系统变量的默认值已更改&#xff1a; 系统变量的默认值为 group_replication…

《Spring-MVC》系列文章目录

简介 Spring MVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;它通过把Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09;分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂…

【JAVA基础之反射】反射详解

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 1.反射 1.1 概述 是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b; 对于任意一个对象&#xff0c;都能够调用它…