开发者社区> 问答> 正文

如何从(非主)节点或远程节点访问kubernetes API

我无法从外部设置对kubernetes集群的访问权限。这就是我想要实现的目标: - 能够从外部(从非“主”甚至从任何远程的节点)访问kube集群,以便能够仅在特定命名空间上执行kube操作。

我的逻辑是做以下事情:

创建新的命名空间(让我们称之为testns)
创建服务帐户(testns-account)
创建角色,为在testns命名空间内创建任何类型的kube资源提供访问权限
创建角色绑定,将服务帐户与角色绑定
从服务帐户生成令牌
现在,我的逻辑是我需要令牌+ api服务器URL来访问具有有限“权限”的kube集群,但这似乎不够。

实现这一目标最简单的方法是什么?首先,我可以访问kubectl只是为了验证命名空间的有限权限,但最终,我会有一些客户端代码进行访问并使用这些有限的权限创建kube资源。

展开
收起
k8s小能手 2019-02-22 15:55:34 2528 0
1 条回答
写回答
取消 提交回答
  • 整合最优质的专家资源和技术资料,问答解疑

    您需要从令牌生成kubeconfig。

    !/ usr / bin / env bash

    Copyright 2017, Z Lab Corporation. All rights reserved.

    Copyright 2017, Kubernetes scripts contributors

    For the full copyright and license information, please view the LICENSE

    file that was distributed with this source code.

    set -e

    if [[ $# == 0 ]]; then
    echo "Usage: $0 SERVICEACCOUNT [kubectl options]" >&2
    echo "" >&2
    echo "This script creates a kubeconfig to access the apiserver with the specified serviceaccount and outputs it to stdout." >&2

    exit 1
    fi

    function _kubectl() {
    kubectl $@ $kubectl_options
    }

    serviceaccount="$1"
    kubectl_options="${@:2}"

    if ! secret="$(_kubectl get serviceaccount "$serviceaccount" -o 'jsonpath={.secrets[0].name}' 2>/dev/null)"; then
    echo "serviceaccounts "$serviceaccount" not found." >&2
    exit 2
    fi

    if [[ -z "$secret" ]]; then
    echo "serviceaccounts "$serviceaccount" doesn't have a serviceaccount token." >&2
    exit 2
    fi

    context

    context="$(_kubectl config current-context)"

    cluster

    cluster="$(_kubectl config view -o "jsonpath={.contexts[?(@.name==\"$context")].context.cluster}")"
    server="$(_kubectl config view -o "jsonpath={.clusters[?(@.name==\"$cluster")].cluster.server}")"

    token

    ca_crt_data="$(_kubectl get secret "$secret" -o "jsonpath={.data.ca.crt}" | openssl enc -d -base64 -A)"
    namespace="$(_kubectl get secret "$secret" -o "jsonpath={.data.namespace}" | openssl enc -d -base64 -A)"
    token="$(_kubectl get secret "$secret" -o "jsonpath={.data.token}" | openssl enc -d -base64 -A)"

    export KUBECONFIG="$(mktemp)"
    kubectl config set-credentials "$serviceaccount" --token="$token" >/dev/null
    ca_crt="$(mktemp)"; echo "$ca_crt_data" > $ca_crt
    kubectl config set-cluster "$cluster" --server="$server" --certificate-authority="$ca_crt" --embed-certs >/dev/null
    kubectl config set-context "$context" --cluster="$cluster" --namespace="$namespace" --user="$serviceaccount" >/dev/null
    kubectl config use-context "$context" >/dev/null

    cat "$KUBECONFIG"

    2019-07-17 23:29:11
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
ACK 云原生弹性方案—云原生时代的加速器 立即下载
ACK集群类型选择最佳实践 立即下载
企业运维之云原生和Kubernetes 实战 立即下载

相关镜像