11-k8s中网络资源service

一、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资源就先告一段落;

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

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

相关文章

【JavaScript】面试手写题精讲之数组(下)

引入 这章主要讲的是数组的排序篇&#xff0c;我们知道面试的时候&#xff0c;数组的排序是经常出现的题目。所以这块还是有必要进行一下讲解的。笔者观察了下前端这块的常用算法排序题&#xff0c;大概可以分为如下 冒泡排–> 稳定排序插入排序–> 稳定排序选择排序–…

你了解API测试吗?如何充分的测试一个API?

什么是API&#xff1f; API代表应用程序接口。API是软件系统中的中间层&#xff0c;负责数据源与用户看到的图形用户界面&#xff08;GUI&#xff09;之间的数据通信。换句话说&#xff0c;API是软件的业务层&#xff0c;它在表示层和数据层之间创建连接。 API测试侧重于所谓的…

Leecode之面试题消失的数字

一.题目及剖析 https://leetcode.cn/problems/missing-number-lcci/description/ 方法有很多,这里将两种时间复杂度为O(N)的方法 二.思路引入 第一种方法 先将0-n的总和求出来,在求出数组的总和,在做差就能得到消失的数字,不过要注意的是数据有可能溢出,这个方法很简单就不再…

Acwing二分和前缀和(二)

机器人跳跃问题 原题链接&#xff1a;https://www.acwing.com/activity/content/problem/content/1570/ 二分查找更新条件只有两种&#xff1a; Rmid;else Lmid1&#xff1a;mid(LR)/2Lmid;else R mid-1&#xff1a;mid(LR1)/2 这两种更新条件的结果是一样的。 #include<…

【Unity】【VR开发】针对VR项目的优化版Unity Build Settings

【背景】 编辑器中做了功能后,打包后却总会画面不满意,所以到处学习,总结成本篇,希望有用。 【准备】 本篇总结基于Unity 2021 LTS。 模板选择3D(URP) 如果URP不支持所用的部分Assets,那么也可以选择Built-in管线,不过URP肯定画面效果上要胜过Built-in。 HDRP不适用…

解决:docker创建Redis容器成功,但无法启动Redis容器、也无报错提示

解决&#xff1a;docker创建Redis容器成功&#xff0c;但无法启动Redis容器、也无报错提示 一问题描述&#xff1a;1.docker若是直接简单使用run命令&#xff0c;但不挂载容器数据卷等参数&#xff0c;则可以启动Redis容器2.docker复杂使用run命令&#xff0c;使用指定redis.co…

如何用AI绘画工具最好最省时省事的方法制作个性化头像框?

原文章链接&#xff1a;如何根据游戏素材制作主题头像框&#xff1f;实战教程来了&#xff01; - 优设网 - 学设计上优设 教程专区&#xff1a;AI绘画&#xff0c;AI视频&#xff0c;AI写作等软件类型AI教程&#xff0c; AI工具专区&#xff1a;AI工具-喜好儿aigc 在 APP 的…

P2P 应用

P2P 工作方式概述 在 P2P 工作方式下&#xff0c;所有的音频/视频文件都是在普通的互联网用户之间传输。 1 具有集中目录服务器的 P2P 工作方式 Napster 最早使用 P2P 技术&#xff0c;提供免费下载 MP3 音乐。 Napster 将所有音乐文件的索引信息都集中存放在 Napster 目录服…

Seurat 5 demo

1. 安装效果 > packageVersion("Seurat") [1] ‘5.0.0’ > packageVersion("SeuratObject") [1] ‘5.0.1’ > > packageVersion("SeuratData") [1] ‘0.2.2.9001’ > packageVersion("SeuratWrappers") [1] ‘0.3.2’…

AI:128-基于机器学习的建筑物能源消耗预测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

【LeetCode: 429. N 叉树的层序遍历 + BFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

《VulnStack》ATTCK-1

title: 《VulnStack》ATT&CK-1 date: 2024-01-29 14:53:49 updated: 2024-02-14 18:55:49 categories: WriteUp&#xff1a;Cyber-Range excerpt: 主机发现、端口扫描&#xff0c;服务探测&#xff0c;操作系统探测、nmap 漏洞库扫描、网站首页信息泄露、msf 渗透与信息收集…

【打工日常】使用docker部署linux-command解析搜索工具

一、linux-command介绍 linux-command工具是一个非盈利性的工具&#xff0c;里面记录了550 个 Linux 命令&#xff0c;内容包含 Linux 命令手册、详解、学习&#xff0c;是值得收藏的 Linux 命令速查手册。内容来自网络和网友的补充。 二、本次实践介绍 1. 本次实践简介 本次…

STM32固件库简介与使用指南

1. STM32官方标准固件库简介 STM32官方标准固件库是由STMicroelectronics&#xff08;ST&#xff09;提供的一套软件开发工具&#xff0c;旨在简化STM32微控制器的软件开发过程。该固件库提供了丰富的功能和模块&#xff0c;涵盖了STM32微控制器的各种外设&#xff0c;包括但不…

PLC-Recorder的延伸分析功能说明

目录 一、缘起 二、如何从PLC-Recorder获取数据 1、在线获取 2、全自主打开数据文件 3、延伸分析 三、设置方法 四、效果展示 一、缘起 在各个行业&#xff0c;在不同的场景中&#xff0c;朋友们拿到数据后&#xff0c;想做的事情五花八门&#xff0c;有做宏观分析的、…

MOSFET栅极应用电路分析汇总(驱动、加速、保护、自举等等)

概述 MOSFET是一种常见的电压型控制器件&#xff0c;具有开关速度快、高频性能、输入阻抗高、噪声小、驱动功率小、动态范围大、安全工作区域(SOA)宽等一系列的优点&#xff0c;因此被广泛的应用于开关电源、电机控制、电动工具等各行各业。栅极做为MOSFET本身较薄弱的环节&am…

《白话C++》第10章 STL和boost,Page67~70 std::auto_ptr

std::auto_ptr可以不经意间转移裸指针控制权 std::auto_ptr持有裸指针的控制权&#xff0c;却可以随随便便看似不经意地转移给另一个auto_ptr: #include <iostream> #include <memory>using namespace std;struct S {int a;void SetA(int a){this->a a;}~S()…

Sentinel注解@SentinelResource详解

Sentinel注解SentinelResource详解 熔断 针对访问超过限制【sentinel中配置的限制】的资源&#xff0c;通过java代码配置&#xff0c;返回一个自定义的结果&#xff0c;需要用到 SentinelResource 注解的 blockHandlerClass 和 blockHandler 属性。 blockHandlerClass&#…

Linux CPU 性能分析工具火焰图(Flame Graphs)认知

写在前面 博文内容为 《BPF Performance Tools》 读书笔记整理详细了解小伙伴可以访问作者官网&#xff1a;https://www.brendangregg.com/flamegraphs.html有油管上分享的作者在USENIX ATC 2017 的视屏理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&a…

恢复被.target勒索病毒加密的数据文件:拒绝向.target勒索病毒支付赎金

引言&#xff1a; 在当今数字时代&#xff0c;勒索病毒已成为网络安全领域的一大威胁&#xff0c;而.target勒索病毒是其中引起广泛关注的一种变种。本文将深入探讨.target勒索病毒的特点以及被其加密的数据文件恢复方法。数据的重要性不容小觑&#xff0c;您可添加我们的技术…