【问题标题】:Accessing Kubernetes worker node labels from the Containers/pods从 Containers/pods 访问 Kubernetes 工作节点标签
【发布时间】:2021-12-04 11:11:34
【问题描述】:

如何从集群中运行的容器/pod 访问 Kubernetes 工作节点标签? 在工作节点上设置标签,因为针对此 Azure AKS 工作节点启动的此 kubectl 命令的 yaml 输出显示:

$ kubectl get nodes aks-agentpool-39829229-vmss000000 -o yaml
apiVersion: v1
kind: Node
metadata:
  annotations:
    node.alpha.kubernetes.io/ttl: "0"
    volumes.kubernetes.io/controller-managed-attach-detach: "true"
  creationTimestamp: "2021-10-15T16:09:20Z"
  labels:
    agentpool: agentpool
    beta.kubernetes.io/arch: amd64
    beta.kubernetes.io/instance-type: Standard_DS2_v2
    beta.kubernetes.io/os: linux
    failure-domain.beta.kubernetes.io/region: eastus
    failure-domain.beta.kubernetes.io/zone: eastus-1
    kubernetes.azure.com/agentpool: agentpool
    kubernetes.azure.com/cluster: xxxx
    kubernetes.azure.com/mode: system
    kubernetes.azure.com/node-image-version: AKSUbuntu-1804gen2containerd-2021.10.02
    kubernetes.azure.com/os-sku: Ubuntu
    kubernetes.azure.com/role: agent
    kubernetes.azure.com/storageprofile: managed
    kubernetes.azure.com/storagetier: Premium_LRS
    kubernetes.io/arch: amd64
    kubernetes.io/hostname: aks-agentpool-39829229-vmss000000
    kubernetes.io/os: linux
    kubernetes.io/role: agent
    node-role.kubernetes.io/agent: ""
    node.kubernetes.io/instance-type: Standard_DS2_v2
    storageprofile: managed
    storagetier: Premium_LRS
    topology.kubernetes.io/region: eastus
    topology.kubernetes.io/zone: eastus-1
  name: aks-agentpool-39829229-vmss000000
  resourceVersion: "233717"
  selfLink: /api/v1/nodes/aks-agentpool-39829229-vmss000000
  uid: 0241eb22-4d1b-4d65-870f-fcc51dac1c70

注意:我拥有的 pod/Container 以非 root 访问权限运行,并且没有特权用户。

有没有办法从工作节点本身访问这些标签?

【问题讨论】:

  • 创建一个 ServiceAccount 并使用正确的 RBAC,然后您可以使用 Kubernetes API 访问节点标签
  • @TonyYip 你介意分享一些例子吗?

标签: azure kubernetes google-kubernetes-engine azure-aks


【解决方案1】:

在 AKS 群集中,

  1. 创建一个命名空间,如:

      kubectl create ns get-labels
    
  2. 在命名空间中创建一个服务帐户,例如:

      kubectl create sa get-labels -n get-labels 
    
  3. 像这样创建一个集群角色:

      kubectl create clusterrole get-labels-clusterrole --resource=nodes --verb=get,list
    
  4. 创建一个角色绑定,如:

      kubectl create rolebinding get-labels-rolebinding -n get-labels --clusterrole get-labels-clusterrole --serviceaccount get-labels:get-labels
    
  5. 在您创建的命名空间中运行一个 pod,如下所示:

     cat << EOF | kubectl apply -f -
     apiVersion: v1
     kind: Pod
     metadata:
       name: get-labels
       namespace: get-labels
     spec:
       serviceAccountName: get-labels
       containers:
       - image: centos:7
         name: get-labels
         command:
         - /bin/bash
         - -c
         - tail -f /dev/null
     EOF
    
  6. 在正在运行的容器中执行一个 shell,例如:

    kubectl exec -it get-labels -n get-labels -- bash
    
  7. 在容器中安装jq工具:

    yum install epel-release -y && yum update -y && yum install jq -y
    
  8. 设置shell变量:

    # API Server Address
    APISERVER=https://kubernetes.default.svc
    # Path to ServiceAccount token
    SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
    # Read this Pod's namespace
    NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
    # Read the ServiceAccount bearer token
    TOKEN=$(cat ${SERVICEACCOUNT}/token)
    # Reference the internal certificate authority (CA)
    CACERT=${SERVICEACCOUNT}/ca.crt
    
  9. 如果要获取所有节点及其对应标签的列表,请使用以下命令:

    curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/nodes | jq '.items[].metadata | {name,labels}'
    

    否则,如果您想要与特定节点对应的标签,请使用:

    curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/nodes/<nodename> | jq '.metadata.labels'
    

请将&lt;nodename&gt; 替换为预期的节点名称。

注意您可以选择在构建容器映像的Dockerfile 中包含jq 工具的安装,并使用environment variables 作为shell 变量。我们没有在这个答案中使用任何一个来解释这个方法的工作原理。

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 2019-01-21
    • 2020-06-28
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2022-01-27
    • 2020-09-02
    相关资源
    最近更新 更多