在Kubernetes(K8S)中,有两种主要的访问方式,即ClusterIP和NodePort。这两种方式分别用于不同的场景,通过本文,我将带领你了解它们之间的区别和使用方法。

### 步骤概览
首先,让我们看一下在K8S中实现ClusterIP和NodePort两种访问方式的流程:

| 步骤 | 描述 |
|------|-------------------------------------|
| 1 | 创建Deployment和Service |
| 2 | 使用ClusterIP方式访问集群内的服务 |
| 3 | 使用NodePort方式对外暴露服务 |

### 步骤详解
#### 1. 创建Deployment和Service
首先,我们需要创建一个Deployment和一个Service来部署和暴露应用程序。以下是一个简单的Deployment示例:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myapp:latest
```

接下来,我们创建一个Service来将Deployment中的应用程序暴露出来:

```yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
```

#### 2. 使用ClusterIP方式访问集群内的服务
ClusterIP是Kubernetes默认的服务发现机制,只能在集群内部访问。通过以下命令创建一个ClusterIP类型的Service:

```bash
kubectl apply -f myapp-service.yaml
```

在应用程序中,可以通过Service名称进行访问,例如:

```bash
curl http://myapp-service:80
```

#### 3. 使用NodePort方式对外暴露服务
NodePort方式允许外部通过Node的IP地址和指定的端口访问集群中的服务。仍然沿用上面的Deployment,以下是将Service类型修改为NodePort的示例:

```yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
```

然后通过以下命令将Service应用到集群中:

```bash
kubectl apply -f myapp-service-nodeport.yaml
```

NodePort服务将会暴露在Node的IP地址和一个高于30000的端口上,可以使用以下命令查看NodePort的端口号:

```bash
kubectl get svc myapp-service
```

现在,你可以通过Node的IP地址和NodePort端口访问应用程序:

```bash
curl http://node_ip:nodeport
```

通过以上步骤,你已经了解了K8S中ClusterIP和NodePort两种访问方式的区别和实现方法。希望这篇科普文章对你有所帮助!如果有任何疑问,欢迎随时提出。