随着Kubernetes(简称K8S)在近年来的快速发展,越来越多的应用程序被部署在K8S集群中。在这个过程中,有时候我们需要暴露一个端口供集群内的其他服务访问,但又不希望外部用户可以直接访问这个端口,这就需要设置外部无法访问K8S暴露的端口。接下来我将为你详细介绍如何实现这一功能。

整体步骤如下:

| 步骤 | 操作 |
|---|---|
| 1 | 创建一个Service对象来将集群内部的服务暴露出去 |
| 2 | 创建一个NetworkPolicy对象来限制外部访问 |
| 3 | 在NetworkPolicy中定义允许的源IP或label选择器 |
| 4 | 应用配置并验证生效 |

首先,我们需要为你准备一个示例应用程序,并将其部署到K8S集群中。假设我们有一个简单的NGINX web服务器作为示例应用。

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
```

接下来,我们需要创建一个NetworkPolicy对象来限制外部访问这个Service。

```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: nginx-policy
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 0.0.0.0/0 # CIDR表示允许的IP范围,0.0.0.0/0表示不允许任何外部IP访问
```

在上面的NetworkPolicy规则中,我们定义了一个只允许集群内部访问的规则,这意味着只有其他在同一个K8S集群中的Pod才能访问nginx-service的端口80。

最后,我们需要将这些配置应用到集群中,并验证设置生效。

```bash
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-policy.yaml
```

通过上述步骤,我们成功地实现了外部无法访问K8S暴露的端口,保障了集群内部服务的安全性。希望这篇文章对你理解和实践这一功能有所帮助。如果有任何问题或疑问,欢迎随时与我联系。祝学习进步!