token的方式:

<?php
// API 访问令牌和 API Server 地址
$token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$apiServer = 'https://my-apiserver:6443';

// 要读取日志的 Pod 名称和容器名称
$namespace = 'default';
$podName = 'my-pod';
$containerName = 'my-container';

// 打开数据流
$apiPath = "/api/v1/namespaces/$namespace/pods/$podName/log?container=$containerName&follow=true";
$url = $apiServer . $apiPath;
$options = [
    'http' => [
        'header' => [
            'Authorization: Bearer ' . $token,
        ],
    ],
];
$context = stream_context_create($options);
$fp = fopen($url, 'r', false, $context);

// 设置超时时间
$timeout = 1;

// 持续读取数据流
while (true) {
    // 使用 stream_select() 函数检查数据流是否可读
    $read = [$fp];
    $write = null;
    $except = null;
    if (stream_select($read, $write, $except, $timeout) === false) {
        // 发生错误
        break;
    }
    if (count($read) === 0) {
        // 没有数据可读
        continue;
    }
    // 读取数据流
    $data = fread($fp, 1024);
    if ($data === false || strlen($data) === 0) {
        // 读取出错或已到达流的末尾
        break;
    }
    echo $data;
}

// 关闭数据流
fclose($fp);

token方式:非持续输出:

<?php
// API 访问令牌和 API Server 地址
$token = 'eyJhb......';
$apiServer = 'https://192.168.1.19:6443';

// 要读取日志的 Pod 名称和容器名称
$namespace = 'default';
$podName = 'nginx-7d64ffcf-4gb2q';
$containerName = 'nginx';

// 打开数据流
$apiPath = "/api/v1/namespaces/$namespace/pods/$podName/log?container=$containerName";
$url = $apiServer . $apiPath;
$options = [
    'http' => [
        'header' => [
            'Authorization: Bearer ' . $token,
        ],
    ],
];
$context = stream_context_create($options);
$fp = fopen($url, 'r', false, $context);

// 读取数据流
while (!feof($fp)) {
    $data = fread($fp, 1024);
    if ($data === false) {
        // 读取出错
        break;
    }
    echo $data;
}

// 关闭数据流
fclose($fp);

证书秘钥的方式:

<?php

function getfile($data){
    $file = tempnam(sys_get_temp_dir(), 'connectk8s-');
    file_put_contents($file, $data);
    return $file;
}


// 设置证书和私钥字符串
$ca = base64_decode('LS0tLS1C......'); // kubeconfig里的 certificate-authority-data 字符串
#var_dump($ca);

$cert = base64_decode('LS0tLS1......S0tLQo='); // kubeconfig里的 client-certificate-data 字符串
#var_dump($cert);

$key = base64_decode('LS0tLS1......S0tCg=='); // kubeconfig里的 client-key-data 字符串
#var_dump($key);

$ca = getfile($ca);
$cert = getfile($cert);
$key = getfile($key);

$apiServer = 'https://192.168.199.80:6443';

// 要读取日志的 Pod 名称和容器名称
$namespace = 'default';
$podName = 'guestbook-ui-85c9c5f9cb-ppmfk';
$containerName = 'guestbook-ui';

// 打开数据流
$apiPath = "/api/v1/namespaces/$namespace/pods/$podName/log?container=$containerName&follow=true";
$url = $apiServer . $apiPath;
$options = [
    "ssl" => [
        "cafile" => $ca,
        "local_cert" => $cert,
        "local_pk" => $key,
    ],
];
$context = stream_context_create($options);
$fp = fopen($url, 'r', false, $context);

// 设置超时时间
$timeout = 1;

// 持续读取数据流
while (true) {
    // 使用 stream_select() 函数检查数据流是否可读
    $read = [$fp];
    $write = null;
    $except = null;
    if (stream_select($read, $write, $except, $timeout) === false) {
        // 发生错误
        break;
    }
    if (count($read) === 0) {
        // 没有数据可读
        continue;
    }
    // 读取数据流
    $data = fread($fp, 1024);
    if ($data === false || strlen($data) === 0) {
        // 读取出错或已到达流的末尾
        break;
    }
    echo $data;
}

// 关闭数据流
fclose($fp);

获取pods数据:

// Kubernetes API 地址
$url = "https://<kubernetes_api_address>/api/v1/pods";

// 打开 HTTPS 数据流并使用上下文
$fp = fopen($url, "r", false, $context);

// 读取数据流内容
while (!feof($fp)) {
    echo fgets($fp);
}

// 关闭数据流
fclose($fp);