kubernetes-service微服务

news/2024/6/3 19:18:50 标签: kubernetes, 微服务, 容器

目录

一、service微服务

 二、Ipvs模式

三、ClusterIP

1.ClusterIP

2.headless

四、NodePort

1.NodePort

2.默认端口

五、LoadBalancer

1.LoadBalancer

2.metallb

六、ExternalName


一、service微服务

       Kubernetes Service微服务是一种基于Kubernetes的微服务架构,它通过将服务拆分成多个小服务单元来实现高度可扩展性、弹性和可维护性。每个服务单元都有自己的容器、存储和网络,可以独立部署和升级。同时,Kubernetes Service微服务还可以使用Kubernetes内置的负载均衡器来自动化地分配请求和处理服务故障。总之,Kubernetes Service微服务是一种基于Kubernetes的先进的容器编排和管理技术,它可以提供高效、高可用和高可扩展的微服务体系结构。

 二、Ipvs模式

       Kubernetes Service的IPVS模式是一种高效的负载均衡方式,它使用Linux内核提供的IPVS(IP Virtual Server)技术来实现。

       在IPVS模式下,Kubernetes会在每个节点上创建一个独立的IPVS代理,并将所有服务的虚拟IP地址通过BGP协议广播到物理网络中。这些IP地址随后被路由到相应的节点,并由节点上的IPVS代理进行请求的转发。

       IPVS代理可以根据服务的负载均衡策略(如轮询、源IP哈希、最小连接数等)选择合适的后端Pod,并将请求转发到该Pod上。同时,IPVS代理还支持会话保持(Session Affinity)功能,确保来自同一客户端的请求都被转发到同一后端Pod上,以避免数据不一致等问题。

       IPVS模式的优势在于它的性能和可扩展性非常好,能够轻松处理大量的网络请求。同时,由于IPVS代理和物理网络之间的解耦,它也具有较好的灵活性和可靠性,能够适应各种不同的网络环境和服务需求。

修改proxy配置:

kubectl -n kube-system edit  cm kube-proxy

重启pod

kubectl -n kube-system get pod|grep kube-proxy | awk '{system("kubectl -n kube-system delete pod "$1"")}'

切换ipvs模式后,kube-proxy会在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配service IP

三、ClusterIP

1.ClusterIP

       Kubernetes中的Service对象可以用来定义一组Pod的逻辑访问方式,其中ClusterIP是Service的默认类型。ClusterIP会为Pod提供一个虚拟IP地址,这个地址只在Kubernetes集群内部可用,其他外部网络无法访问该地址。

 创建测试示例:

vim myapp.yml


apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myapp
  name: myapp
spec:
  replicas: 6
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v1
        name: myapp

---

apiVersion: v1
kind: Service
metadata:
  labels:
    app: myapp
  name: myapp
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp
  type: ClusterIP


//ClusterIP是Kubernetes Service的一种类型。它为同一个Kubernetes集群中的其他Pod提供了访问Service的IP地址。这个IP地址和Service是虚拟的, 不对外暴露,只能在集群内部使用。

kubectl apply -f myapp.yml
kubectl get svc
dig -t A myapp.default.svc.cluster.local. @10.96.0.10

service创建后集群DNS提供解析

ClusterIP Service类型默认使用iptables调度。iptables负责将Service的ClusterIP地址映射到后端Pod的IP地址和端口上,处理请求的负载均衡和高可用性 

2.headless

       Kubernetes Service 的 headless 模式是指 Service 不会自动创建 ClusterIP 代理。在headless 模式下,当 Service 对应的 Pod 通过 DNS 查询时,将返回所有 Pod 的 IP 地址列表,而不是一个单独的 IP 地址。

headless Service 可以用于以下场景:

  • 有状态应用程序(StatefulSet):每个 Pod 都需要一个唯一的标识符,例如数据库的名称。
  • 多副本应用程序:需要将每个副本的 IP 地址列表返回给客户端来进行负载均衡。
  • 集群内部通信:例如,一个应用程序需要直接与另一个应用程序的 Pod 进行通信,而不是 Service 的负载均衡代理。

使用 headless Service 的方法是,在 Service 的 YAML 文件中将 clusterIP 设置为 None,例如:

vim myapp.yml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: myapp
  name: myapp
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp
  type: ClusterIP
  clusterIP: None

kubectl delete svc myapp
kubectl apply -f myapp.yml
kubectl get svc

headless模式不分配vip

headless通过svc名称访问,由集群内dns提供解析

dig -t A myapp.default.svc.cluster.local. @10.96.0.10

集群内直接使用service名称访问

kubectl run demo --image busyboxplus -it --rm

nslookup myapp

四、NodePort

1.NodePort

       NodePort类型的Service会在每个Node上打开一个端口,用于将请求转发到Pod。

       nodePort是Service类型的一个字段,用于指定转发请求的端口范围。默认情况下,该值是随机分配的。

以下是创建一个NodePort类型的Service的yaml示例:

vim myapp.yml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: myapp
  name: myapp
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp
  type: NodePort

nodeport在集群节点上绑定端口,一个端口对应一个服务

2.默认端口

        NodePort 的默认端口是 30000 到 32767 之间的任意一个端口。可以通过 kubectl get svc 命令查看 NodePort 所绑定的端口。

vim myapp.yml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: myapp
  name: myapp
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 33333
  selector:
    app: myapp
  type: NodePort

nodeport默认端口是30000-32767,超出会报错:

添加如下参数,端口范围可以自定义

- --service-node-port-range=30000-50000

修改后api-server会自动重启,等apiserver正常启动后才能操作集群

五、LoadBalancer

1.LoadBalancer

        Kubernetes中的LoadBalancer是一种服务类型,它允许在云环境中创建外部可访问的负载均衡器。在使用LoadBalancer类型的服务时,Kubernetes集群会自动创建云供应商的负载均衡器,并将请求分发到后端Pod中。

        LoadBalancer服务类型需要云供应商支持,并且通过自动创建外部负载均衡器来实现。例如,使用AWS的Elastic Load Balancer或GCP的Load Balancer。配置一个LoadBalancer服务需要定义服务的端口和目标端口,以及要使用的负载均衡算法和策略。

        使用LoadBalancer服务类型,可以轻松地将Kubernetes中部署的应用程序暴露给外部网络,并在应用程序实例之间分配流量,以便提供高可用性和可扩展性。

vim myapp.yml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: myapp
  name: myapp
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp
  type: LoadBalancer

LoadBalancer模式适用云平台,裸金属环境需要安装metallb提供支持

2.metallb

        Metallb是一个用于处理Load Balancing的开源软件。在Kubernetes集群中,Service是一个抽象的概念,它为Pod提供了一个统一的入口,使得Pod可以被其他Pod或外部网络访问到。Metallb为Kubernetes Service提供了一个软件定义的Load Balancer,它可以自动分配IP地址,并将流量路由到正确的Pod。

        Metallb的核心组件是speaker和controller。controller负责监控Kubernetes Service和Pod的状态,并为每个Service分配一个IP地址。而speaker则会在每个节点上运行,将Service的IP地址配置到节点上的网络接口。

        使用Metallb,Kubernetes集群中的Service可以获得一个固定的IP地址,而无需依赖于云厂商的Load Balancer。这样可以提高集群的稳定性和可靠性,并且可以在任何环境下部署Kubernetes集群。

kubectl edit configmap -n kube-system kube-proxy
kubectl -n kube-system get pod|grep kube-proxy | awk '{system("kubectl -n kube-system delete pod "$1"")}'

strictARP: true //启用 Kubernetes Service 的 strictARP 选项可以防止 ARP 欺骗攻击,提高网络安全性

下载部署文件

wget https://raw.githubusercontent.com/metallb/metallb/v0.13.11/config/manifests/metallb-native.yaml

修改文件中镜像地址,与harbor仓库路径保持一致

上传harbor仓库:

部署服务

kubectl apply -f metallb-native.yaml
kubectl -n metallb-system get pod

配置分配地址段

vim config.yaml

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.67.120-192.168.67.200  #修改为自己本地地址段

---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool

通过分配地址从集群外访问服务

六、ExternalName

        Kubernetes Service 的 ExternalName 类型是一种非常简单的服务类型,它允许 Kubernetes 集群中的服务通过一个 DNS CNAME 来引用一个外部的服务。这个服务可以是集群外的任何服务,比如一个第三方的数据库或者缓存服务器等。

        使用 ExternalName 类型的服务,可以方便地将 Kubernetes 集群中的应用程序连接到集群外的服务,同时还可以使用 Kubernetes 的负载均衡和服务发现功能。这样就可以实现将多个服务整合到一个统一的 DNS 域名下管理的目的。

ExternalName 类型的服务定义非常简单,只需要指定服务名称和外部服务的 DNS 名称即可。例如:

vim externalname.yaml


apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type:  ExternalName
  externalName: www.westos.org‘

kubectl apply -f externalname.yaml
dig -t A my-service.default.svc.cluster.local. @10.96.0.10

 


http://www.niftyadmin.cn/n/5141207.html

相关文章

centos卸载自带的Python3.6.8 安装指定的版本号

#卸载python3 rpm -qa|grep python3|xargs rpm -ev --allmatches --nodeps #删除所有残余文件 whereis python3 |xargs rm -frv#查看现有安装的python,验证是否删除干净 whereis python # 安装依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-de…

代码训练营第56天:动态规划part14|leetcode1143最长公共子序列|leetcode1035不相交的线

leetcode1143:最长公共子序列 文章讲解:leetcode1143 leetcode1035:不相交的线 文章讲解:leetcode1035 目录 1,leetcode1143 最长公共子序列 2,leetcode1035:不相交的线 3,leetco…

QT5交叉编译保姆级教程(arm64、mips64)

什么是交叉编译? 简单说,就是在当前系统平台上,开发编译运行于其它平台的程序。 比如本文硬件环境是x86平台,但是编译出来的程序是在arm64架构、mips64等架构上运行 本文使用的操作系统:统信UOS家庭版22.0 一、安装…

stc8a8k64 DMA(BMM)接收

void UART1_ISR_Handler (void) interrupt UART1_VECTOR {if(RI){RI 0;if(COM1.B_RX_OK 0){if(COM1.RX_Cnt > COM_RX1_Lenth) COM1.RX_Cnt 0;RX1_Buffer[COM1.RX_Cnt] SBUF;COM1.RX_TimeOut TimeOutSet1;}}if(TI){TI 0;COM1.B_TX_busy 0;} }

Java实现Hive UDF详细步骤 (Hive 3.x版本,IDEA开发)

这里写目录标题 前言1. 新建项目2.配置maven依赖3.编写代码4.打jar包5.上传服务器6.代码中引用 前言 老版本编写UDF时,需要继承 org.apache.hadoop.hive.ql.exec.UDF类,然后直接实现evaluate()方法即可。 由于公司hive版本比较高(3.x&#x…

【深度学习】pytorch——实现CIFAR-10数据集的分类

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 往期文章: 【深度学习】pytorch——快速入门 CIFAR-10分类 CIFAR-10简介CIFAR-10数据集分类实现步骤一、数据加载及预处理实现数据加载及预处理归一化的理解访问数据集Dataset对象Dataloader对象 二、…

2023NOIP A层联测22-差后队列

定义差后队列为一个数据结构,支持两种操作: pop 随机删除一个不是最大值的的数。如果只有一个数则删除该数。push 插入一个数(正常插入)。 给定操作序列,求每次删的数的期望,以及每个数期望被删的时间&am…

QML 创建 Web 混合应用

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 随着互联网的快速发展,Web 应用在各个领域中变得越来越流行。为了满足用户对多样化功能的需求,我们经常需要将 Web 技术和原生应用相结合,来创建混合应用程序。 混合应用程序:是一种应用程序开发方法,它…