在Kubernetes(K8S)集群中,有时候我们希望某些服务不被外部访问,只能在集群内部进行通信,这种情况下我们就需要将这些服务进行限制,使其在外部无法访问。下面我将向你介绍如何实现"k8s外部无法访问"的操作。

### 操作步骤
下面是实现"k8s外部无法访问"的操作步骤,我们将使用 NetworkPolicy 资源来限制服务的访问。

| 步骤 | 操作 |
|------|--------------------------|
| 1 | 创建Namespace |
| 2 | 部署一个应用程序 |
| 3 | 创建一个 NetworkPolicy |
| 4 | 测试服务是否无法被外部访问|

### 步骤详解
#### 1. 创建Namespace
首先我们需要创建一个Namespace,用来存放我们的应用程序以及 NetworkPolicy。

```yaml
# namespace.yml
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
```

使用以下命令创建Namespace:
```bash
kubectl apply -f namespace.yml
```

#### 2. 部署一个应用程序
接下来我们需要部署一个应用程序,在这个示例中我们将部署一个简单的 Nginx 服务。

```yaml
# nginx-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: my-namespace
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
```

使用以下命令部署Nginx服务:
```bash
kubectl apply -f nginx-deployment.yml
```

#### 3. 创建一个 NetworkPolicy
现在我们将创建一个 NetworkPolicy,来限制外部对Nginx服务的访问。

```yaml
# network-policy.yml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: nginx-network-policy
namespace: my-namespace
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
```

这个 NetworkPolicy 的规则是只有同一个 Namespace 中的 Pod 才能访问该服务。

使用以下命令创建 NetworkPolicy:
```bash
kubectl apply -f network-policy.yml
```

#### 4. 测试服务是否无法被外部访问
最后,我们可以测试一下Nginx服务是否无法被外部访问。

首先,我们可以尝试使用 Kubernetes 集群内部的 Pod 来访问服务:
```bash
kubectl run --namespace=my-namespace -it --rm curl --image=curlimages/curl -- sh
```

然后在 curl Pod 中使用以下命令进行测试:
```bash
curl nginx-service.my-namespace.svc.cluster.local
```
这里的 nginx-service 是Nginx服务的 Service 名称。如果能够访问到Nginx服务,则表示 NetworkPolicy 配置不正确。

接着,我们可以尝试在Kubernetes集群外部的机器上访问Nginx服务的ClusterIP:
```bash
kubectl get svc -n my-namespace
```
然后使用外部机器上的 curl 命令尝试访问Nginx服务的 ClusterIP,如果无法访问,则表示 NetworkPolicy 配置成功,服务无法被外部访问。

通过以上操作,我们成功地实现了"k8s外部无法访问"的目标。希朐以上内容对你有所帮助,如有疑问请及时联系我。