Kubernetes Service、Ingress

news2024/12/28 11:29:17

Service(4层负载均衡器)

  • 1、K8S 可以保证任意 Pod 挂掉时自动从任意节点启动一个新的Pod进行代替,以及某个Pod超负载时动态对Pod进行扩容。每当 Pod 发生变化时其 IP地址也会发生变化,且Pod只有在K8S集群内部才可以被访问,为了解决Pod发生变化导致其IP动态变化以及对外无法访问的问题,K8S引进了 Service 的概念

  • 2 K8S 使用 Service 来管理同一组标签下的 Pod ,当外界需要访问 Pod 中的容器时,只需要访问 Service 的这个虚拟 IP 和端口,由 Service 把外界的请求转发给它背后的Pod
    (将用户请求转发到不同Service)

Service暴露服务类型

1、ClusterIP(默认)

  • 自动为当前Service分配虚拟IP,在不重启Service前提下该IP是不会改变的,只能在集群内部访问

2、NodePort

  • 需要在K8S集群的所有 Node 节点上开放特定的端口【30000-32767】,通过(公网ip : 端口)访问Service服务。缺点:每个端口只能挂载一个Service

3、LoadBalancer

  • 和Nodeport相似,目的都是向外暴露一个端口,但 LoadBalancer 模式需要开发者在K8S集群外部的公有云服务器上做一个负载均衡设备(当前主流的阿里云、腾讯云、华为云、微软云等等厂商都有提供相关收费的服务),外部服务发送到公有云服务上的请求都会被负载并转发到K8S集群中LoadBalancer服务上
  • 如果要在私网环境下测试LoadBalancer,必须要创建一个MetalLB, MetalLB相当于一个负载均衡器的角色
  • LoadBalancer原理:外部请求首先被转发到外部LB负载设备,再通过匹配规则转发到k8s集群的任意node节点上,最终通过Service资源找到对应的pod

Service代理模式

service创建成功后会通过api-server向etcd中写入相关配置信息,kube-proxy会监听创建好的配置信息并将最新的service配置信息转化成对应的访问规则,最终实现外网对Pod的访问。常见的service访问规则有:iptables 和 ipvs

1、iptables

kube-proxy 为 service 后端的每个Pod创建对应的iptables规则,当用户访问ClusterIP时,直接将发送到ClusterIP的请求重定向到Pod
缺点:kube-proxy 不承担四层路由转发的角色,只负责创建iptables规则,无法实现LB策略

2、ipvs(性能高于iptables)

kube-proxy 监控Pod的变化并创建相应的ipvs规则,当用户访问ClusterIP时,直接将发送到ClusterIP的请求重定向到Pod
相比于iptables,支持LB策略

3、切换到IPVS模式

  • 查询当前代理模式
kubectl get pod -o wide -n kube-system | grep kube-proxy # 查新kube-proxy有关的pod

在这里插入图片描述

kubectl logs -n kube-system kube-proxy-7bst7

在这里插入图片描述

  • ipvs 安装(K8S集群的所有节点安装)
# yum install -y ipvsadm.x86_64   # Centos
apt install -y ipvsadm # Debian
ipvsadm -Ln # 查看ipvs模式开启状态

在这里插入图片描述

  • 切换Sevice代理模式为ipvs(K8S集群的Master节点修改)
kubectl edit configmap kube-proxy -n kube-system # 编辑configmap将mode改为ipvs 

在这里插入图片描述

  • 删除指定Pod
kubectl get pod -o wide -n kube-system | grep kube-proxy

在这里插入图片描述

kubectl delete pod kube-proxy-7bst7 -n kube-system # 删除pod后自动创建新的Pod
kubectl delete pod kube-proxy-9l7qr -n kube-system # 删除pod后自动创建新的Pod
kubectl delete pod kube-proxy-cqht2 -n kube-system # 删除pod后自动创建新的Pod
kubectl delete pod kube-proxy-h8znm -n kube-system # 删除pod后自动创建新的Pod
kubectl delete pod kube-proxy-l4p42 -n kube-system # 删除pod后自动创建新的Pod
kubectl delete pod kube-proxy-xlqtg -n kube-system # 删除pod后自动创建新的Pod

在这里插入图片描述

  • 使用ipvsadm -L -n验证
    在这里插入图片描述
    在这里插入图片描述

部署Nginx应用并对外访问

1、创建deployment并将其显示为Service

kubectl create deployment [pod控制器名称] --image=[pod中容器镜像名称:nginx] --replicas=[pod副本数量] -n [命名空间名称]
kubectl expose deployment [pod控制器名称] --name=[service名称] --type=NodePort --port=[service端口] --target-port=[容器端口] -n [命名空间名称]
#
# 强制删除Pod
kubectl delete deployment [pod控制器名称] -n [命名空间名称] --force --grace-period=0
kubectl delete pod [pod名称] -n [命名空间名称] --force --grace-period=0
# 
# 强制删除NameSpace
kubectl delete ns [命名空间名称] --force --grace-period=0 
kubectl get deployment,pods,service -n kube-system -o wide
kubectl get deployment,pods,service -n ns-demo -o wide
kubectl describe -n kube-system pod podName
#
kubectl delete ns ns-demo --force --grace-period=0 
kubectl delete deployment deployment-demo -n ns-demo --force --grace-period=0
kubectl delete pod deployment-demo- -n ns-demo --force --grace-period=0
  • 创建 NameSpace
kubectl create ns ns-demo && kubectl get ns
  • 创建 Deployment
kubectl create deployment deployment-demo --image=nginx --replicas=1 -n ns-demo # 级联创建Pod
kubectl get deployment,pods -n ns-demo -o wide # 查看创建的Deployment和Pod信息

在这里插入图片描述

kubectl logs -n ns-demo deployment-demo-8b49bd6b-tsrkd # 查看Pod创建的日志
kubectl describe -n ns-demo pod deployment-demo-8b49bd6b-tsrkd # 查看Pod创建的详细信息
#
# 错误场景:
# Warning FailedCreatePodSandBox kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox
# plugin type="calico" failed (add): error getting ClusterInformation: connection is unauthorized: Unauthorized
# 当前用的是“calico”网络插件,该插件是基于iptables来做安全访问策略,如果Sevice代理模式为ipvs则会导致创建容器失败
# 需要删除kube-system命名空间下所有的Pod并自行创建后方可生效
# 成功场景:
# Normal  Scheduled  2m29s  default-scheduler  Successfully assigned ns-demo/deployment-demo-8b49bd6b-rt47b to k8snode5
# Normal  Pulling    2m29s  kubelet            Pulling image "nginx"
# Normal  Pulled     2m9s   kubelet            Successfully pulled image "nginx" in 19.636298273s (19.636334074s including waiting)
# Normal  Created    2m9s   kubelet            Created container nginx
# Normal  Started    2m9s   kubelet            Started container nginx
  • 暴露 Deployment 为 Service 服务(将Service的8080端口转发至容器的80端口)
kubectl expose deployment deployment-demo --name=service-demo --type=NodePort --port=8080 --target-port=80 -n ns-demo
  • 查看创建的资源
kubectl get deployment,pods,service -n ns-demo -o wide

在这里插入图片描述

  • 通过Pod的IP访问nginx
curl 10.244.187.2:80
  • 通过Service的IP访问Nginx
curl 10.252.247.232:8080
  • 公网访问Nginx
http://192.168.111.30:30058 
http://192.168.111.33:30058
http://192.168.111.34:30058
http://192.168.111.35:30058

2、创建Service(yaml配置文件)

  • 编辑 yaml 文件
cd /home/lixing && vi service-demo.yaml # 在线编辑文件
apiVersion: v1
kind: Service
metadata:
  name: service-demo # Service名称
  namespace: ns-demo # namespace名称
spec: 
  selector: # 标签选择器
    app: deployment-demo # deployment名称
  type: NodePort # Service暴露服务的类型
  ports:
  - protocol: TCP # 通讯协议
    nodePort: 30000 # Node节点端口
    port: 8080 # service端口
    targetPort: 80 # pod端口
  • 通过 yaml 文件创建 Service
kubectl create -f /home/lixing/service-demo.yaml # kubectl delete -f /home/lixing/service-demo.yaml
  • 查看已创建的资源
kubectl get deployment,pods,service -n ns-demo -o wide

在这里插入图片描述

  • 公网访问Nginx
http://192.168.111.30:30000
http://192.168.111.33:30000
http://192.168.111.34:30000
http://192.168.111.35:30000

Ingress(7层负载均衡器)

Ingress(k8s内置的资源对象)

  • Ingress 是 k8s 的资源对象,用于定义请求如何转发到 Service 服务的规则
    在这里插入图片描述

ingress-controller(需要单独安装)

  • ingress-controller 不是 k8s 自带的组件,只是一个统称,可以选择不同的 ingress-controller 实现对 service 的反向代理及负载均衡,常用的 ingress-controller 产品有:F5 Networks、Kong、Traefik、NGINXHaProxyIstio

  • ingress-controller 本质是一个 pod,内部运行了 daemon 程序反向代理程序。daemon程序通过 K8S API 不断监控集群的变化,对 ingress 定义的规则进行解析并刷新配置到反向代理程序
    在这里插入图片描述

ingress 暴露服务方式

1、Deployment + NodePort 的 Service 模式

1、基于 Deployment 部署 ingress-controller 并创建对应的 Service 服务(type为NodePort),将ingress暴露在集群节点ip的特定端口上
2、一般适用于宿主机ip地址相对固定不变的场景,由于 Nodeport 暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求,NodePort方式暴露 ingress 虽然简单,但多了一层NAT,在请求量级很大时对性能会有一定影响

2、Deployment + LoadBalancer 的 Service 模式

1、基于 Deployment 部署 ingress-controller 并创建对应的 Service 服务(type为 LoadBalancer)
2、此模式需要将 ingress 部署在公有云,大部分公有云都会为 LoadBalancer 的 service 自动创建一个负载均衡器,通常还绑定了公网地址,只要把域名解析指向该公网地址就实现了集群服务的对外暴露

3、DaemonSet + HostNetwork + nodeSelector 的 Service 模式

1、基于 DaemonSet 结合 NodeSelector 来部署 ingress-controller 到特定的 node 上,再通过 HostNetwork 把该 pod 与宿主机 node 的网络打通,通过宿主机的80/433端口访问服务
2、该方式相对NodePort模式的性能更好,缺点:由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller,适合大并发的生产环境使用

部署 httpd 应用并对外访问(HTTP)

  • 创建 Deployment 控制器
kubectl apply -f /home/lixing/demo/deployment-httpd.yaml # kubectl delete -f /home/lixing/demo/deployment-httpd.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: ns-httpd
  name: deployment-httpd
  labels: # 给Deployment打标签
    app: httpd
spec: 
  selector: # Pod选择器
    matchLabels:
      app: httpd # 对标签为httpd的Pod进行管理
  replicas: 1 # 默认Pod副本数量
  template: 
      metadata:
        labels: 
          app: httpd # 为Pod打标签
      spec:
        #hostNetwork: true
        #nodeSelector: #使用节点选择器将Pod调度到指定label的节点
          #component: pod-demo
        containers:
        - name: httpd
          image: httpd
          imagePullPolicy: IfNotPresent
          ports: 
          - name: port-name-httpd 
            protocol: TCP
            containerPort: 80
  • 创建 Service 服务
kubectl apply -f /home/lixing/demo/service-httpd.yaml # kubectl delete -f /home/lixing/demo/service-httpd.yaml
apiVersion: v1
kind: Service
metadata:
  namespace: ns-httpd
  name: service-httpd
spec: 
  selector: #Deployment选择器
    app: httpd
  #type: NodePort # Service暴露服务的类型
  ports:
  - protocol: TCP # 通讯协议
    #nodePort: 30000 # 集群上所有Node节点端口
    port: 8080 # Service端口
    targetPort: 80 # Pod端口
  • 访问 Pod(直接访问Pod、通过Service访问Pod)
kubectl get deployment,pods,service,ingress -n ns-httpd -o wide

在这里插入图片描述
在这里插入图片描述

  • 修改Master节点的host文件(这里以Master节点为例)
vi /etc/hosts # 编辑Host文件,添加当前节点的ip和自定义域名
192.168.111.30 www.lixing.com
  • 创建 Ingress 规则
kubectl apply -f /home/lixing/demo/ingress-httpd.yaml # kubectl delete -f /home/lixing/demo/ingress-httpd.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: ns-httpd
  name: ingress-httpd
spec:
  ingressClassName: nginx
  rules:
    - host: www.lixing.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-httpd # Service名称
                port:
                  number: 8080 # Service端口
  • 通过 Ingress Nginx Controller 访问Pod
    在这里插入图片描述
    注意:ingress-nginx-controller 服务的端口转化信息:80:32163/TCP,443:31590/TCP

在这里插入图片描述
在这里插入图片描述

部署 httpd 应用并对外访问(HTTPS)

创建证书

openssl reg -x509 -sha256 -nodes -days 365 -newkey rsa:2048-keyout tls.key-out tls.crt-subj '/C=CN/ST=BJ/L=BJ/O=nginx/CN=itheima.com"

创建密钥

kubectl create secret tls tls-secret --key tls.key --cert tls.crt

创建 Ingress 规则

kubectl apply -f /home/lixing/demo/ingress-httpd.yaml # kubectl delete -f /home/lixing/demo/ingress-httpd-https.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: ns-httpd
  name: ingress-httpd-https
spec:
  ingressClassName: nginx
  tls:
    - hosts:
      - www.lixing.com
      secretName: tls-secret # 指定密钥
  rules:
    - host: www.lixing.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              serviceName: service-httpd # Service名称
              servicePort: 8080 # Service端口

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

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

相关文章

Flink高手之路4-Flink流批一体

文章目录 Flink高手之路4-Flink流批一体API开发一、流批一体相关的概念1.数据的时效性2.流处理和批处理1)批处理2)流处理3)两者对比 3.流批一体API4.流批一体的编程模型 二、Data Source1.预定义的Source1)基于集合的Sources(1)API(2)演示 2)基于文件的Source(1)API(2)演示 3)基…

2023.4.19 + 4.20

文章目录 String类1:介绍:2:String类实现了很多的接口:3;String类常用构造器4:不同方式创建String类对象的区别(1)直接赋值的方式(2)常规new的方式&#xff0…

【筛质数】——朴素筛,埃式筛,欧拉筛

题目描述: 题目分析: 这道题可以用,朴素筛,埃氏筛,欧拉筛来写。 普通筛: 时间复杂度:O(n logn) 时间复杂度太高,会超时的!!(9/10) #…

Keil5----显示空白符和设置使用空白格表示Tab键

一、Keil5界面----显示空白符 首先打开Keil5-MDK界面,然后按照下面步骤操作。 步骤1:点击 Edit(编辑),然后点击 Configuration(配置) 步骤2:勾选 View White Spaces(查看空白) 步骤3:显示设置后的结果 具体显示结果分…

Git添加SSH密钥本地仓库上传远程GitHub库

1、前言 现在想要从本地设备将本地仓库上传到GitHub上需要用到SSH密钥,接下来讲解大致的步骤,本文默认读者已经掌握基本的Git知识 2、详细步骤 2.1 创建密钥 在本地项目仓库根目录下,输入下面的命令: ssh-keygen -t rsa命令输…

深度学习 Day 31——YOLOv5-Backbone模块实现

深度学习 Day 31——YOLOv5-Backbone模块实现 文章目录 深度学习 Day 31——YOLOv5-Backbone模块实现一、前言二、我的环境三、什么是YOLOv5-Backbone模块?四、搭建包含Backbone模块的模型1、模型整体代码2、模型每一部分详解3、模型详情 五、模型训练六、最终结果1…

计算机|网页设计 |七大罪动漫主题|作品分享

文章目录 一、主题介绍二、截图展示三、源代码获取 一、主题介绍 计算机|网页设计 |七大罪动漫主题|作品分享 一个关于七大罪动漫主题的网页设计。共4页 图片文字都可修改! 二、截图展示 三、源代码获取 本次的分享就到这里啦&…

双指针【算法推导、背模板】——最长连续不重复子序列

799. 最长连续不重复子序列 - AcWing题库 通常情况双指针就是需要将O(N^2^)&#xff0c;利用某些单调性质实现O(N) 通用代码模板 for(int i 0 , j 0; i < n ; i ){while(j < i && check(i , j ) ) j ;// 需要处理的逻辑 }check判断是否构成 算法推导 题目中…

LLM总结(持续更新中)

引言 当前LLM模型火出天际&#xff0c;但是做事还是需要脚踏实地。此文只是日常学习LLM&#xff0c;顺手整理所得。本篇博文更多侧重对话、问答类LLM上&#xff0c;其他方向&#xff08;代码生成&#xff09;这里暂不涉及&#xff0c;可以去看综述来了解。 之前LLM模型梳理 …

微服务---RabbitMQ与SpringAMQP基本使用

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&am…

OpenCV实例(四)手写数字识别

OpenCV实例&#xff08;四&#xff09;手写数字识别 1.基本原理2.实现步骤2.1数据准备2.2计算匹配值2.3获取最佳匹配值及对应模板2.4获取最佳匹配模板对应的数字2.5输出识别结果 3.代码实例 作者&#xff1a;Xiou 1.基本原理 使用模板匹配的方式实现手写数字识别&#xff0c;…

2023/4/20总结

项目 网上关于listview的资料太少了&#xff0c;在网上的那些资料里面&#xff0c;了解到以下这些。 如果希望listview后期能更改或者更新&#xff0c;那么需要使用到 ObservableList 它可以观察到&#xff0c;listview的改动。 需要特别注意一点的是&#xff1a;写俩者的…

如何发布自己的 npm 包?

一. 准备工作 1. 注册 npm 账号 还没有 npm 账号&#xff1f;去官网注册&#xff1a; https://www.npmjs.com/ 需要记住用户名、密码、邮箱 2. 查看本地 npm 镜像&#xff0c;如果不是默认的&#xff0c;需要改回来 npm config get registry重置镜像路径 npm config set r…

vulstack ATTCK(三)靶场

0x00环境搭建 两种形式 1.添加vmare2网卡&#xff0c;修改vmare2网卡的地址为192.168.93.0网段&#xff0c;注意不要在连接到主机适配器上打勾&#xff0c;这样会使本机也可以访问此电脑&#xff0c;5台机器都换成vmare2即可&#xff0c;第一台出网的centos在添加另一张nat网卡…

Docker容器---数据卷 数据容器

Docker容器---数据卷 数据容器 一、数据卷概述1、数据卷2、数据卷原理3、数据卷作用 二、数据卷容器1、数据卷容器作用2、创建数据卷容器 三、容器互联1、创建并运行源容器取名web12、创建并运行接收容器取名web2 一、数据卷概述 管理 Docker 容器中数据主要有两种方式&#x…

社科院与杜兰大学中外合作办学金融管理硕士项目——比起过往,前路更值得期待

当结束一天工作陷入沉思时&#xff0c;你有没有特别遗憾的事情呢&#xff0c;人生有太多的不确定性&#xff0c;比起过往&#xff0c;未知的人生更值得我们期待。与其懊恼没完成的遗憾&#xff0c;不如珍惜当下&#xff0c;努力创造未来。人生没有太晚的开始&#xff0c;在职读…

frp内网穿透——以连接到校园内网的服务器为例

有时候想摸鱼不去实验室&#xff0c;在宿舍就直接连接到实验室的GPU服务器。奈何服务器在校园网内部&#xff0c;外网无法直接直接访问。此时需要手动搭一个跳板机&#xff0c;来连接到内网的GPU服务器&#xff0c;这一过程怎么做到呢&#xff1f;我们可以使用frp内网穿透工具&…

Seata:连接数据与应用

作者&#xff1a;季敏&#xff08;清铭&#xff09;Seata 开源社区创始人&#xff0c;分布式事务团队负责人。 本文主要介绍分布式事务从内部到商业化和开源的演进历程&#xff0c;Seata 社区当前进展和未来规划。 Seata 是一款开源的分布式事务解决方案&#xff0c;旨在为现…

Java基础(十八):java比较器、系统相关类、数学相关类

Java基础系列文章 Java基础(一)&#xff1a;语言概述 Java基础(二)&#xff1a;原码、反码、补码及进制之间的运算 Java基础(三)&#xff1a;数据类型与进制 Java基础(四)&#xff1a;逻辑运算符和位运算符 Java基础(五)&#xff1a;流程控制语句 Java基础(六)&#xff1…

JavaScript黑科技:隐秘执行

JavaScript黑科技&#xff1a;隐秘执行 如果能使网页中的JavaScript代码隐密的加载、隐密的执行&#xff0c;那对于保护JavaScript代码来说是很有利的。 本文将探索、演示一种隐秘执行JavaScript代码的技术。 源码如下&#xff1a; <html> <script>window.onlo…