下面介绍如何使用不同方法使用 Kubeconfig 文件连接到 kubernetes 集群。此外,您还将学习生成自定义 Kubeconfig 文件。
Kubeconfig是一个 YAML 文件,其中包含所有Kubernetes 集群详细信息、证书和用于对集群进行身份验证的秘密令牌。如果您使用的是托管 Kubernetes 集群,您可能会直接从集群管理员或云平台获取此配置文件。
当您使用 kubectl
时,它使用 kubeconfig 文件中的信息连接到 kubernetes 集群 API。Kubeconfig 文件的默认位置是$HOME/.kube/config
此外,控制器管理器、调度程序和 kubelet 等kubernetes 集群组件使用 kubeconfig 文件与 API 服务器交互。
示例 Kubeconfig 文件
这是 Kubeconfig 的示例。它需要以下关键信息来连接到 Kubernetes 集群。
- certificate-authority-data:集群 CA
- server:集群端点(主节点的 IP/DNS)
- name:集群名称
- user:用户/服务帐户的名称。
- 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,每种方式都有自己的优先级。这里按顺序排列。
- **Kubectl Context:**使用 kubectl 的 Kubeconfig 会覆盖所有其他配置。它具有最高的优先级。
- Environment Variable: KUBECONFIG 环境变量覆盖当前上下文。
- **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 命令,KUBECONFIG
env 变量都应该可用。如果您设置此变量,它会覆盖当前的集群上下文。
您可以使用以下命令设置变量。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 文件。
- 配置(默认 kubeconfig)
- 开发配置
- 测试配置
您可以使用以下命令将所有三个配置合并到一个文件中。$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 需要以下重要细节。
- 集群端点(集群的 IP 或 DNS 名称)
- 集群CA证书
- 集群名称
- 服务帐户用户名
- 服务帐户令牌
注意:要生成 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-admin
clusterRole 绑定。
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 集群的不同方法。