K8S(Kubernetes)是一个开源的容器编排平台,它可以帮助我们有效地管理和部署容器化的应用程序。在K8S集群中,我们可能需要实现集群内和集群外的访问方案。

#### 概览
在K8S中,集群内访问是指在集群中的多个pod之间进行通信,而集群外访问是指在集群外的机器与K8S集群中的pod进行通信。为了实现这两种访问方案,我们需要使用Service、Ingress和NodePort这些K8S的资源来进行配置。

下面是一些需要使用的K8S资源及其功能的简要说明:

- Service: 用于将一组pod暴露给集群内的其他pod进行访问。

- Ingress: 用于在集群外部暴露一个HTTP或HTTPS服务,并通过HTTP的路径和主机名将流量路由到指定的Service。

- NodePort: 用于将一个固定的端口映射到一个Service中,从而允许通过集群的Node IP和映射的端口从集群外访问Service。

接下来,我将具体介绍实现K8S集群内访问和集群外访问方案的步骤。

#### K8S集群内访问方案
在K8S集群内部,我们可以使用Service资源来实现集群内的访问。

1. 创建一个Deployment来运行应用程序:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app-container
image: my-app-image
ports:
- containerPort: 8080
```

在这个Deployment中,我们指定了应用程序的镜像、副本数量和应用的标签。

2. 创建一个Service来暴露这个Deployment:

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

在这个Service中,我们使用标签选择器来指定要暴露的Deployment,并设置端口映射。

现在,其他在同一个K8S集群中的pod就可以通过Service的名称 `app-service` 来访问这个Deployment。

#### K8S集群外访问方案
在K8S集群外部,我们可以使用Ingress或NodePort资源来实现集群外的访问。

1. 创建一个Ingress来暴露HTTP/HTTPS服务:

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 8080
```

在这个Ingress中,我们设置了主机和路径,将流量路由到了之前创建的 `app-service`。

2. 创建一个NodePort来暴露一个固定端口:

```yaml
apiVersion: v1
kind: Service
metadata:
name: app-nodeport
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 8080
targetPort: 8080
nodePort: 30080
```

在这个Service中,我们指定了 `type` 为 `NodePort`,并设置了 `nodePort`。

现在,我们可以通过集群的Node IP和映射的端口(例如 `http://:30080`)来访问这个Service。

#### 总结
在K8S中,我们可以使用Service资源实现集群内访问方案,并使用Ingress或NodePort资源实现集群外访问方案。通过合理配置这些K8S资源,我们可以灵活地管理和部署容器化的应用程序,并实现对外提供服务的需求。

希望以上介绍对于你理解K8S集群内外访问方案有所帮助!