上传文件至 'kubernetes-MD'
This commit is contained in:
parent
878c0c06bb
commit
13ebf2dbc7
@ -67,6 +67,16 @@ spec:
|
||||
|
||||
#### 1.服务类型
|
||||
|
||||
ClusterIP
|
||||
|
||||
NodePort
|
||||
|
||||
LoadBalancer
|
||||
|
||||
ExternalName
|
||||
|
||||
#### 2.服务类型
|
||||
|
||||
对一些应用的某些部分(如前端),可能希望将其暴露给 Kubernetes 集群外部 的 IP 地址
|
||||
|
||||
Kubernetes `ServiceTypes` 允许指定你所需要的 Service 类型,默认是 `ClusterIP`
|
||||
@ -75,11 +85,11 @@ spec:
|
||||
|
||||
`ClusterIP`:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 `ServiceType`
|
||||
|
||||

|
||||

|
||||
|
||||
`NodePort`:通过每个节点上的 IP 和静态端口(`NodePort`)暴露服务。 `NodePort` 服务会路由到自动创建的 `ClusterIP` 服务。 通过请求 `<节点 IP>:<节点端口>`,你可以从集群的外部访问一个 `NodePort` 服务
|
||||
|
||||

|
||||

|
||||
|
||||
[`LoadBalancer`](https://v1-23.docs.kubernetes.io/zh/docs/concepts/services-networking/service/#loadbalancer):使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 `NodePort` 服务和 `ClusterIP` 服务上
|
||||
|
||||
@ -89,7 +99,7 @@ spec:
|
||||
[root@master nginx]# kubectl expose deployment nginx-deployment --port=80 --type=LoadBalancer
|
||||
```
|
||||
|
||||
#### 2.NodePort
|
||||
#### 3.NodePort
|
||||
|
||||
如果你将 `type` 字段设置为 `NodePort`,则 Kubernetes 控制平面将在 `--service-node-port-range` 标志指定的范围内分配端口(默认值:30000-32767)
|
||||
|
||||
@ -113,7 +123,7 @@ spec:
|
||||
nodePort: 30007
|
||||
```
|
||||
|
||||
#### 3.案例
|
||||
#### 4.案例
|
||||
|
||||
```shell
|
||||
apiVersion: apps/v1
|
||||
@ -154,9 +164,70 @@ spec:
|
||||
app: nginx
|
||||
```
|
||||
|
||||
#### 5.了解
|
||||
|
||||
`ExternalName` 是 `Kubernetes` 服务(`Service`)类型中的一种,它允许你将服务映射到一个外部的 DNS 名称,而不是选择器(`selector`)所定义的一组 Pod;这意味着当你在集群内部通过服务名称访问时,实际上是在访问外部指定的资源。
|
||||
|
||||
使用场景
|
||||
|
||||
`ExternalName` 类型的服务非常适合以下几种情况:
|
||||
|
||||
当你需要将内部服务指向外部系统或第三方 API
|
||||
|
||||
当你希望服务名称和外部资源名称之间保持解耦,即使外部资源发生变化,只需要更新服务配置
|
||||
|
||||
对于微服务架构中的跨团队合作,不同团队管理自己的服务,通过 `ExternalName` 来互相调用对方的服务
|
||||
|
||||
配置方式
|
||||
|
||||
创建一个 `ExternalName` 类型的服务非常简单,只需在服务定义文件中设置 `spec.type` 为 `ExternalName` 并提供 `spec.externalName` 字段来指明你要映射的外部域名
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: external-service
|
||||
namespace: default
|
||||
spec:
|
||||
type: ExternalName
|
||||
externalName: example.com
|
||||
```
|
||||
|
||||
案例
|
||||
|
||||
假设你正在管理一个电子商务平台,该平台由多个微服务组成,并且有一个专门处理支付的外部服务,这个支付服务是由第三方提供商托管的,其域名是 `payments.externalprovider.com`
|
||||
|
||||
背景
|
||||
|
||||
你的电商平台需要调用支付网关来完成交易过程。支付网关是一个由外部供应商提供的服务,不在你的 `Kubernetes`集群内运行,但是你的应用程序代码需要能够像调用内部服务一样方便地访问它
|
||||
|
||||
使用 `ExternalName` 服务
|
||||
|
||||
为了简化与外部支付服务的交互,你可以创建一个名为 payment-gateway 的 ExternalName 类型的服务,这样所有的内部服务就可以通过 payment-gateway.default.svc.cluster.local(假设在默认命名空间中)来访问外部的支付服务,而不需要直接硬编码外部域名
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: payment-gateway
|
||||
namespace: default
|
||||
spec:
|
||||
type: ExternalName
|
||||
externalName: payments.externalprovider.com
|
||||
```
|
||||
|
||||
应用程序代码调整
|
||||
|
||||
在你的应用程序代码中,你只需要配置服务名称为 payment-gateway 或者根据集群内的 DNS 解析规则使用完整的 FQDN (Fully Qualified Domain Name) payment-gateway.default.svc.cluster.local 来发起请求。比如,在 Java Spring Boot 应用中,你可以设置 REST 客户端的基础 URL:
|
||||
|
||||
```java
|
||||
@Bean
|
||||
public RestTemplate restTemplate(RestTemplateBuilder builder) {
|
||||
// 注意这里使用的是服务名称,而不是直接使用外部域名
|
||||
return builder.rootUri("http://payment-gateway").build();
|
||||
}
|
||||
```
|
||||
|
||||
总结
|
||||
|
||||
通过这种方式,`ExternalName` 服务帮助你在`Kubernetes` 环境中优雅地整合了外部依赖,同时保持了良好的抽象层次和灵活性
|
||||
|
Loading…
Reference in New Issue
Block a user