K8S的统一访问入口-Service

2024-08-21 07:20

本文主要是介绍K8S的统一访问入口-Service,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

一篇文章精通K8S的统一访问入口-Service

1、Service是什么?

  • 背景:每个Pod具有IP地址,当使用Deployment控制器时,Pod的IP地址往往动态变化。

  • 解决方法:通过Service可以获得稳定的IP地址,且在Service的生命周期有效,与Pod的IP地址变化与否无关。

  • 实质:Service本质就是一个LB负载均衡器

2.Service存在的意义

3.Pod与Service的关系

4.Service定义和创建

5.创建Nginx

[root@k8s-master ~]# vim deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deployment  labels:    app: nginxspec:  replicas: 3  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx:1.14.2        ports:        - containerPort: 80

查看刚刚部署的Nginx服务标签

[root@k8s-master ~]# kubectl get pods --show-labelsNAME                       READY   STATUS    RESTARTS     AGE   LABELSnginx-6799fc88d8-s5rnz           1/1    Running   0          24d   app=nginx,pod-template-hash=6799fc88d8nginx-deployment-66b6c48dd5-hxv7h   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5nginx-deployment-66b6c48dd5-jjkk4   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5nginx-deployment-66b6c48dd5-tsgvb   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5

查看当前namespace(default)下有哪些svc

[root@k8s-master ~]# kubectl get svcNAME         TYPE      CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGEkubernetes   ClusterIP     10.96.0.1     <none>        443/TCP        24dnginx        NodePort    10.108.41.4   <none>        80:31434/TCP    24d

定义并创建Service

[root@k8s-node2 ~]# vim service.yamlapiVersion: v1kind: Servicemetadata:  name: web  namespace: defaultspec:  ports:  - port: 80        # Service端口    protocol: TCP    # 协议    targetPort: 80   # 容器端口(程序启动端口,比如django默认是8000端口)  selector:     app: nginx      # 指定关联Pod的标签(上面已经查到了,app=nginx)  type: ClusterIP      # 服务类型

创建svc

[root@k8s-master ~]# kubectl apply -f service.yaml

通过Service访问Nginx集群

[root@k8s-master ~]# kubectl get svcNAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGEkubernetes    ClusterIP    10.96.0.1       <none>      443/TCP        24dnginx        NodePort    10.108.41.4      <none>      80:31434/TCP    24dweb         ClusterIP    10.105.53.183     <none>       80/TCP       2m40s[root@k8s-master ~]# curl 10.105.53.183        # 可以通过web的地址访问后面三个nginx集群 [root@k8s-master ~]# kubectl delete svc web2     # 可以删除其中一个Service三种常用类型
  • ClusterIP:集群内部使用

  • NodePort:对外暴露应用(集群外)

  • LoadBalancer:对外暴露应用,适用公有云

ClusterIP(VIP)

NodePort

图片

部署并测试

[root@k8s-master ~]# vim deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deployment  labels:    app: nginxspec:  replicas: 3  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx:1.14.2        ports:        - containerPort: 80

查看nginx服务的标签

[root@k8s-master ~]# kubectl get pods --show-labelsNAME                       READY   STATUS    RESTARTS     AGE   LABELSnginx-6799fc88d8-s5rnz           1/1    Running   0          24d   app=nginx,pod-template-hash=6799fc88d8nginx-deployment-66b6c48dd5-hxv7h   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5nginx-deployment-66b6c48dd5-jjkk4   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5nginx-deployment-66b6c48dd5-tsgvb   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5

使用NodePort创建svc

[root@k8s-node2 ~]# vim service-nodeport.yamlapiVersion: v1kind: Servicemetadata:  name: web-nodeport  namespace: defaultspec:  ports:  - port: 80        # Service端口    protocol: TCP    # 协议    targetPort: 80    # 容器端口(程序启动端口,比如django默认是8000端口)    nodePort: 30706   # 指定NodePort监听的外网端口  selector:     app: nginx      # 指定关联Pod的标签(上面已经查到了,app=nginx)  type: NodePort      # 服务类型(只需要把服务类型修改成NodePort即可)

创建svc

[root@k8s-master ~]# kubectl apply -f service-nodeport.yaml

访问

  • 访问地址:<任意NodeIP>:NodePort

  • 端口范围:30000-32767

图片

NodePort弊端

LoadBalancer

LB说明

  • 负责均衡器有哪些:nginx、LVS、haproxy

  • 私有云:SLB、ELB

配置LB

  • 直接找一个nginx配置反向代理即可

stream {    log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';    access_log  /var/log/nginx/django-access.log  main;    upstream django-apiserver {                server 192.168.56.62:30706;                server 192.168.56.63:30706;            }       server {       listen 88;       proxy_pass django-apiserver;    }}

注意:生产最好使用云厂商的ELB或者SLB

Service二种特殊类型

  • ExternalName:引用集群外的服务

  • Headless:允许Pod通过其主机名被访问

    ExternalName Service

ExternalName Service说明:

ExternalName Service 是一种特殊类型的 Service,它不分配 ClusterIP,也不选择 Pods。相反,它允许你通过 Kubernetes Service 来引用外部的服务,比如一个托管在集群外的数据库或任何其他服务。

使用场景:

  • 引用集群外的服务。

  • 简化对外部服务的引用,不需要修改应用程序配置。

操作步骤:

  1. 创建一个 ExternalName 类型的 Service YAML 文件,指定 type: ExternalName 和 externalName 字段。

  2. 应用该 YAML 文件来创建 Service。

apiVersion: v1kind: Servicemetadata:  name: external-db-servicespec:  type: ExternalName  externalName: my.database.com  ports:  - port: 5432

实现效果:

  • 当你创建了上述 Service 后,Kubernetes 会创建一个 DNS 记录,使得external-db-service.default.svc.cluster.local解析到 my.database.com

  • 集群内的 Pod 可以通过这个 DNS 名称和端口号 5432 来访问外部的数据库服务。

ExternalName Service 优缺点:

优点:

  1. 简化外部服务引用:不需要修改应用程序的配置即可引用外部服务。

  2. 集成外部服务:可以无缝地将外部服务集成到Kubernetes集群的服务发现机制中。

  3. 灵活性:可以引用任何可通过DNS解析的服务,不限于特定的服务类型或协议。

缺点:

  1. 依赖外部服务:如果外部服务不可用,那么通过ExternalName Service 访问它也会失败。

  2. 没有负载均衡:不提供内置的负载均衡功能,所有流量直接转发到外部服务。

  3. 安全性:如果外部服务需要特定的安全措施,可能需要额外的配置。

Headless Service

Headless Service说明:

Headless Service 是一种不分配 ClusterIP 的 Service,它允许每个 Pod 通过其主机名直接被访问。

使用场景:

  • 当你不需要 Kubernetes 来管理负载均衡和路由时。

  • 当你想要直接控制 Pod 的访问方式时。

操作步骤:

  1. 创建一个 Service YAML 文件,不要指定 clusterIP: None(默认就是 None)。

  2. 应用该 YAML 文件来创建 Service。

apiVersion: v1kind: Servicemetadata:  name: headless-servicespec:  # 注意这里不指定 clusterIP  selector:    app: my-app  ports:  - name: http    port: 80    targetPort: 8080

实现效果:

  • 创建 Service 后,Kubernetes 会为每个匹配的 Pod 创建一个 DNS 记录。

  • Pod 可以通过 <pod-name>.headless-service.default.svc.cluster.local 来访问同一 Service 下的其他 Pod。

  • 这种方式不提供负载均衡,直接通过 DNS 解析到具体的 Pod。

Headless Service 优缺点:

优点:

  1. 直接访问:允许直接通过Pod的主机名访问,无需通过负载均衡器。

  2. 简单性:不需要Kubernetes进行流量管理和负载均衡,简化了网络架构。

  3. 适用于无状态服务:对于不需要负载均衡的无状态服务,Headless Service是一个轻量级的选择。

缺点:

  1. 没有负载均衡:不提供负载均衡,可能导致某些Pod过载而其他Pod空闲。

  2. 管理复杂性:需要手动管理Pod的访问和负载分配,增加了运维的复杂性。

  3. 扩展性问题:当服务需要水平扩展时,手动管理Pod的访问可能会变得不切实际。

这篇关于K8S的统一访问入口-Service的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092495

相关文章

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

NGINX 配置内网访问的实现步骤

《NGINX配置内网访问的实现步骤》本文主要介绍了NGINX配置内网访问的实现步骤,Nginx的geo模块限制域名访问权限,仅允许内网/办公室IP访问,具有一定的参考价值,感兴趣的可以了解一下... 目录需求1. geo 模块配置2. 访问控制判断3. 错误页面配置4. 一个完整的配置参考文档需求我们有一

C#实现访问远程硬盘的图文教程

《C#实现访问远程硬盘的图文教程》在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件,这次我们将给出一个完整的... 目录引言一. 远程硬盘功能展示二. 远程硬盘代码实现1. 底层业务通信实现2. UI 实现三. De

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee