更新 'kubernetes-MD/kubernetes资源对象Service.md'

This commit is contained in:
diandian 2023-03-29 17:08:09 +08:00
parent 983807c97c
commit 3b76a19580
1 changed files with 162 additions and 162 deletions

View File

@ -1,162 +1,162 @@
<h1><center>Kubernetes资源对象service</center></h1> <h1><center>Kubernetes资源对象service</center></h1>
著作:行癫 <盗版必究> 著作:行癫 <盗版必究>
------ ------
## 一Service ## 一Service
将运行在一组 [Pods](https://v1-23.docs.kubernetes.io/docs/concepts/workloads/pods/pod-overview/) 上的应用程序公开为网络服务的抽象方法 将运行在一组 [Pods](https://v1-23.docs.kubernetes.io/docs/concepts/workloads/pods/pod-overview/) 上的应用程序公开为网络服务的抽象方法
使用 Kubernetes你无需修改应用程序即可使用不熟悉的服务发现机制Kubernetes 为 Pods 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡 使用 Kubernetes你无需修改应用程序即可使用不熟悉的服务发现机制Kubernetes 为 Pods 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡
Kubernetes Service 定义了这样一种抽象:逻辑上的一组 Pod一种可以访问它们的策略 —— 通常称为微服务 Kubernetes Service 定义了这样一种抽象:逻辑上的一组 Pod一种可以访问它们的策略 —— 通常称为微服务
举个例子,考虑一个图片处理后端,它运行了 3 个副本。这些副本是可互换的 —— 前端不需要关心它们调用了哪个后端副本。 然而组成这一组后端程序的 Pod 实际上可能会发生变化, 前端客户端不应该也没必要知道,而且也不需要跟踪这一组后端的状态 举个例子,考虑一个图片处理后端,它运行了 3 个副本。这些副本是可互换的 —— 前端不需要关心它们调用了哪个后端副本。 然而组成这一组后端程序的 Pod 实际上可能会发生变化, 前端客户端不应该也没必要知道,而且也不需要跟踪这一组后端的状态
#### 1.定义 Service #### 1.定义 Service
例如,假定有一组 Pod它们对外暴露了 9376 端口,同时还被打上 `app=MyApp` 标签: 例如,假定有一组 Pod它们对外暴露了 9376 端口,同时还被打上 `app=MyApp` 标签:
```shell ```shell
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: my-service name: my-service
spec: spec:
selector: selector:
app: MyApp app: MyApp
ports: ports:
- protocol: TCP - protocol: TCP
port: 80 port: 80
targetPort: 9376 targetPort: 9376
``` ```
上述配置创建一个名称为 "my-service" 的 Service 对象,它会将请求代理到使用 TCP 端口 9376并且具有标签 `"app=MyApp"` 的 Pod 上 上述配置创建一个名称为 "my-service" 的 Service 对象,它会将请求代理到使用 TCP 端口 9376并且具有标签 `"app=MyApp"` 的 Pod 上
Kubernetes 为该服务分配一个 IP 地址(有时称为 "集群IP"),该 IP 地址由服务代理使用 Kubernetes 为该服务分配一个 IP 地址(有时称为 "集群IP"),该 IP 地址由服务代理使用
注意: 注意:
Service 能够将一个接收 `port` 映射到任意的 `targetPort`。 默认情况下,`targetPort` 将被设置为与 `port` 字段相同的值 Service 能够将一个接收 `port` 映射到任意的 `targetPort`。 默认情况下,`targetPort` 将被设置为与 `port` 字段相同的值
#### 2.多端口 Service #### 2.多端口 Service
对于某些服务,你需要公开多个端口。 Kubernetes 允许你在 Service 对象上配置多个端口定义 对于某些服务,你需要公开多个端口。 Kubernetes 允许你在 Service 对象上配置多个端口定义
```shell ```shell
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: my-service name: my-service
spec: spec:
selector: selector:
app: MyApp app: MyApp
ports: ports:
- name: http - name: http
protocol: TCP protocol: TCP
port: 80 port: 80
targetPort: 9376 targetPort: 9376
- name: https - name: https
protocol: TCP protocol: TCP
port: 443 port: 443
targetPort: 9377 targetPort: 9377
``` ```
## 二:发布服务 ## 二:发布服务
#### 1.服务类型 #### 1.服务类型
对一些应用的某些部分(如前端),可能希望将其暴露给 Kubernetes 集群外部 的 IP 地址 对一些应用的某些部分(如前端),可能希望将其暴露给 Kubernetes 集群外部 的 IP 地址
Kubernetes `ServiceTypes` 允许指定你所需要的 Service 类型,默认是 `ClusterIP` Kubernetes `ServiceTypes` 允许指定你所需要的 Service 类型,默认是 `ClusterIP`
`Type` 的取值以及行为如下: `Type` 的取值以及行为如下:
`ClusterIP`:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 `ServiceType` `ClusterIP`:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 `ServiceType`
![img](kubernetes%E4%B9%8Bservice.assets/6R1zaHS1QM_i4c4W1k2ttg.png) ![img](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/6R1zaHS1QM_i4c4W1k2ttg.png)
`NodePort`:通过每个节点上的 IP 和静态端口(`NodePort`)暴露服务。 `NodePort` 服务会路由到自动创建的 `ClusterIP` 服务。 通过请求 `<节点 IP>:<节点端口>`,你可以从集群的外部访问一个 `NodePort` 服务 `NodePort`:通过每个节点上的 IP 和静态端口(`NodePort`)暴露服务。 `NodePort` 服务会路由到自动创建的 `ClusterIP` 服务。 通过请求 `<节点 IP>:<节点端口>`,你可以从集群的外部访问一个 `NodePort` 服务
![img](kubernetes%E4%B9%8Bservice.assets/-E5GOvNElgId7mwjBs9elw.png) ![img](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/-E5GOvNElgId7mwjBs9elw.png)
[`LoadBalancer`](https://v1-23.docs.kubernetes.io/zh/docs/concepts/services-networking/service/#loadbalancer):使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 `NodePort` 服务和 `ClusterIP` 服务上 [`LoadBalancer`](https://v1-23.docs.kubernetes.io/zh/docs/concepts/services-networking/service/#loadbalancer):使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 `NodePort` 服务和 `ClusterIP` 服务上
你也可以使用Ingress来暴露自己的服务。 Ingress 不是一种服务类型,但它充当集群的入口点。 它可以将路由规则整合到一个资源中因为它可以在同一IP地址下公开多个服务 你也可以使用Ingress来暴露自己的服务。 Ingress 不是一种服务类型,但它充当集群的入口点。 它可以将路由规则整合到一个资源中因为它可以在同一IP地址下公开多个服务
```shell ```shell
[root@master nginx]# kubectl expose deployment nginx-deployment --port=80 --type=LoadBalancer [root@master nginx]# kubectl expose deployment nginx-deployment --port=80 --type=LoadBalancer
``` ```
#### 2.NodePort #### 2.NodePort
如果你将 `type` 字段设置为 `NodePort`,则 Kubernetes 控制平面将在 `--service-node-port-range` 标志指定的范围内分配端口默认值30000-32767 如果你将 `type` 字段设置为 `NodePort`,则 Kubernetes 控制平面将在 `--service-node-port-range` 标志指定的范围内分配端口默认值30000-32767
例如: 例如:
```shell ```shell
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: my-service name: my-service
spec: spec:
type: NodePort type: NodePort
selector: selector:
app: MyApp app: MyApp
ports: ports:
# 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。 # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
- port: 80 - port: 80
targetPort: 80 targetPort: 80
# 可选字段 # 可选字段
# 默认情况下为了方便起见Kubernetes 控制平面会从某个范围内分配一个端口号默认30000-32767 # 默认情况下为了方便起见Kubernetes 控制平面会从某个范围内分配一个端口号默认30000-32767
nodePort: 30007 nodePort: 30007
``` ```
#### 3.案例 #### 3.案例
```shell ```shell
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: nginx-deployment name: nginx-deployment
spec: spec:
replicas: 3 replicas: 3
selector: selector:
matchLabels: matchLabels:
app: nginx app: nginx
template: template:
metadata: metadata:
labels: labels:
app: nginx app: nginx
spec: spec:
containers: containers:
- name: nginx-server - name: nginx-server
image: nginx:1.16 image: nginx:1.16
ports: ports:
- containerPort: 80 - containerPort: 80
``` ```
```shell ```shell
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: nginx-services name: nginx-services
labels: labels:
app: nginx app: nginx
spec: spec:
type: NodePort type: NodePort
ports: ports:
- port: 88 - port: 88
targetPort: 80 targetPort: 80
nodePort: 30010 nodePort: 30010
selector: selector:
app: nginx app: nginx
``` ```