kubernetes 如何给予额外的信息给akri中的brokerpod,或者根据udev规则启动不同的brokerpod

4szc88ey  于 4个月前  发布在  Kubernetes
关注(0)|答案(1)|浏览(35)

我想根据udev规则在akri中启动一个自定义brokerpod,并想给予brokerpod启动udev规则的附加信息。我试过这样做,但似乎不起作用。

helm repo add akri-helm-charts https://project-akri.github.io/akri/
helm install akri akri-helm-charts/akri \
    $AKRI_HELM_CRICTL_CONFIGURATION \
    --set udev.discovery.enabled=true \
    --set udev.configuration.enabled=true \
    --set udev.configuration.name=akri-udev-video \
    --set udev.configuration.discoveryDetails.udevRules[0]='ATTR{product}=="AAAA"' \
    --set udev.configuration.brokerPod.image.repository[0]=nginx \
    --set udev.configuration.discoveryDetails.udevRules[1]='ATTR{product}=="BBBB"' \
    --set udev.configuration.brokerPod.image.repository[1]=nginx:1.24

字符串
这启动了两个akri示例,我可以看到kubectl get akrii,但nginx作为一个例子似乎没有正确运行。如果我只为一个规则启动它,我可以进入nginx容器。

helm repo add akri-helm-charts https://project-akri.github.io/akri/
helm install akri akri-helm-charts/akri \
    $AKRI_HELM_CRICTL_CONFIGURATION \
    --set udev.discovery.enabled=true \
    --set udev.configuration.enabled=true \
    --set udev.configuration.name=akri-udev-video \
    --set udev.configuration.discoveryDetails.udevRules='ATTR{manufacturer}=="manufacturer_of_AAAA_and_BBBB"' \
    --set udev.configuration.brokerPod.image.repository=nginx


但目的是启动不同的容器,并根据udev规则给予brokerProperties。

cwxwcias

cwxwcias1#

为了实现在Akri中启动不同的自定义brokerPod的目标,根据udev规则,并向这些brokerPod传递其他信息,您需要修改Helm chart配置。
关键是在Akri中正确设置udev configuration,以根据udev规则匹配特定设备,并相应地自定义brokerPod配置。

+---------------------------------------------------------------+
|                          Kubernetes Cluster                   |
|                                                               |
|   +-------------------+           +----------------------+    |
|   |  Akri Controller  |<----------|     Broker Pods      |    |
|   +-------------------+           +----------------------+    |
|              |                              |                 |
|              |    Discovers Devices         |                 |
|              |    Matching udev Rules  /----+----\            |
|              |                         |         |            |
|   +-------------------+      +-----------+     +------------+ |
|   |   udev Discovery  |----->| Broker A  |     | Broker B   | |
|   |    Configuration  |      +-----------+     +------------+ |
|   +-------------------+             |                |        |
|              |                      |                |        |
|              |    Matches Devices   |                |        |
|              |    Based on Rules    |                |        |
|   +-------------------+             |                |        |
|   |   udev Rule 1     |-------------+                |        |
|   |   udev Rule 2     |------------------------------+        |
|   +-------------------+                                       |
+---------------------------------------------------------------+

字符串
首先,定义多个udev配置,每个配置都基于您的udev规则针对一组特定的设备。每个配置都应该指定一个不同的brokerPod,以便在发现与其udev规则匹配的设备时部署。
然后,为每个udev规则自定义brokerPod:为每个udev配置,指定不同的brokerPod镜像或配置。这将确保根据它们对应的设备启动不同的brokerPod。
要向brokerpod传递其他信息,例如哪个udev规则触发了它的启动,您可以使用环境变量或Kubernetes和Akri支持的其他配置方法。
首先,定义多个udev配置,每个配置都基于您的udev规则针对一组特定的设备。每个配置都应该指定一个不同的brokerPod,以便在发现与其udev规则匹配的设备时部署。
然后,为每个udev规则自定义brokerPod:为每个udev配置,指定不同的brokerPod镜像或配置。这将确保根据它们对应的设备启动不同的brokerPod。
要向brokerpod传递其他信息,例如哪个udev规则触发了它的启动,您可以使用环境变量或Kubernetes和Akri支持的其他配置方法。
您的Helm chart需要调整以反映这些多个配置。这可能看起来像下面这样(为了说明而简化):

udev:
    discovery:
    enabled: true
    configuration:
    - name: akri-udev-rule1
        discoveryDetails:
        udevRules: ['ATTR{product}=="AAAA"']
        brokerPod:
        image:
            repository: custom-image-for-rule1
    - name: akri-udev-rule2
        discoveryDetails:
        udevRules: ['ATTR{product}=="BBBB"']
        brokerPod:
        image:
            repository: custom-image-for-rule2


将修改后的Helm chart部署到您的Kubernetes集群。然后,Akri将根据发现的与指定udev规则匹配的设备部署不同的brokerPod。
如果brokerpods未按预期运行,请检查Akri控制器和brokerpods的日志以获取任何错误消息。(kubectl get podskubectl logs <broker-pod-name>kubectl describe pod <broker-pod-name>
现在更重要的部分甚至是给予环境变量,而不是它甚至可以是相同的brokerpod。在那里,我仍然不确定如何从udev规则传递一些东西到pod。
将特定信息从udev规则传递到Akri中的broker pod将涉及两步过程:首先,在udev规则中捕获必要的信息,其次,通常通过环境变量将此信息传输到broker pod。
要捕获udev规则中的信息,请使用udev规则语法将设备属性匹配并分配给环境变量。
捕获ATTR{product}值的anudev规则示例:

ACTION=="add", ATTR{product}=="AAAA", ENV{MY_UDEV_ENV}="$attr{product}"


然后使用Akri的配置将捕获的信息从udev规则传递到broker pod。这通常是通过在broker pod的环境变量配置中引用udev规则中设置的环境变量来完成的。然而,Akri没有,似乎直接支持从udev规则动态传递自定义环境变量到broker pod。Akri的broker pod环境变量通常是预定义的,Helm Chart中的静态。
一种可能的解决方法是使用自定义代理pod,它可以根据已知的静态环境变量(如设备ID或节点名称)查询节点或Akri控制器的特定设备信息。
例如,您的broker pod可以是一个脚本或应用程序,它首先读取静态环境变量以获取设备ID或节点名称,然后执行查询或查找以查找该设备的相应udev信息。
在代理pod配置中设置静态环境变量的一个简化示例是:yaml udev: configuration: - name: akri-udev-rule1 brokerPod: env: - name: STATIC_ENV value: "SomeStaticValue"然后,您的自定义代理pod逻辑将使用STATIC_ENV执行进一步的操作或查询以获取动态信息。

+-----------------------------------------------------------+
|                      Kubernetes Cluster                   |
|                                                           |
|  +-------------------+        +----------------------+    |
|  |  Akri Controller  |        |     Broker Pods      |    |
|  +-------------------+        +----------------------+    |
|           |                              ^                |
|           |    Discovers Devices         |                |
|           |    Matching udev Rules       |                |
|           |                              |                |
|  +----------------------+                |                |
|  |   udev Discovery     |----------------|                |
|  |    Configuration     |                |                |
|  +----------------------+                |                |
|           |                              |                |
|           |    Matches Devices           |                |
|           |    Based on Rules            |                |
|  +----------------------+                |                |
|  |    udev Rule with    |----------------+                |
|  |  Captured Information|                                 |
|  +----------------------+                                 |
|           |                                               |
|           |    Environment Variable (Static)              |
|           |                                               |
|  +----------------------+                                 |
|  |   Custom Broker Pod  |                                 |
|  |      Logic (Script/  |                                 |
|  |     Application)     |                                 |
|  +----------------------+                                 |
|           ^                                               |
|           | Queries for Additional Info                   |
|           | Based on Static Env Variable                  |
+-----------------------------------------------------------+


开发一个自定义的broker pod应用程序/脚本,它使用静态环境变量来派生或获取其他细节。
这可能涉及查询本地系统、Kubernetes API或其他机制,以将静态信息与udev规则捕获的动态细节相关联。
这种方法需要在broker pod端进行自定义开发,因为到目前为止,将任意udev规则派生的信息动态传递到broker pod还不是本机功能。关键在于broker pod中的自定义逻辑,它可以解释或使用静态环境变量来发现有关其关联设备的更多动态详细信息。
在Akri中实现使用静态环境变量检索其他设备信息的自定义代理pod需要在代理pod中创建自定义应用程序或脚本。该自定义逻辑负责使用静态环境变量派生或获取与设备相关的动态信息。

使用Python脚本作为示例的概念性实现是自定义代理pod的容器镜像的脚本部分:
broker_logic.py

import os
import some_device_query_library  # Hypothetical library to query device info

def get_dynamic_device_info(static_env_var):
    # Logic to use static environment variable to find dynamic device information
    # That could involve querying the local system, Kubernetes API, etc.
    # For example, using a static device ID to find more details about the device
    device_id = static_env_var
    device_info = some_device_query_library.query_device_info(device_id)
    return device_info

if __name__ == "__main__":
    # Retrieve the static environment variable
    static_env_var = os.getenv('STATIC_ENV', 'default_value')

    # Get dynamic device information
    dynamic_info = get_dynamic_device_info(static_env_var)
    
    # Implement your logic here using the dynamic device information
    print(f"Dynamic Device Info: {dynamic_info}")


定制代理pod的Dockerfile:

FROM python:3.8-slim

# Copy the Python script into the container
COPY broker_logic.py /broker_logic.py

# Set the command to run the script
CMD ["python", "/broker_logic.py"]


构建Docker镜像并将其推送到容器注册表。

docker build -t my-custom-broker-image .
docker push my-custom-broker-image


然后在akri配置中引用自定义代理镜像:

udev:
    configuration:
    - name: akri-udev-rule1
        brokerPod:
        image:
            repository: my-custom-broker-image
            tag: latest
        env:
            - name: STATIC_ENV
            value: "SomeStaticValue"


这假设自定义代理pod可以通过某种方式(如查询Kubernetes API、本地系统查询等)基于静态环境变量检索其他信息。
实际的实现细节将根据设备信息如何公开以及如何与环境变量中可用的静态信息相关联而有所不同。

相关问题