# K8S部署服务需要对外开放哪些端口

## 概述
在使用Kubernetes(简称K8S)部署服务时,需要将服务暴露给外部用户访问。为了实现这一目的,我们需要对服务进行端口暴露。

## 流程
下面是实现K8S部署服务对外开放端口的整体流程:

| 步骤 | 操作 |
| ------ | ------ |
| 1 | 创建Deployment部署服务 |
| 2 | 创建Service暴露端口 |

## 操作步骤

### 步骤1:创建Deployment部署服务

Deployment是K8S中的一种资源对象,用于定义Pod副本的创建和管理。下面是创建Deployment的代码示例:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app-image:latest
ports:
- containerPort: 80
```

- **apiVersion**: 指定K8S API版本
- **kind**: 定义资源对象类型为Deployment
- **metadata**: 指定Deployment的元数据,如名称
- **spec**: 定义Deployment的规格,包括副本数量、选择器和Pod模板
- **selector**: 选择部署的Pod
- **template**: 定义Pod的模板
- **containers**: 定义Pod中的容器

### 步骤2:创建Service暴露端口

Service是K8S中的一种资源对象,用于定义一组Pod的访问策略。下面是创建Service的代码示例:

```yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-svc
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
```

- **apiVersion**: 指定K8S API版本
- **kind**: 定义资源对象类型为Service
- **metadata**: 指定Service的元数据,如名称
- **spec**: 定义Service的规格,包括选择器和端口信息
- **selector**: 选择对应的Pod
- **ports**: 定义Service暴露的端口信息
- **protocol**: 指定通信协议
- **port**: 暴露给外部访问的端口号
- **targetPort**: Pod内部容器的端口号
- **type**: 指定Service类型为LoadBalancer,将获取外部负载均衡器的IP地址

通过以上步骤,我们成功地将K8S部署的服务对外开放了端口。现在,可以使用LoadBalancer的IP地址来访问该服务。

总结起来,K8S部署服务对外开放端口的关键在于创建Deployment和Service两种资源对象,确保Service使用的端口和Pod容器内部的端口一致,并选择合适的Service类型。希望以上内容能帮助你更好地理解和实践K8S服务部署中端口开放的操作。