Kubeconfig 文件解释与实际示例

下面介绍如何使用不同方法使用 Kubeconfig 文件连接到 kubernetes 集群。此外,您还将学习生成自定义 Kubeconfig 文件。

Kubeconfig是一个 YAML 文件,其中包含所有Kubernetes 集群详细信息、证书和用于对集群进行身份验证的秘密令牌。如果您使用的是托管 Kubernetes 集群,您可能会直接从集群管理员或云平台获取此配置文件。

当您使用 kubectl时,它使用 kubeconfig 文件中的信息连接到 kubernetes 集群 API。Kubeconfig 文件的默认位置是$HOME/.kube/config

此外,控制器管理器、调度程序和 kubelet 等kubernetes 集群组件使用 kubeconfig 文件与 API 服务器交互。

示例 Kubeconfig 文件

这是 Kubeconfig 的示例。它需要以下关键信息来连接到 Kubernetes 集群。

  1. certificate-authority-data:集群 CA
  2. server:集群端点(主节点的 IP/DNS)
  3. name:集群名称
  4. user:用户/服务帐户的名称。
  5. token:用户/服务帐户的秘密令牌。
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: <ca-data-here>
    server: https://your-k8s-cluster.com
  name: <cluster-name>
contexts:
- context:
    cluster:  <cluster-name>
    user:  <cluster-name-user>
  name:  <cluster-name>
current-context:  <cluster-name>
kind: Config
preferences: {}
users:

- name:  <cluster-name-user>
  user:

    token: <secret-token-here>

使用 Kubeconfig 文件连接 Kubernetes 集群的不同方法

您可以以不同的方式使用 Kubeconfig,每种方式都有自己的优先级。这里按顺序排列。

  1. **Kubectl  Context:**使用 kubectl 的 Kubeconfig 会覆盖所有其他配置。它具有最高的优先级。
  2. Environment Variable: KUBECONFIG 环境变量覆盖当前上下文。
  3. **Command-Line Reference:**当前上下文比内联配置参考和环境变量具有最低的优先级。

现在让我们看一下使用 Kubeconfig 文件的所有三种方式。

方法一:使用 Kubeconfig Kubectl Context 连接 Kubernetes 集群

要连接到 Kubernetes 集群,基本先决条件是 Kubectl CLI 插件。如果您没有安装 CLI,请按照此处给出的说明进行操作。

现在按照下面给出的步骤使用 kubeconfig 文件与集群进行交互。

第 1 步:将 kubeconfig 移动到 .kube 目录。

Kubectl 使用 Kubeconfig 文件中可用的详细信息与 kubernetes 集群交互。默认情况下,kubectl 在该位置查找配置文件/.kube

让我们将 kubeconfig 文件移动到 .kube 目录。替换/path/to/kubeconfig为您的 kubeconfig 当前路径。

mv /path/to/kubeconfig ~/.kube

第 2 步:列出所有集群上下文

目录中可以有任意数量的 kubeconfig .kube。每个配置都有一个唯一的上下文名称(即集群的名称)。您可以通过列出上下文来验证 Kubeconfig 文件。您可以使用以下命令列出所有上下文。它将上下文名称列为集群的名称。

kubectl config get-contexts

第 3 步:设置当前上下文

现在您需要将当前上下文设置为您的 kubeconfig 文件。您可以使用以下命令进行设置。替换<cluster-name>为您列出的上下文名称。

kubectl config use-context <cluster-name>  

例如,

kubectl config use-context my-dev-cluster

第 4 步:验证 Kubernetes 集群连接

要验证集群连接,您可以执行以下 kubectl 命令以列出集群节点。

kubectl get nodes

方法二:通过KUBECONFIG环境变量连接

您可以KUBECONFIG使用kubeconfig文件路径设置环境变量以连接到集群。因此,无论您从终端使用 kubectl 命令,KUBECONFIGenv 变量都应该可用。如果您设置此变量,它会覆盖当前的集群上下文。

您可以使用以下命令设置变量。dev_cluster_config 文件名在哪里kubeconfig

KUBECONFIG=$HOME/.kube/dev_cluster_config

方法 3:通过 Kubectl 使用 Kubeconfig 文件

您可以使用 Kubectl 命令传递 Kubeconfig 文件以覆盖当前上下文和 KUBECONFIG env 变量。

这是获取节点的示例。

kubectl get nodes --kubeconfig=$HOME/.kube/dev_cluster_config

你也可以使用,

KUBECONFIG=$HOME/.kube/dev_cluster_config kubectl get nodes

合并多个 Kubeconfig 文件

通常,当您使用 GKE 等 Kubernetes 服务时,所有集群上下文都会添加为一个文件。但是,在某些情况下,您将获得一个 Kubeconfig 文件,该文件的访问权限有限,无法连接到生产或非生产服务器。要使用单个配置有效地管理所有集群,您可以$HOME/.kube/config使用支持的 kubectl 命令将其他 Kubeconfig 文件合并到默认文件。

假设您在$HOME/.kube/目录中有三个 Kubeconfig 文件。

  1. 配置(默认 kubeconfig)
  2. 开发配置
  3. 测试配置

您可以使用以下命令将所有三个配置合并到一个文件中。$HOME/.kub确保您从e目录运行命令

KUBECONFIG=config:dev_config:test_config kubectl config view --merge --flatten > config.new

上面的命令创建了一个名为config.new.

现在重命名旧**$HOME.kube/config**文件。

 mv $HOME/.kube/config $HOME/.kube/config.old

重命名config.new为配置。

mv $HOME/.kube/config.new $HOME/.kube/config

要验证配置,请尝试列出配置中的上下文。

kubectl config get-contexts

如果要以压缩格式查看 kubeconfig 文件以分析所有配置,可以使用以下 minify 命令。

kubectl config view --minify

如何生成 Kubeconfig 文件?

现在我们将看看使用 serviceaccount 方法创建 Kubeconfig 文件。serviceaccount 是 Kubernetes API 管理的默认用户类型。

kubeconfig 需要以下重要细节。

  1. 集群端点(集群的 IP 或 DNS 名称)
  2. 集群CA证书
  3. 集群名称
  4. 服务帐户用户名
  5. 服务帐户令牌

注意:要生成 Kubeconfig 文件,您需要在集群中具有管理员权限才能创建服务帐户和角色。

对于此演示,我正在创建一个服务帐户,clusterRole该帐户对集群范围的资源具有有限的访问权限。您还可以创建一个普通角色和角色绑定,以限制用户对特定名称空间的访问。

第 1 步:创建服务帐户

服务帐户名称将是 Kubeconfig 中的用户名。kube-system在这里,我在创建 clusterRole 时创建服务帐户。如果要创建配置以提供命名空间级别的有限访问权限,请在所需的命名空间中创建服务帐户。

kubectl -n kube-system create serviceaccount devops-cluster-admin

第 2 步:为服务帐户创建一个秘密对象

kubernetes.io/service-account.name从 Kubernetes 版本 1.24 开始,必须使用注释和类型单独创建服务帐户的秘密kubernetes.io/service-account-token

让我们使用注释和类型创建一个名为devops-cluster-admin-secret的秘密。

cat << EOF | kubectl apply -f -

apiVersion: v1

kind: Secret
metadata:

  name: devops-cluster-admin-secret
  namespace: kube-system
  annotations:
    kubernetes.io/service-account.name: devops-cluster-admin
type: kubernetes.io/service-account-token
EOF

第 3 步:创建 ClusterRole

让我们创建一个clusterRole具有有限权限的集群对象。您可以根据需要添加所需的对象访问权限。有关详细信息,请参阅具有 clusterRole 访问权限的服务帐户博客。

如果要创建命名空间作用域的角色,请参阅使用角色创建服务帐户

执行以下命令创建 clusterRole。

cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: devops-cluster-admin
rules:
- apiGroups: [""]
  resources:
  - nodes
  - nodes/proxy
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs: ["get", "list", "watch"]
EOF

第 4 步:创建 ClusterRoleBinding

以下 YAML 是一个 ClusterRoleBinding,它将devops-cluster-admin服务帐户与devops-cluster-adminclusterRole 绑定。

cat << EOF | kubectl apply -f -

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:

  name: devops-cluster-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: devops-cluster-admin
subjects:
- kind: ServiceAccount
  name: devops-cluster-admin
  namespace: kube-system
EOF

第 5 步:获取所有集群详细信息和机密

我们将检索所有必需的 kubeconfig 详细信息并将它们保存在变量中。然后,最后,我们将直接用 Kubeconfig YAML 替换它。

如果您使用了不同的秘密名称,请替换**devops-cluster-admin-secret**为您的秘密名称,

export SA_SECRET_TOKEN=$(kubectl -n kube-system get secret/devops-cluster-admin-secret -o=go-template='{{.data.token}}' | base64 --decode)

export CLUSTER_NAME=$(kubectl config current-context)

export CURRENT_CLUSTER=$(kubectl config view --raw -o=go-template='{{range .contexts}}{{if eq .name "'''${CLUSTER_NAME}'''"}}{{ index .context "cluster" }}{{end}}{{end}}')

export CLUSTER_CA_CERT=$(kubectl config view --raw -o=go-template='{{range .clusters}}{{if eq .name "'''${CURRENT_CLUSTER}'''"}}"{{with index .cluster "certificate-authority-data" }}{{.}}{{end}}"{{ end }}{{ end }}')

export CLUSTER_ENDPOINT=$(kubectl config view --raw -o=go-template='{{range .clusters}}{{if eq .name "'''${CURRENT_CLUSTER}'''"}}{{ .cluster.server }}{{end}}{{ end }}')

第 6 步:使用变量生成 Kubeconfig。

如果您执行以下 YAML,所有变量都会被替换并devops-cluster-admin-config生成一个名为的配置。

cat << EOF > devops-cluster-admin-config
apiVersion: v1

kind: Config
current-context: ${CLUSTER_NAME}
contexts:
- name: ${CLUSTER_NAME}
  context:
    cluster: ${CLUSTER_NAME}
    user: devops-cluster-admin
clusters:
- name: ${CLUSTER_NAME}
  cluster:
    certificate-authority-data: ${CLUSTER_CA_CERT}
    server: ${CLUSTER_ENDPOINT}
users:

- name: devops-cluster-admin
  user:

    token: ${SA_SECRET_TOKEN}
EOF

第 7 步:验证生成的 Kubeconfig

要验证 Kubeconfig,请使用 kubectl 命令执行它以查看集群是否正在通过身份验证。

kubectl get nodes --kubeconfig=devops-cluster-admin-config 

注意:在云环境中,集群 RBAC(基于角色的访问控制)可以映射到普通的 IAM(身份和访问管理)用户。这允许组织根据 IAM 策略控制对集群的访问,这些策略可用于创建限制性 kubeconfig 文件。此外,其他服务,例如OIDC (OpenID Connect),可用于管理用户和创建 kubeconfig 文件,根据特定的安全要求限制对集群的访问。

Kubeconfig 文件常见问题解答

让我们看看一些常见的 Kubeconfig 文件问题。

在哪里放置 Kubeconfig 文件?

默认的 Kubeconfig 文件位置是`**$HOME/.kube/**`主目录中的文件夹。Kubectl 使用来自 . kube文件夹。但是,如果您使用的是KUBECONFIG环境变量,则可以将 kubeconfig 文件放在首选文件夹中,并引用环境KUBECONFIG变量中的路径。

Kubeconfig 文件位于何处?

所有 kubeconfig 文件都位于用户主目录的 .kube 目录中。那是**$HOME/.kube/config**

如何管理多个 Kubeconfig 文件?

您可以将所有 kubeconfig 文件存储在$HOME/.kube目录中。您需要更改集群上下文以连接到特定集群。

如何创建 Kubeconfig 文件?

要创建 Kubeconfig 文件,您需要拥有集群端点详细信息、集群 CA 证书和身份验证令牌。然后,您需要创建一个 config 类型的 Kubernetes YAML 对象,其中包含所有集群详细信息。

如何通过 Kubeconfig 使用代理

如果您使用公司代理,则可以**proxy-url**: https://proxy.host:port在 Kubeconfig 文件中使用它来连接到集群。

结论

在这篇博客中,我们学习了使用自定义 Kubeconfig 文件连接到 Kubernetes 集群的不同方法。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYU1tPWr' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片