Kubernetes(K8S)是一个开源的容器编排平台,它管理了大量的容器组成的集群,通过Kubernetes API Server来操作集群的资源。有时候,我们需要限制Kubernetes API Server的访问,以保护集群的安全性。下面我将一步步教你如何实现"k8s apiserver不能访问"这个需求。

### 流程步骤

| 步骤 | 操作 |
| :--: | :----------------------------------------------------------: |
| 1 | 创建NetworkPolicy |
| 2 | 关闭apiserver |
| 3 | 测试apiserver是否关闭,应该无法通过kubectl访问API Server |

### 操作步骤及代码示例

#### 步骤一:创建NetworkPolicy

NetworkPolicy是Kubernetes中一种用来控制Pod间和Pod与公共网络之间流量的策略对象。我们可以通过创建NetworkPolicy来实现限制apiserver的访问。

```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-apiserver
spec:
podSelector:
matchLabels: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector: {}
- podSelector:
matchLabels:
k8s-app: kube-apiserver
```

上面的配置中,我们创建了一个名为deny-apiserver的NetworkPolicy,该策略的作用是拒绝从kube-apiserver这个Pod进入当前Pod的流量。

#### 步骤二:关闭apiserver

在Kubernetes集群中,apiserver是用来暴露REST API给外界的组件。通过关闭apiserver,我们可以禁止外部客户端通过该API访问Kubernetes资源。

```shell
kubectl scale deployment kube-apiserver --replicas=0 -n kube-system
```

通过上面的命令,我们将kube-apiserver这个Deployment的Pod数量缩减为0,从而关闭了apiserver。

#### 步骤三:测试apiserver是否关闭

关闭了apiserver后,我们可以通过kubectl尝试访问API Server,来验证是否成功关闭apiserver。

```shell
kubectl get pods
```

如果apiserver已经关闭,执行上述命令将会返回类似如下错误信息:

```
The connection to the server localhost:8080 was refused - did you specify the right host or port?
```

### 总结

通过以上的操作,我们成功实现了"k8s apiserver不能访问"的需求。首先创建了一个NetworkPolicy来限制kube-apiserver这个Pod的访问,然后关闭了apiserver,最后验证了apiserver关闭后无法访问的效果。这些操作可以有效地保护Kubernetes集群的安全性,防止未经授权的访问。希望以上内容对你有所帮助,如果有任何疑问,欢迎继续交流!