K8S(Kubernetes)是一个容器编排平台,用于自动化地部署、扩展和管理应用程序容器。在K8S中,容器是基本的执行单位,每个容器都有自己的IP地址。如果我们想要查找容器的真实IP地址,可以通过以下步骤来实现。

### 步骤概述
下表展示了查找Kubernetes容器真实IP的步骤概述:

| 步骤 | 描述 |
|------|-----------------------------------|
| 1 | 获取容器所在的Pod名称 |
| 2 | 获取容器所在的Node名称 |
| 3 | 通过Node名称获取Node的详细信息 |
| 4 | 从Node信息中获取容器的真实IP地址 |

下面,我将逐步介绍每个步骤所需的操作和示例代码。

### 步骤一:获取容器所在的Pod名称
在Kubernetes中,Pod是一组相互关联的容器集合。通过以下代码,我们可以获取容器所在的Pod名称:

```python
import os

# 获取容器所在的Pod名称
pod_name = os.getenv('HOSTNAME')
print("Pod名称: ", pod_name)
```

上述代码中,我们使用了Python的os库来获取容器所在的Pod名称。通过获取环境变量`HOSTNAME`,我们可以获取到正在运行的容器所在的Pod名称。

### 步骤二:获取容器所在的Node名称
在Kubernetes中,Node是集群中的一个工作节点,用于运行容器。通过以下代码,我们可以获取容器所在的Node名称:

```python
import requests

# 获取Kubernetes中的API服务器地址
api_server = os.getenv('KUBERNETES_SERVICE_HOST') + ':' + os.getenv('KUBERNETES_SERVICE_PORT')
print("API服务器地址: ", api_server)

# 获取Pod的元数据URL
pod_metadata_url = f"http://{api_server}/api/v1/namespaces/default/pods/{pod_name}"
print("Pod元数据URL: ", pod_metadata_url)

# 发起GET请求,获取Pod的元数据
response = requests.get(url=pod_metadata_url)
pod_metadata = response.json()

# 获取容器所在的Node名称
node_name = pod_metadata['spec']['nodeName']
print("Node名称: ", node_name)
```

上述代码中,我们使用了Python的requests库来获取容器所在的Node名称。首先,我们需要获取Kubernetes API服务器的地址,通过获取环境变量`KUBERNETES_SERVICE_HOST`和`KUBERNETES_SERVICE_PORT`来构建API服务器地址。然后,我们使用构建的API服务器地址和容器所在的Pod名称构建Pod的元数据URL,发起GET请求获取Pod的元数据。从Pod的元数据中,我们可以获取到容器所在的Node名称。

### 步骤三:通过Node名称获取Node的详细信息
在Kubernetes中,可以使用kubectl命令来获取Node的详细信息。通过以下代码,我们可以使用kubectl命令获取Node的详细信息:

```python
import subprocess

# 通过kubectl命令获取Node的详细信息
node_info_command = f"kubectl describe node {node_name}"
node_info_process = subprocess.run(node_info_command, shell=True, capture_output=True, text=True)
node_info_output = node_info_process.stdout

print("Node详细信息:\n", node_info_output)
```

上述代码中,我们使用了Python的subprocess库来执行kubectl命令,并获取其输出。通过执行`kubectl describe node`命令并指定Node名称,我们可以获取到Node的详细信息。

### 步骤四:从Node信息中获取容器的真实IP地址
在Node的详细信息中,我们可以找到容器的真实IP地址。通过以下代码,我们可以从Node信息中提取容器的真实IP地址:

```python
import re

# 从Node信息中提取容器的真实IP地址
ip_pattern = r"Addresses:\s*\[\{type: ExternalIP, address: (.+?)\}\]"
ip_matches = re.findall(ip_pattern, node_info_output)

if len(ip_matches) > 0:
container_ip = ip_matches[0]
print("容器真实IP地址: ", container_ip)
else:
print("未找到容器真实IP地址")
```

上述代码中,我们使用了Python的re库来提取容器的真实IP地址。通过正则表达式模式匹配,在Node信息中找到`Addresses: [{type: ExternalIP, address: xxx.xxx.xxx.xxx}]`这样的行,并提取其中的IP地址。如果找到了匹配的行,则说明成功找到了容器的真实IP地址。

至此,我们完成了查找Kubernetes容器真实IP的整个过程。通过以上代码,我们可以获取到正在运行的容器的真实IP地址。希望这篇文章对刚入门的小白有所帮助!