keboola/k8s-client

Keboola K8S 客户端库


README

高级 K8S 客户端库。它基于 kubernetes/php-client 库,但在许多方面进行了增强

  • 支持连接到多个集群
  • 自动处理结果类型(您不需要检查结果是否符合预期,是 状态 还是其他类型)
  • 在网络问题情况下集成重试机制
  • 高级操作,如一次创建多个资源,使用 waitWhileExists 等待资源存在等

使用方法

要创建客户端,请使用提供的客户端工厂之一

  • GenericClientFacadeFactory 如果您有集群凭据
  • InClusterClientFacadeFactory 如果您在一个可以访问 K8S API 的 Pod 中运行
<?php

use Keboola\K8sClient\ClientFacadeFactory\GenericClientFacadeFactory;
use Kubernetes\Model\Io\K8s\Api\Core\V1\Container;
use Kubernetes\Model\Io\K8s\Api\Core\V1\Pod;

$clientFactory = new GenericClientFacadeFactory($retryProxy, $logger);
$client = $clientFactory->createClusterClient(
    'https://api.k8s-cluster.example.com',
    'secret-token',
    'var/k8s/caCert.pem',
    'default'
);

$pod = new Pod([
    'metadata' => [
        'name' => 'my-pod',
    ],
    'spec' => [
        'restartPolicy' => 'Never',
        'containers' => [
            new Container([
                'name' => 'app',
                'image' => 'alpine',
                'command' => ['sh', '-c', 'echo hello; sleep 3; echo bye'],
            ]),
        ],
    ],
]);

// create the pod
$client->createModels([
    $pod,
]);

// wait for pod to finish
do {
    $pod = $client->pods()->getStatus($pod->metadata->name);

    if (in_array($pod->status->phase, ['Succeeded', 'Failed'], true)) {
        break;
    }

    sleep(1);
} while (true);

// check pod logs
$client->pods()->readLog($pod->metadata->name);

// delete the pod
$client->deleteModels([
    $pod,
]);

开发

先决条件

TL;DR

export NAME_PREFIX= # your name/nickname to make your resource unique & recognizable

cat <<EOF > ./provisioning/local/terraform.tfvars
name_prefix = "${NAME_PREFIX}"
EOF

terraform -chdir=./provisioning/local init -backend-config="key=k8s-client/${NAME_PREFIX}.tfstate"
terraform -chdir=./provisioning/local apply
./provisioning/local/update-env.sh azure # or aws

docker compose run --rm dev composer install
docker compose run --rm dev composer ci

实现新 API

迄今为止,仅实现了我们需要的少数几个 K8S API。要实现新 API,请执行以下操作

  • Keboola\K8sClient\ApiClient 中创建 API 客户端包装器
    • 这是一个围绕 kubernetes/php-client API 类的包装器,负责处理结果
  • 将包装器添加到 KubernetesApiClientFacade
    • 通过构造函数注入 kubernetes/php-client 客户端
    • 将新资源支持添加到方法签名
  • 更新 GenericClientFacadeFactory 以向 KubernetesApiClientFacade 提供新 API 类

许可

MIT 许可,请参阅 LICENSE 文件。