### 操作步骤
下面是实现"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外部无法访问"的目标。希朐以上内容对你有所帮助,如有疑问请及时联系我。