8.k8s中网络资源service

目录

一、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-svc
  labels:
    k8s: oslee
spec:
  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    ports:
    - 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: LoadBalancer
  selector:
    k8s: oslee
  ports:
  - protocol: TCP
    port: 80
    targetPort: 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: c1
      image: 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 -padmin123

mysql> 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.46
  ports:
  - 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-pod
  labels: 
    k8s: oslee
spec:
  containers:
  - name: wp-c1
    image: wordpress:latest
    ports:
    - containerPort: 80
    env:
        - name: WORDPRESS_DB_HOST
          #外部mysql服务的svc资源名称及端口;
          value: svc-out:30002
        - name: WORDPRESS_DB_USER
          value: admin
        - name: WORDPRESS_DB_PASSWORD
          value: admin123
---

apiVersion: v1
kind: Service
metadata:
  name: wp-svc
spec:
  type: NodePort
  selector:
    k8s: oslee
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
[root@k8s1 service]# kubectl apply -f wp-demo.yaml 
pod/wp-pod created
service/wp-svc created

2.浏览器访问测试

至此,已成艺术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/591127.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter Notebook魔术命令

Jupyter Notebook是一个基于网页的交互式笔记本&#xff0c;支持运行多种编程语言。 Jupyter Notebook 的本质式一个Web应用程序&#xff0c;便于创建和共享文学化程序文档&#xff0c;支持实现代码&#xff0c;数学方程&#xff0c;可视化和markdown。用途包括&#xff1a;数据…

Redis 实战2

系列文章目录 本文将从字典的实现、哈希算法、解决键冲突、rehash、渐进式rehash几方面来阐述 Redis 实战Ⅱ 系列文章目录字典的实现哈希算法解决键冲突rehash渐进式 rehash渐进式 rehash 执行期间的哈希表操作 字典 API总结 字典的实现 Redis 的字典使用哈希表作为底层实现&…

解决layui的bug 在layui tree 组件中 禁用选中父节点后自动选中子节点功能

最近做权限管理后台&#xff0c;用了layui tree 组件&#xff0c;发现选中了父节点后&#xff0c;自动选中了子节点。不满足现实业务需求。所以微调了下源代码。 在用树形组件中&#xff0c;在用文档中 tree.setChecked(demoId, [2, 3]); //批量勾选 id 为 2、3 的节点 用这句…

All In ai,Oracle 23C没了,等来了Oracle 23ai

今年一月份的Blog介绍Oracle命名规则的时候&#xff0c;说到Oracle的命名是紧紧跟随时代浪潮的前言科技的&#xff0c;在文章的最后还大胆预测也许Oracle的下一个版本就叫25A了&#xff0c;结果Oracle根本等不及&#xff0c;把原来已经海量宣传的Oracle 23C直接改名为23ai&…

【Mac】Lightroom Classic 2024 v13.1安装教程

软件介绍 Lightroom Classic 2024是Adobe公司推出的一款专业的数字图像处理软件&#xff0c;旨在为摄影师提供强大的工具和功能&#xff0c;以管理、编辑和分享他们的照片作品。以下是Lightroom Classic 2024的主要特点和功能&#xff1a; 数字照片管理&#xff1a; 提供直观…

k8s集群安装

目录 部署步骤概览 1、基础环境部署 2、docker环境部署 3、配置k8s集群 4、集群初始化 5、安装dashboard软件 写在前面&#xff1a;本文安装单点master多node的k8s集群&#xff0c;主要用于k8s学习或k8s环境测试&#xff1b;部署的是1.23版本&#xff0c;在1.24版本起&am…

Android 官网Ota介绍

构建 OTA 软件包 | Android 开源项目 | Android Open Source Project

【RabbitMQ】可靠性策略(幂等,消息持久化)

MQ可靠性策略 发送者的可靠性问题生产者的重连生产者确认 MQ的可靠性数据持久化Lazy Queue 消费者的可靠性问题消费者确认机制消息失败处理 业务幂等性简答问题 发送者的可靠性问题 生产者的重连 可能存在由于网络波动&#xff0c;出现的客户端连接MQ失败&#xff0c;我们可以…

无人机+无人车:自组网协同技术及应用前景详解

无人车&#xff0c;也被称为自动驾驶汽车、电脑驾驶汽车或轮式移动机器人&#xff0c;是一种通过电脑系统实现无人驾驶的智能汽车。这种汽车依靠人工智能、视觉计算、雷达、监控装置和全球定位系统协同合作&#xff0c;使得电脑可以在没有任何人类主动操作的情况下&#xff0c;…

SpringBoot 基础简介

目录 1. SpringBoot 概述 1.1. 为什么会有springboot 1.1.1. 传统Spring 的两个缺点 1.1.2. Springboot 功能 2. SpringBoot 快速搭建 2.1. 创建Maven项目​编辑​编辑​编辑 2.2. 导入SpringBoot起步依赖 2.3. 定义controller 2.4. 添加引导类 2.5. 启动访问 3. Sprin…

香港理工大学内地事务总监陆海天教授确认出席“边缘智能2024 - AI开发者峰会”并发表主题演讲

隨著AI技術的日新月異&#xff0c;我們正步入一個邊緣計算智能化與分布式AI相互融合的新紀元。這一變革不僅推動了分布式智能創新應用的飛速發展&#xff0c;還使得邊緣智能——這一結合邊緣計算和智能技術的新興領域&#xff0c;逐漸成為引領AI發展的重要力量。通過其分布式和…

在家连学校的服务器

在家连接学校的服务器。 Step1: 首先下载一个vscode的插件 Visual Studio Code - Code Editing. Redefined 我的服务区是ubuntu20.04&#xff0c;x64的&#xff0c;所以下载这个。 Step2: 下载到本地之后&#xff0c;想办法将这个文件拷贝到你的服务器上。 Step3: 解压该包…

零基础该如何自学linux运维?

零基础该如何自学linux运维&#xff1f;以下是建议帮助你入门Linux运维的一些建议。 一、自学建议&#xff1a; 理解基础概念&#xff1a;首先&#xff0c;你需要对Linux操作系统的基本概念有所了解&#xff0c;包括文件系统、用户权限、进程管理等。安装Linux系统&#xff1…

AI-数学-高中-47导数与几何意义

原作者视频&#xff1a;【导数】【考点精华】7导数与几何意义考点解析&#xff08;基础&#xff09;_哔哩哔哩_bilibili 该点处切点的斜率 该点处导函数的值 示例1&#xff1a; 导数问题解决最常用方法&#xff1a;参数分离&#xff0c;在左边函数有解的值域范围内。 示例2&…

Jackson-jr 对比 Jackson

关于Jackson-jr 对比 Jackson 的内容&#xff0c;有人在做了一张下面的图。 简单点来说就 Jackson-jr 是Jackson 的轻量级应用&#xff0c;因为我们在很多时候都用不到 Jackson 的很多复杂功能。 对很多应用来说&#xff0c;我们可能只需要使用简单的 JSON 读写即可。 如我们…

微服务总览

微服务保护 微服务总览 微服务总览 接入层&#xff1a;反向代理功能&#xff0c;可以将用户域名访问的地址以负载均衡的方式代理到网关地址&#xff0c;并且并发能力非常高&#xff0c;并且会采用主备nginx的方式防止nginx寄了&#xff0c;备份nginx监控主nginx状态&#xff0c…

CMakeLists.txt 文件内容分析

一. 简介 前一篇文章学习了针对只有一个 .c源文件&#xff0c;cmake工具是如何使用编译的&#xff0c;文章如下&#xff1a; cmake的使用方法:单个源文件的编译-CSDN博客 本文对 所编写的 CMakeLists.txt文件的内容进行分析。从而了解如何编写一个 CMakeLists.txt文件。 二…

ElasticSearch01(ES简介,安装ES,操作索引,操作文档,RestAPI)【全详解】

目录 一、ES简介 1. 数据库查询的问题 2. ES简介 1 ElasticSearch简介 2 ElasticSearch发展 3. 倒排索引【面试】 1 正向索引 2 倒排索引 4. ES和MySql 5. 小结 二、安装ES 1. 方式1:使用docker安装 1 准备工作 2 创建ElasticSearch容器 3 给ElasticSearch配置i…

百度网盘里的文件怎么打印?

在日常生活和工作中&#xff0c;我们经常需要打印各种文件&#xff0c;包括学习资料、工作报告、合同文件等。有时候&#xff0c;这些文件保存在百度网盘等云存储服务中&#xff0c;我们该如何方便地打印出来呢&#xff1f;今天&#xff0c;就为大家介绍一种便捷的方法——通过…

一对一WebRTC视频通话系列(二)——websocket和join信令实现

本系列博客主要记录WebRtc实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 一对一WebRTC视频通话系列往期博客&#xff1a; 一对一WebRTC视频通话系列&#xff08;一&#xff09;—— 创建页面并显示摄像头画面 websocket和join信令…