### 实现步骤
| 步骤 | 操作 |
| ----- | ------ |
| 1 | 创建一个Service,Service通过域名暴露服务,不使用ClusterIP |
| 2 | 创建一个Ingress,将域名与Service关联 |
| 3 | 使用HostNetwork方式在Pod中添加iptables规则,禁止IP直接访问服务 |
### 实现方法
#### Step 1: 创建一个Service
首先创建一个Service,通过域名暴露服务,不使用ClusterIP,示例代码如下:
```yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: my-app
```
#### Step 2: 创建一个Ingress
创建一个Ingress资源,将域名与Service关联,示例代码如下:
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: my-domain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
```
#### Step 3: 在Pod中添加iptables规则
在Pod中通过HostNetwork方式,添加iptables规则,禁止IP直接访问服务,示例代码如下:
```yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
hostNetwork: true
containers:
- name: my-container
image: nginx
securityContext:
capabilities:
add:
- NET_ADMIN
command:
- /bin/sh
- -c
- "iptables -A INPUT -p tcp --destination-port 80 -s 0.0.0.0/0 -j REJECT"
```
### 总结
通过以上步骤,我们成功实现了“域名不能访问IP可以访问”的需求。首先创建一个Service,通过域名暴露服务;然后创建一个Ingress将域名与Service关联;最后在Pod中添加iptables规则,禁止IP直接访问服务。这样就可以保证只有通过域名才能访问到服务,增加了安全性。
希望这篇文章能够帮助你理解并实现这一需求,如果有任何疑问或者问题,请随时向我提问。祝你学习顺利!