11-k8s中网络资源service

news2024/11/27 11:13:19

一、service资源概述

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

二、service资源类型

创建一个工作目录

[root@k8s231 pod]# mkdir -pv /xinjizhiwa/service
[root@k8s231 pod]# cd /xinjizhiwa/service

1,service的cluster IP类型

· 编辑service资源清单

[root@k8s231 service]# cat 01-service-clusterip.yaml 
apiVersion: v1
kind: Service
metadata:
  name: svc-01
spec:
  #声明clusterip类型,不指定默认也是这个类型;
  type: ClusterIP
  #指定pod的标签
  selector: 
    k8s: xinjizhiwa
  #指定service的ip地址
  clusterIP: 10.200.100.100
  #用户访问service时,访问哪个端口?
  ports:
    #指定访问协议,若不指定协议,默认也是TCP
  - protocol: TCP
    #service的端口
    port: 80
    #pod的容器端口(目标端口)
    targetPort: 80

· 编辑pod资源清单

[root@k8s231 service]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: p5
  labels:
    k8s: xinjizhiwa
spec:
  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    ports:
    - containerPort: 80

· 创建资源

[root@k8s231 service]# kubectl apply -f .

· 测试访问service和pod资源看是否都能访问到容器

2,service的nodeport类型

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

· 编辑service资源清单

[root@k8s231 service]# cat 01-service-clusterip.yaml 
apiVersion: v1
kind: Service
metadata:
  name: svc-02
spec:
  #声明nodePort类型;
  type: NodePort
  #指定pod的标签
  selector: 
    k8s: xinjizhiwa
  #指定service的ip地址(在nodeport类型中可以不设置,会随机生成)
  clusterIP: 10.200.100.101
  #用户访问service时,访问哪个端口?
  ports:
    #指定访问协议,若不指定协议,默认也是TCP
  - protocol: TCP
    #service的端口
    port: 80
    #pod的容器端口(目标端口)
    targetPort: 80
    #访问宿主机的哪个端口,可以转发访问到service?
    #注意,默认只能使用宿主机的30000-32767区间的端口号(可以放开限制,之后再说);
    nodePort: 30000

· 创建svc资源

[root@k8s231 service]# kubectl apply -f 01-service-clusterip.yaml

· 浏览器访问宿主机端口测试是否能够访问到容器

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

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

· 模拟宿主机的vip

        也就是说,模拟负载均衡器(模拟例如keepalive的bip地址)vip;

[root@k8s231 service]# ifconfig eth0:1 10.0.0.88

· 编辑svc资源清单

[root@k8s231 service]# vim 03-service-loadbalancer.yaml 

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

· 创建svc资源

[root@k8s231 service]# kubectl apply -f 03-service-loadbalancer.yaml

· 宿主机浏览器访问

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

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

· 编写svc资源清单

[root@k8s231 service]# vim 06-svc-ex.yaml

apiVersion: v1
kind: Service
metadata:
  name: svc-externalname
spec:
  # svc类型
  type: ExternalName
  # 指定跳转到外部的域名地址
  externalName: www.baidu.com

· 创建svc资源

[root@k8s231 service]# kubectl apply -f 06-svc-ex.yaml

· 随便创建一个pod查看其dns解析地址

[root@k8s231 service]# vim 02-pod-nginx.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: p1
spec:
  containers:
    - name: c1
      image: nginx:1.20.1-alpine

· 进入pod查看dns解析地址

[root@k8s231 service]# kubectl exec p1 -it -- sh

/ # cat /etc/resolv.conf 
nameserver 10.200.0.10
search default.svc.xinjizhiwa.com svc.xinjizhiwa.com xinjizhiwa.com

· 测试访问

[root@k8s231 ~]# dig @10.200.0.10 svc-externalname.default.svc.xinjizhiwa.com +short
www.baidu.com.
www.a.shifen.com.
110.242.68.3
110.242.68.4

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

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

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

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

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

[root@k8s231 service]# vim /etc/kubernetes/manifests/kube-apiserver.yaml 

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 10.0.0.231:6443
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    ......

   #就是这一条命令;

    - --service-node-port-range=3000-50000
    - --advertise-address=10.0.0.231
......

2,创建svc测试能否实现宿主机端口范围的映射

[root@k8s231 service]# cat 06-svc-ex.yaml 
apiVersion: v1
kind: Service
metadata:
  name: svc-externalname
spec:
  type: NodePort
  selector:
    k8s: xinjizhiwa
  clusterIP: 10.200.1.100
  ports:
  - protocol: TCP
    port: 88
    targetPort: 99
    nodePort: 8080

3,查看svc的详细信息

[root@k8s231 service]# kubectl describe svc svc-externalname 
Name:                     svc-externalname
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 k8s=xinjizhiwa
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.200.1.100
IPs:                      10.200.1.100
Port:                     <unset>  88/TCP
TargetPort:               99/TCP
NodePort:                 <unset>  8080/TCP

#还没有匹配到pod,所以Endpoints是none,匹配到的话,就会显示pod的ip地址
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

4,创建pod

[root@k8s231 service]# vim pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: p7
  labels:
    k8s: xinjizhiwa
spec:
  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    ports:
    - containerPort: 99

[root@k8s231 service]# kubectl apply -f pod.yaml 
pod/p7 created

5,再次查看svc的详细信息

[root@k8s231 service]# kubectl describe svc svc-externalname

四、svc小结(重点)

1,service资源的四种类型:

        · ClusterIP:给svc资源一个固定的IP地址,默认的类型;

        · NodePort:在ClusterIP基础上,映射到宿主机(物理机)的端口号,默认是30000-32767可修改;

        · LoadBalancer:可以添加云环境的负载均衡VIP地址和负载均衡器的宿主机端口号,用户通过访问VIP+负载均衡器的端口访问到svc资源,进而访问到pod==容器==服务中;

        · 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资源

· 编辑资源清单

[root@k8s231 endpoint]# vim svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: svc01
spec:
  ports:
  - port: 888

· 创建svc资源

[root@k8s231 endpoint]# kubectl apply -f svc.yaml

· 查看svc资源

[root@k8s231 endpoint]# kubectl describe svc svc01

        可以看到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列表中,即关联成功;

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

        随便找一个k8s集群之外的虚拟机,本次我们拿harbor虚拟机做演示;

[root@harbor ~]# docker run --name=xinjizhiwa-mysql \
  -p 13306:3306 -d \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=yes \
  -e MYSQL_DATABASE=wordpress \
  -e MYSQL_USER=admin \
  -e MYSQL_PASSWORD=xinjizhiwa \
  --restart always \
  mysql:8.0 \
  --default-authentication-plugin=mysql_native_password \
  --character-set-server=utf8 \
  --collation-server=utf8_bin

· 测试登录mysql容器和添加测试数据

[root@harbor ~]# docker exec -it xinjizhiwa-mysql mysql -u admin -pxinjizhiwa
..............

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| wordpress          |
+--------------------+
..............

mysql> show tables from wordpress;

· k8s集群中创建endpoint资源

[root@k8s231 endpoint]# vim endpoint.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: svc01
subsets:
#指定外部endpoints的宿主机ip
- addresses:
  - ip: 10.0.0.230
  ports:
  - port: 13306

[root@k8s231 endpoint]# kubectl apply -f endpoint.yaml

此时再次查看svc资源,发现endpoints列表中,出现了外部服务的ip+端口;

我们、成功了;

六、案例:wordpress博客案例

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

· 创建wordpress的pod和svc资源

[root@k8s231 endpoint]# cat wp-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: wp-pod
  labels: 
    k8s: xinjizhiwa
spec:
  containers:
  - name: wp-c1
    image: wordpress:latest
    ports:
    - containerPort: 80
    env:
        - name: WORDPRESS_DB_HOST
          #外部mysql服务的svc资源名称及端口;
          value: svc01:888
        - name: WORDPRESS_DB_USER
          value: admin
        - name: WORDPRESS_DB_PASSWORD
          value: xinjizhiwa
---

apiVersion: v1
kind: Service
metadata:
  name: wp-svc
spec:
  type: NodePort
  selector:
    k8s: xinjizhiwa
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080

[root@k8s231 endpoint]# kubectl apply -f wp-pod.yaml

· 浏览器访问测试

        可见访问成功,至此service资源就先告一段落;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

储能光伏一体化解决方案

上海安科瑞电气股份有限公司 胡冠楠 咨询家&#xff1a;“Acrelhgn”&#xff0c;了解更多产品资讯 1. 工业园区能源数字化系统构成 把一个工业园区的能源系统看成一个微网&#xff0c;这个能源微网可能由微电网、给/排水网、供冷/热管网、燃气管网等等组成。要提高园区的能源…

【安全狐】Windows修改文件时间

Windows修改文件时间 在应急响应过程中不要对文件时间100%的相信 powershell下执行 (ls 1.txt).CreationTimeUtc2029-01-25 06:00:10 (ls 1.txt).LastWriteTimeUtc2029-01-25 06:00:10 (ls 1.txt).LastAccessTimeUtc2029-01-25 06:00:10

selenium 驱动 Edge浏览器,解决selenium打开Edge浏览器闪退问题

一、Edge浏览器驱动下载 1、在设置中查看浏览器的版本号 2、在官网中进行对应下载 Microsoft Edge WebDriver - Microsoft Edge Developer 二、环境变量配置 1、打开设置界面 右击【此电脑】---选择【属性】----选择【高级系统设置】-----点击【环境变量】 2、变量设置 在…

Linux------环境变量

目录 前言 一、环境变量 二、添加PATH环境变量 三、HOME环境变量 四、查看所有环境变量 1.指令获取 2.代码获取 2.1 getenv 2.2main函数的第三个参数 2.3 全局变量environ 五、环境变量存放地点 六、添加自命名环境变量 七、系统环境变量具有全局属性 八、环境变…

[AIGC] 利用 ChatGpt 深入理解 Java 虚拟机(JVM)的内存分布

深入理解 Java 虚拟机&#xff08;JVM&#xff09;的内存分布 Java 虚拟机&#xff08;JVM&#xff09;是 Java 编程语言的核心运行环境&#xff0c;它负责解释和执行 Java 字节码。在 JVM 中&#xff0c;内存被划分为几个不同的区域&#xff0c;每个区域都有特定的用途。了解…

java生成pdf

1.pdf预览 2.maven <!--pdf--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version></dependency><dependency><groupId>com.itextpdf</groupId>…

易点易动设备管理系统:提升企业设备管理效率的智能选择

随着科技的不断进步和企业规模的不断扩大&#xff0c;设备管理对于企业的运营效率和成本控制变得越来越重要。为了更好地管理和掌控企业设备&#xff0c;易点易动设备管理系统应运而生。作为一款全新的智能化设备管理解决方案&#xff0c;易点易动系统能够有效提高企业的设备管…

RabbitMQ监控方法以及核心指标

RabbitMQ监控方法以及核心指标 1. 监控指标采集2. 使用rabbimq插件采集指标2.1 3.8.0之前版本&#xff0c;使用外部插件暴露2.2 3.8.0之后版本&#xff0c;使用内置插件暴露 3. 使用rabbitmq_exporter采集指标3.1 部署rabbitmq_exporter3.2 prometheus采集rabbitmq_exporter的暴…

【DBeaver+mysql】如何在DBeaver中创建mysql服务的连接并新建数据库

一、创建步骤 1、下载安装mysql 8.0&#xff08;注意&#xff0c;安装过程会启动mysql服务&#xff0c;这才是能用命令行执行node处理sql语句的关键&#xff09; 下载地址&#xff1a;https://dev.mysql.com/downloads/file/?id526407 2、下载安装DBeaver数据库管理IDE 3、在…

【presto权威指南】presto介绍

需求&#xff1a;如何从众多数据源中快速处理数据 现实生产架构多源异构&#xff0c;需要一个强有力的工具&#xff08;抽象&#xff09;统一数据查询/分析 这也是presto/trino从诞生之初便贴数据湖查询工具 tag的原因&#xff0c;presto生来为此 生产环境的困境 1.数据源众多…

CrossOver 24.0 让Mac可以运行Windows程序的工具

CrossOver 24.0最新版重点添加了对 DirectX 12 支持&#xff0c;从而在 Mac 上更好地模拟运行 Windows 游戏&#xff0c;开发者在 CrossOver 23 中可以调用 DirectX 12&#xff0c;在模拟游戏的过程中同时调用所有 GPU 核心&#xff0c;从而实现更优秀的渲染效果。 目前CrossOv…

c++入门学习⑥——友元和运算符重载

目录 简介&#xff1a; 友元&#xff1a; 全局函数做友元 类做友元 成员函数做友元 运算符重载 加号运算符重载 代码示例&#xff1a; 输入输出运算符重载 ⭐cin ⭐cout 代码示例&#xff1a; 分析&#xff1a; 自增运算符重载 代码示例&#xff08;成员函数实现…

苹果电脑深度清理工具CleanMyMac X2025中文版

苹果电脑用户们&#xff0c;你们是否经常感到你们的Mac变得不再像刚拆封时那样迅速、流畅&#xff1f;可能是时候对你的苹果电脑进行一次深度清理了。在这个时刻&#xff0c;拥有一些高效的深度清理工具就显得尤为重要。今天&#xff0c;我将介绍几款优秀的苹果电脑深度清理工具…

建立流行病预警指数体系并优化传染病模型:对公共卫生突发事件监测数据的分析

应对紧急情况造成的损害的能力是紧急能力现代化的重要象征。 在应对紧急情况时&#xff0c;政府机构和决策者需要更多信息来源&#xff0c;以更有效地估计灾难可能的演变。 这篇论文提出了一个预测COVID-19动态演变的优化模型&#xff0c;该模型将系统动力学的传播算法与预警指…

Windows如何打开投影到此电脑

1.首先点开设置 找到系统 点击投影到此电脑&#xff0c;如果这3行都显示灰色说明没有开启。 2.如何开启投影到此电脑 ①回到设置&#xff0c;点击应用 ②点击可选应用 ③ 安装无线显示器 投影设置可以和我一样

IP地址证书

IP地址证书&#xff0c;顾名思义&#xff0c;是一种用于验证互联网协议&#xff08;IP&#xff09;地址所有权的数字证书。它类似于网站的安全套接字层&#xff08;SSL&#xff09;证书&#xff0c;但专门用于确认和保障IP地址的所有者身份。这种证书由权威的证书颁发机构&…

【Jvm】性能调优(拓展)Jprofiler如何监控和解决死锁、内存泄露问题

文章目录 Jprofiler简介1.安装及IDEA集成Jprofiler2.如何监控并解决死锁3.如何监控及解决内存泄露(重点)4.总结5.后话 Jprofiler简介 Jprofilers是针对Java开发的性能分析工具(免费试用10天), 可以对Java程序的内存,CPU,线程,GC,锁等进行监控和分析, 1.安装及IDEA集成Jprofil…

proteus8.15图文安装教程

proteus8.15版本可以用STM32系列单片机来进行仿真设计&#xff0c;比7.8版本方便多了&#xff0c;有需要的朋友们可以在公众号后台回复 proteus8.15 获取软件包。 1、下载好软件包&#xff0c;解压如下&#xff0c;右键proteus8.15.sp1以管理员身份运行。 2、第一次安装&#x…

YOLOv6 学习笔记

概况 yolov6 出来的时候 yolov7 已经出了。 YOLOv6设计主要包含以下几个方面&#xff1a; 网络架构设计&#xff1a;对于Backbone和Neck&#xff0c;延续了YOLOv4和YOLOv5的PAN架构思想并使用了重参思想进行了改进&#xff1b;关于Head部分&#xff0c;作者对Decoupled Hea…

【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数

前言 嘿伙计们&#xff01;准备好了吗&#xff1f;今天我要和你们探讨一个酷炫的话题——Oracle数据库&#xff01;&#x1f389; 在这篇博文【Oracle】玩转Oracle数据库&#xff08;二&#xff09;&#xff1a;体系结构、存储结构与各类参数&#xff0c;我们要揭开Oracle数据库…