在Kubernetes中,有时候我们希望设置域名可以访问到服务,但是IP地址却无法直接访问到服务,这种需求通常用于隐藏服务的真实IP地址,增加安全性。下面我将通过步骤和代码示例来教你如何实现“域名不能访问IP可以访问”。

### 实现步骤

| 步骤 | 操作 |
| ----- | ------ |
| 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直接访问服务。这样就可以保证只有通过域名才能访问到服务,增加了安全性。

希望这篇文章能够帮助你理解并实现这一需求,如果有任何疑问或者问题,请随时向我提问。祝你学习顺利!