Kubernetes中的微服务

news/2025/3/9 8:46:37/

一、什么是微服务

在 Kubernetes 中,微服务是一种将应用拆分为独立、可扩展的小型服务的架构模式。每个微服务通常运行在独立的容器中,并通过网络进行通信。Kubernetes 提供了多种机制来管理和暴露这些微服务,使其能够高效地运行和扩展。

1.1 服务暴露与 Service

在 Kubernetes 中,Service 是一种抽象资源,它将一组提供相同服务的 Pod 组合在一起使用 标签选择器(Labels Selector) 来动态关联后端的 Pod。标签选择器定义了哪些 Pod 属于这个 Service)并为它们提供一个统一的访问接口。这个接口可以是一个虚拟 IP 地址、一个 DNS 名称或一个固定的端口,使得客户端可以方便地访问服务,而无需关心后端 Pod 的具体实现细节。Service 的主要功能包括:

  • 服务发现:通过 DNS 或环境变量,Pod 可以发现并连接到其他服务。

  • 负载均衡:Service 会自动将请求分发到后端的 Pod 上,实现负载均衡。

  • 默认支持 4 层负载均衡:Service 默认支持 TCP/UDP 等传输层协议。如果需要 7 层功能(如 HTTP/HTTPS 路由),可以通过 Ingress 来实现。

1.2 Service 的类型

Kubernetes 提供了多种类型的 Service,每种类型适用于不同的场景:

类型作用描述
ClusterIP默认类型,Kubernetes 系统自动分配一个虚拟 IP,仅在集群内部可访问。
NodePort将 Service 暴露为每个节点上的一个端口,外部可通过节点 IP 加端口访问。
LoadBalancer在 NodePort 的基础上,通过云服务提供商创建外部负载均衡器,适用于云环境。
ExternalName将服务通过 DNS CNAME 记录转发到指定的外部域名。

1.3 示例:创建一个 Service

以下是一个简单的 Service 示例,将一个 Deployment 暴露为一个 ClusterIP 类型的 Service:

# 创建 Deployment
kubectl create deployment admin --image myapp:v1 --replicas 2 --dry-run=client -o yaml > admin.yaml
# 创建 Service
kubectl expose deployment admin --port 80 --target-port 80 --dry-run=client -o yaml >> admin.yaml
# 查看 Service
kubectl get services

二、微服务的类型详解

2.1 ClusterIP

ClusterIP 是默认的 Service 类型,它会分配一个虚拟 IP仅在集群内部可访问。这种类型的 Service 适用于仅在集群内部通信的场景。

特点:
  • 内部访问:仅在集群内部可访问。

  • 自动发现:集群内的 Pod 可以通过 DNS 或环境变量发现其他 Service。

  • 负载均衡:自动将请求分发到后端的 Pod。

示例:
apiVersion: v1                       # 指定 Kubernetes API 版本
kind: Service                        # 资源类型为 Service
metadata:                            # 元数据部分name: admin                        # Service 的名称
spec:                                # Service 的具体配置ports:                             # 定义 Service 的端口配置- port: 80                       # Service 的端口号targetPort: 80                 # 后端 Pod 的目标端口号selector:                          # 用于选择后端 Pod 的标签选择器app: admin                       # 匹配标签为 app=admin 的 Podtype: ClusterIP                    # Service 类型为 ClusterIP

2.2 Headless Service

Headless Service 是一种特殊的 ClusterIP 类型,它不会分配 Cluster IPkube-proxy 也不会处理它。这种类型的 Service 通常用于直接访问 Pod 的 IP 地址,适用于需要直接与 Pod 通信的场景。

示例:
apiVersion: v1                       # 指定 Kubernetes API 版本
kind: Service                        # 资源类型为 Service
metadata:                            # 元数据部分name: admin                        # Service 的名称
spec:                                # Service 的具体配置ports:                             # 定义 Service 的端口配置- port: 80                       # Service 的端口号targetPort: 80                 # 后端 Pod 的目标端口号selector:                          # 用于选择后端 Pod 的标签选择器app: admin                       # 匹配标签为 app=admin 的 Podtype: ClusterIP                    # Service 类型为 ClusterIPclusterIP: None                    # 设置为 None,表示不分配 Cluster IP

2.3 NodePort

NodePort 类型的 Service 会在每个节点上绑定一个端口,外部可以通过节点 IP 加端口的方式访问 Service。

特点:
  • 外部访问:可以通过节点 IP 加端口的方式访问。

  • 端口范围:默认端口范围为 30000-32767,可以通过修改 kube-apiserver 配置来扩展范围。

示例:
apiVersion: v1                       # 指定 Kubernetes API 版本
kind: Service                        # 资源类型为 Service
metadata:                            # 元数据部分name: admin                        # Service 的名称
spec:                                # Service 的具体配置ports:                             # 定义 Service 的端口配置- port: 80                       # Service 的端口号targetPort: 80                 # 后端 Pod 的目标端口号nodePort: 31771                # 在每个节点上绑定的端口号selector:                          # 用于选择后端 Pod 的标签选择器app: admin                       # 匹配标签为 app=admin 的 Podtype: NodePort                     # Service 类型为 NodePort

2.4 LoadBalancer

LoadBalancer 类型的 Service 通过云服务提供商的负载均衡器实现外部访问。它适用于云环境,不支持裸金属环境。

特点:
  • 外部负载均衡:通过云服务提供商的负载均衡器实现。

  • 自动分配 VIP:云服务提供商会自动分配一个外部 IP。

示例:
apiVersion: v1                       # 指定 Kubernetes API 版本
kind: Service                        # 资源类型为 Service
metadata:                            # 元数据部分name: admin                        # Service 的名称
spec:                                # Service 的具体配置ports:                             # 定义 Service 的端口配置- port: 80                       # Service 的端口号targetPort: 80                 # 后端 Pod 的目标端口号selector:                          # 用于选择后端 Pod 的标签选择器app: admin                       # 匹配标签为 app=admin 的 Podtype: LoadBalancer                 # Service 类型为 LoadBalancer

2.5 ExternalName

ExternalName 类型的 Service 通过 DNS CNAME 记录将请求转发到指定的外部域名。这种类型的 Service 适用于将外部服务引入 Kubernetes 集群。

示例:
apiVersion: v1                       # 指定 Kubernetes API 版本
kind: Service                        # 资源类型为 Service
metadata:                            # 元数据部分name: admin                        # Service 的名称
spec:                                # Service 的具体配置type: ExternalName                 # Service 类型为 ExternalNameexternalName: www.admin.org        # 指定外部域名

三、IPVS 模式

IPVS(IP Virtual Server)是一种高性能的负载均衡解决方案,适用于大规模集群环境。与默认的 iptables 模式相比,IPVS 模式可以显著降低 CPU 资源消耗。

3.1 IPVS 模式配置

  1. 安装 IPVS 工具: 在所有节点上安装 ipvsadm 工具:

    yum install ipvsadm -y  # 安装 IPVS 工具
  2. 修改 kube-proxy 配置: 将 kube-proxy 的代理模式切换为 IPVS 模式:

    kubectl -n kube-system edit cm kube-proxy  # 编辑 kube-proxy 配置

    修改配置文件,将 mode 设置为 ipvs

  3. 重启 kube-proxy Pod: 重启 kube-proxy Pod 以应用新的配置:

    kubectl -n kube-system delete pods -l k8s-app=kube-proxy  # 删除旧的 kube-proxy Pod
  4. 验证 IPVS 配置: 使用 ipvsadm -Ln 命令查看 IPVS 规则:

    ipvsadm -Ln  # 查看 IPVS 规则

四、Ingress-nginx

Ingress-Nginx 是一个基于 Nginx 的 Kubernetes Ingress 控制器,它将外部 HTTP/HTTPS 流量路由到集群内的服务Ingress 是一种用于控制和管理 HTTP/HTTPS 流量的 Kubernetes 资源,而 Ingress 控制器则是实现这些规则的实际组件

4.1 Ingress 的功能

  • 全局负载均衡:Ingress 提供的全局负载均衡能力,使得 Kubernetes 集群能够通过一个统一的入口管理外部流量,并根据规则将流量智能地分发到不同的后端服务。

  • 支持 7 层功能:支持 HTTP/HTTPS 路由、重定向、认证等功能。

  • 动态配置Ingress Controller 是一个实际运行的组件,负责监听 Ingress 资源的变化,并根据这些资源定义的规则动态调整其内部配置。 

4.2 部署 Ingress-nginx

  1. 下载部署文件: 下载 Ingress-nginx 的部署文件:

    wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/baremetal/deploy.yaml
  2. 修改镜像地址: 如果使用私有镜像仓库,需要修改部署文件中的镜像地址。

  3. 部署 Ingress-nginx: 应用部署文件:

    kubectl apply -f deploy.yaml  # 应用 Ingress-nginx 部署文件
  4. 验证部署: 检查 Ingress-nginx 的 Pod 和 Service 是否正常运行:

    kubectl -n ingress-nginx get pods  # 查看 Ingress-nginx 的 Pod 状态
    kubectl -n ingress-nginx get svc   # 查看 Ingress-nginx 的 Service 状态

4.3 Ingress 的高级用法

4.3.1 基于路径的访问

通过 Ingress 的路径规则,可以将不同路径的请求转发到不同的后端服务。

apiVersion: networking.k8s.io/v1     # 指定 Kubernetes API 版本
kind: Ingress                        # 资源类型为 Ingress
metadata:                            # 元数据部分name: ingress1                     # Ingress 的名称
spec:                                # Ingress 的具体配置ingressClassName: nginx            # 指定 Ingress 类型为 nginxrules:                             # 定义规则- host: www.admin.org            # 指定主机名http:                          # 定义 HTTP 规则paths:                       # 定义路径规则- path: /v1                # 路径为 /v1pathType: Prefix         # 路径类型为前缀匹配backend:                 # 后端服务配置service:               # 指定后端服务name: myapp-v1       # 服务名称port:                # 服务端口number: 80         # 端口号- path: /v2                # 路径为 /v2pathType: Prefix         # 路径类型为前缀匹配backend:                 # 后端服务配置service:               # 指定后端服务name: myapp-v2       # 服务名称port:                # 服务端口number: 80         # 端口号
4.3.2 基于域名的访问

通过 Ingress 的主机名规则,可以将不同域名的请求转发到不同的后端服务。

apiVersion: networking.k8s.io/v1     # 指定 Kubernetes API 版本
kind: Ingress                        # 资源类型为 Ingress
metadata:                            # 元数据部分name: ingress2                     # Ingress 的名称
spec:                                # Ingress 的具体配置ingressClassName: nginx            # 指定 Ingress 类型为 nginxrules:                             # 定义规则- host: myappv1.admin.org        # 指定主机名http:                          # 定义 HTTP 规则paths:                       # 定义路径规则- path: /                  # 路径为 /pathType: Prefix         # 路径类型为前缀匹配backend:                 # 后端服务配置service:               # 指定后端服务name: myapp-v1       # 服务名称port:                # 服务端口number: 80         # 端口号- host: myappv2.admin.org        # 指定主机名http:                          # 定义 HTTP 规则paths:                       # 定义路径规则- path: /                  # 路径为 /pathType: Prefix         # 路径类型为前缀匹配backend:                 # 后端服务配置service:               # 指定后端服务name: myapp-v2       # 服务名称port:                # 服务端口number: 80         # 端口号
4.3.3 TLS 加密

通过 Ingress 的 TLS 功能,可以为服务启用 HTTPS 加密。

# 创建 TLS 证书
openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 365 -subj "/CN=nginxsvc/O=nginxsvc" -out tls.crt
# 创建 Secret
kubectl create secret tls web-tls-secret --key tls.key --cert tls.crt
apiVersion: networking.k8s.io/v1     # 指定 Kubernetes API 版本
kind: Ingress                        # 资源类型为 Ingress
metadata:                            # 元数据部分name: ingress3                     # Ingress 的名称
spec:                                # Ingress 的具体配置tls:                               # 定义 TLS 配置- hosts:                         # 定义支持的主机名- myapp-tls.admin.org        # 主机名secretName: web-tls-secret     # 引用的 TLS Secret 名称ingressClassName: nginx            # 指定 Ingress 类型为 nginxrules:                             # 定义规则- host: myapp-tls.admin.org      # 指定主机名http:                          # 定义 HTTP 规则paths:                       # 定义路径规则- path: /                  # 路径为 /pathType: Prefix         # 路径类型为前缀匹配backend:                 # 后端服务配置service:               # 指定后端服务name: myapp-v1       # 服务名称port:                # 服务端口number: 80         # 端口号
4.3.4 基于用户认证

通过 Ingress 的认证功能,可以为服务添加用户认证。

# 创建认证文件
htpasswd -cm auth admin
apiVersion: networking.k8s.io/v1     # 指定 Kubernetes API 版本
kind: Ingress                        # 资源类型为 Ingress
metadata:                            # 元数据部分annotations:                       # 定义注解nginx.ingress.kubernetes.io/auth-type: basic  # 认证类型为基本认证nginx.ingress.kubernetes.io/auth-secret: auth-web  # 引用的认证 Secret 名称nginx.ingress.kubernetes.io/auth-realm: "Please input username and password"  # 认证提示信息name: ingress4                     # Ingress 的名称
spec:                                # Ingress 的具体配置tls:                               # 定义 TLS 配置- hosts:                         # 定义支持的主机名- myapp-tls.admin.org        # 主机名secretName: web-tls-secret     # 引用的 TLS Secret 名称ingressClassName: nginx            # 指定 Ingress 类型为 nginxrules:                             # 定义规则- host: myapp-tls.admin.org      # 指定主机名http:                          # 定义 HTTP 规则paths:                       # 定义路径规则- path: /                  # 路径为 /pathType: Prefix         # 路径类型为前缀匹配backend:                 # 后端服务配置service:               # 指定后端服务name: myapp-v1       # 服务名称port:                # 服务端口number: 80         # 端口号
4.3.5 URL 重定向

通过 Ingress 的重定向功能,可以将请求重定向到指定的路径。

apiVersion: networking.k8s.io/v1     # 指定 Kubernetes API 版本
kind: Ingress                        # 资源类型为 Ingress
metadata:                            # 元数据部分annotations:                       # 定义注解nginx.ingress.kubernetes.io/rewrite-target: /$2  # 重定向目标路径nginx.ingress.kubernetes.io/use-regex: "true"    # 启用正则表达式name: ingress5                     # Ingress 的名称
spec:                                # Ingress 的具体配置ingressClassName: nginx            # 指定 Ingress 类型为 nginxrules:                             # 定义规则- host: myapp-tls.admin.org      # 指定主机名http:                          # 定义 HTTP 规则paths:                       # 定义路径规则- path: /lee(/|$)(.*)      # 匹配路径 /lee/ 或 /leepathType: ImplementationSpecific  # 路径类型为特定实现backend:                 # 后端服务配置service:               # 指定后端服务name: myapp-v1       # 服务名称port:                # 服务端口number: 80         # 端口号

五、Canary 金丝雀发布

5.1 什么是金丝雀发布

金丝雀发布是一种软件发布策略,通过将新版本的服务逐步暴露给部分用户,以降低新版本可能带来的风险。如果新版本运行正常,则逐步扩大范围,最终完成全面更新。

5.2 金丝雀发布方式

5.2.1 基于 Header 的灰度发布

通过 HTTP Header 来控制流量的分发,适用于需要逐步验证新版本的场景。

apiVersion: networking.k8s.io/v1     # 指定 Kubernetes API 版本
kind: Ingress                        # 资源类型为 Ingress
metadata:                            # 元数据部分annotations:                       # 定义注解nginx.ingress.kubernetes.io/canary: "true"  # 启用金丝雀发布nginx.ingress.kubernetes.io/canary-by-header: "version"  # 指定 Header 名称nginx.ingress.kubernetes.io/canary-by-header-value: "2"  # 指定 Header 值name: myapp-v2-ingress              # Ingress 的名称
spec:                                # Ingress 的具体配置ingressClassName: nginx            # 指定 Ingress 类型为 nginxrules:                             # 定义规则- host: myapp.admin.org          # 指定主机名http:                          # 定义 HTTP 规则paths:                       # 定义路径规则- path: /                  # 路径为 /pathType: Prefix         # 路径类型为前缀匹配backend:                 # 后端服务配置service:               # 指定后端服务name: myapp-v2       # 服务名称port:                # 服务端口number: 80         # 端口号
5.2.2 基于权重的灰度发布

通过配置权重来控制流量的分发,适用于需要逐步调整流量比例的场景。

apiVersion: networking.k8s.io/v1     # 指定 Kubernetes API 版本
kind: Ingress                        # 资源类型为 Ingress
metadata:                            # 元数据部分annotations:                       # 定义注解nginx.ingress.kubernetes.io/canary: "true"  # 启用金丝雀发布nginx.ingress.kubernetes.io/canary-weight: "10"  # 新版本权重nginx.ingress.kubernetes.io/canary-weight-total: "100"  # 总权重name: myapp-v2-ingress              # Ingress 的名称
spec:                                # Ingress 的具体配置ingressClassName: nginx            # 指定 Ingress 类型为 nginxrules:                             # 定义规则- host: myapp.admin.org          # 指定主机名http:                          # 定义 HTTP 规则paths:                       # 定义路径规则- path: /                  # 路径为 /pathType: Prefix         # 路径类型为前缀匹配backend:                 # 后端服务配置service:               # 指定后端服务name: myapp-v2       # 服务名称port:                # 服务端口number: 80         # 端口号

http://www.ppmy.cn/news/1577773.html

相关文章

小程序 wxml 语法 —— 37 setData() - 修改对象类型数据

这一节主要演示如何新增、修改和删除对象数据中单个/多个属性,我们直接使用微信开发者工具进行演示; 新增单个/多个属性 在 pages/cate/cate.js 中添加数据声明和对应的新增属性方法,如下: Page({// 在小程序页面中所需要使用的…

Vue3-vs-Vue2

Vue3 性能提升 与 Vue2.x 相比, mount 50% 提升, 内存占用小 120% Vue3 框架体积减少 核心代码 Composition API: 13.5kb, 最小 11.75kb所有 Runtime: 22.5kb (Vue2 是 32kb) Vue3 新特性 TS 重写 Diff 算法, 使用 Proxy 性能更优, 框架体积更小新的 Compiler, 通过注释标…

每日一题———面试

一、http和https的区别是什么? 区别主要有以下四点: 1.HTTP是超文本传输协议,信息是文明传输,存在安全风险的问题。HTTPS则解决HTTP不安全的缺陷,在TCP和HTTP网络层之间加入SSL/TLS安全协议,使得报文能够加…

【数据仓库与数据挖掘基础】决策分析

一、数据仓库中的决策分析 1. 定义 决策分析在数据仓库中是指利用存储在数据仓库中的数据,通过分析和报告生成支持决策的信息。数据仓库整合了来自不同来源的数据,经过清洗和转换,提供了一个统一的视图,帮助管理层和决策者做出明…

vLLM + Open-WebUI 本地私有化部署 DeepSeek-R1-Distill-Qwen-32B 方案

一、vLLM 部署 DeepSeek-R1-Distill-Qwen-32B DeepSeek-R1-Distill 系列模型是 DeepSeek-R1 的蒸馏模型,官方提供了从 1.5B - 70B 不同尺寸大小的模型。特别适合在计算资源有限的环境中部署。 DeepSeek-R1 各个版本的蒸馏模型评估结果如下: 其中 DeepS…

使用浏览器插件GitZip一次性下载多个Github文件

在Edge插件商店中下载GitZip 在github中选择想要下载的文件 然后你会发现右下角一个黑箭头→,点击黑箭头,会出现提示: 你就按照它的提示来,点击GitZip的图标,接着会出现: 点击Private,然后按照…

Android 仿 DeepSeek 思考效果:逐字显示 AI 生成内容,支持加粗、颜色,复制内容

最近特别火的非AI莫属了,对我们高级搬运工太友好了,不管是网页端还是APP端,输入你要问的问题,都会逐字给你显示出来,有的还会加粗,这种效果看着不错,今天就带大家一起来实现。有啥更好的建议请在…

Array and string offset access syntax with curly braces is deprecated

警告信息 “Array and string offset access syntax with curly braces is deprecated” 是 PHP 中的一个弃用警告(Deprecation Notice),表明在 PHP 中使用花括号 {} 来访问数组或字符串的偏移量已经被标记为过时。 背景 在 PHP 的早期版本…