# 从集群外部访问 Pod

{% hint style="warning" %}
#### <mark style="color:orange;">**由于 Pod 是 Kubernetes 集群范围内的虚拟概念，所以集群外的客户端系统无法通过 Pod 的 IP 地址访问它**</mark><mark style="color:orange;">。</mark>
{% endhint %}

<mark style="color:blue;">**为了让外部客户端可以访问这些服务，可以将 Pod 的端口号映射到宿主机，以使客户端应用能够通过物理机访问容器应用。**</mark>

### 方式一：**容器级别的 hostPort**

<mark style="color:blue;">**设置容器级别的 hostPort**</mark>**，将容器应用的端口号映射到物理机上：**

<details>

<summary><mark style="color:purple;">pod-hostport.yaml</mark></summary>

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  containers:
  - name: webapp
    image: tomcat:9-jdk8-corretto
    ports:
    - containerPort: 8080
      hostPort: 8081
    resources:
      limits:
        cpu: 200m
        memory: 300Mi

```

</details>

### 方式二：**Pod 级别的 hostNetwork=true**

<mark style="color:blue;">**设置 Pod 级别的 hostNetwork=true**</mark>，**该 Pod 中所有容器的端口号都将被直接映射到物理机上：**

<details>

<summary><mark style="color:purple;">pod-hostnetwork.yaml</mark></summary>

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  hostNetwork: true
  containers:
  - name: webapp
    image: tomcat:9-jdk8-corretto
    ports:
    - containerPort: 8080
    resources:
      limits:
        cpu: 200m
        memory: 300Mi
```

</details>

在设置 hostNetwork=true 时需要注意：

* 在容器的 ports 定义部分如果**不指定 hostPort**，则默认 hostPort 等于 containerPort
* 如果指定了 **hostPort**，则 hostPort 必须等于 containerPort 的值
