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

时间:2019-02-19 21:34:52

标签: kubernetes kubernetes-apiserver

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

我的逻辑是执行以下操作:

  • 创建新的名称空间(我们称其为testns)
  • 创建服务帐户(testns-account)
  • 创建角色,该角色可用于在testns名称空间内创建任何类型的kube资源
  • 创建角色绑定,将服务帐户与角色绑定
  • 从服务帐户生成令牌

现在,我的逻辑是我需要具有令牌+ API服务器URL才能以有限的“权限”访问kube集群,但这似乎还不够。

最简单的方法是什么?首先,我可以使用kubectl进行访问,只是为了验证对名称空间的有限权限是否有效,但是最终,我将具有一些客户端代码来进行访问并使用这些有限权限创建kube资源。

1 个答案:

答案 0 :(得分:1)

您需要根据令牌生成kubeconfig。有scripts个可以处理。这是给后代的:

!/ 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"