### 流程步骤
| 步骤 | 操作 |
| :--: | :----------------------------------------------------------: |
| 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集群的安全性,防止未经授权的访问。希望以上内容对你有所帮助,如果有任何疑问,欢迎继续交流!