在Kubernetes(K8S)集群中,端口映射是一种常见的网络配置,可以使外部服务通过特定端口访问集群内的服务。然而,有时候即使进行了端口映射,外网仍然无法访问服务,这可能是由于配置错误或网络问题导致的。在这篇文章中,我将向你介绍如何在K8S中配置端口映射并解决外网无法访问的问题。

首先,让我们来看一下整个流程及每一步需要做什么:

| 步骤 | 操作 |
|----------------------|----------------------------------------------------------------------|
| 创建Deployment | 部署一个Pod,并暴露服务到集群内部 |
| 创建Service | 创建一个Service类型的资源,将Deployment暴露到集群外部 |
| 配置端口映射 | 配置Service的端口映射规则,将外部流量转发到内部Pod的端口 |
| 检查网络策略 | 确保网络策略允许外部流量访问Service对应的Pod |
| 检查防火墙规则 | 确保防火墙规则允许从外部访问被映射的端口 |

接下来,让我们逐步实现上述步骤:

### 步骤一:创建Deployment

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

在上述示例中,我们定义了一个名为`my-app`的Deployment,包含一个Pod,Pod中运行一个名为`my-app`的容器,监听80端口。

### 步骤二:创建Service

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

上面的配置将Deployment暴露为一个名为`my-app-service`的Service,Service将Pod标签为`app: my-app`的Pod与外部流量连接起来,并通过NodePort类型暴露服务。

### 步骤三:配置端口映射

在步骤二中已经配置了端口映射,将外部端口80映射到内部Pod的端口80。

### 步骤四:检查网络策略

可以使用以下命令检查网络策略是否允许外部流量访问Service对应的Pod:

```bash
kubectl get networkpolicies
```

如果网络策略不允许外部流量访问,可以通过创建新的NetworkPolicy资源来设置相应的策略。

### 步骤五:检查防火墙规则

最后,需要确保防火墙规则允许从外部访问被映射的端口。如果有防火墙或网络安全组配置,需要相应调整以允许流量通过。

通过以上步骤,你可以成功配置端口映射并解决外网无法访问的问题。记住要逐步检查每一步的配置是否正确,以确保服务能够正常对外提供访问。希望这篇文章能够帮助你理解K8S中端口映射的实现方式和问题解决方法!