通过kubectx/kubens快速切换管理k8s的context和namespace

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 通过kubectx/kubens快速切换管理k8s的context和namespace

在使用kubectl操作kubernetes集群的过程中,可能会遇到需要操作不同集群的问题,例如本地的minikube集群和线上的部署集群,或是线上的测试集群和线上的部署集群,如果集群之间切换不频繁,也可以使用笨办法,比如准备多个config文件在/.kube文件夹下,要切换的时候就改config的名字,或者使用别名,不过对于需要频繁切换操作集群的人来说,这个方法显然太麻烦了,当然也不够cool。


当然,k8s是非常完善的集群解决方案,肯定是考虑到了这个问题的,这里就用到了k8s的config文件的context(上下文)了。


https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#define-clusters-users-and-contexts


这里就不详细说以上这种方法了,我们来说说已经存在了两个集群的config文件时如何简单的生成context,当然,在上述文档的后半部分,也有我要说明的这些,也可以去看英文原文,我这里是因为遇到了一个坑,所以详细解释一下。


首先说方法,我们都知道kubectl如果没有设置config相关位置的环境变量,那么其会默认去一个地方寻找,对于Mac来说,就是


$HOME/.kube/config


那么坑在哪里呢,由于两个集群的配置文件可能是管理员只分配给你自己使用的,那么用户名就可能是相同的,在用户名相同的情况下,如果集群的连接启用了TLS验证,那么kubectl自己融合的config文件就会使用相同的client-certificate-data和client-key-data,如果两个集群在同一服务商的同一片网络下还好,可是如果是在不同的网络下,那么就会出现只能连接上其中一个,而另一个集群无法连接的情况,这种时候,我的解决办法是修改用户名,但要注意,在config里的context下,可以看到user和name两个字段,我们要修改的是user字段,这里只是一个名称,不影响集群侧的用户验证,修改完user字段,记得翻到users字段下,那里面有一个name,这个name的值应该和刚刚修改之前的user字段中的值一样,把这里也修改成同样的新值,保存,重新配置环境变量使之生效,这时候就可以使用了,下面我写了一个多集群合并的例子,大家去查询需要管理的集群中master节点~/.kube/config中的几段数据拷贝出来即可,组成一个合并到一起的config文件,便于后面用kubectx工具进行切换


apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
    server: https://xxxxx:6443
    certificate-authority-data: xxxxx
  name: cluster1 #第一个集群名称
- cluster:
    server: https://xxxxx:6443
    certificate-authority-data: xxxxx
  name: cluster2 #第二集群名称
contexts:
- context:
    cluster: cluster1 #第一个集群名称
    user: user1 #第一个集群用户
  name: cluster1 #第一个集群名称
- context:
    cluster: cluster2 #第二集群名称
    user: user2 #第二个集群用户
  name: cluster2 #第二集群名称
users:
- name: user1 #第一个集群context中的user
  user:
    client-certificate-data: xxxxxxxxxxx
    client-key-data: xxxxxxxxxxxxxxxxxxx
- name: user2 #第二个集群context中的user
  user:
    client-certificate-data: xxxxxxxxxxx
    client-key-data: xxxxxxxxxxxxxxxxxxx


上面的集群名字和用户名字,只要需要clusters,contexts,users中的是对应的同一个集群即可,可以任意添加多个,自定义名称,只要用户名和集群名不重复即可


至于官方提供的切换集群的方法,在上述文档中也能找到,这里也不在赘述,这里主要介绍一个第三方工具来帮我们更快捷的做这个事:


kubectx


1 安装


github上开源了这个第三方工具,克隆下来就会有两个可执行文件,kubectx,kubens分别是用来切换选择集群和切换选择集群中的命名空间


➜  [/Users/mac] git clone https://github.com/ahmetb/kubectx
➜  [/Users/mac] cd kubectx
➜  [/Users/mac/kubectx] git:(master) ll
total 144
-rw-r--r--  1 mac  staff   968B  6 20 00:48 CONTRIBUTING.md
-rw-r--r--  1 mac  staff    11K  6 20 00:48 LICENSE
-rw-r--r--  1 mac  staff   9.7K  6 20 00:48 README.md
drwxr-xr-x  4 mac  staff   128B  6 20 00:48 cmd
drwxr-xr-x  8 mac  staff   256B  6 20 00:48 completion
-rw-r--r--  1 mac  staff   765B  6 20 00:48 go.mod
-rw-r--r--  1 mac  staff    22K  6 20 00:48 go.sum
drwxr-xr-x  5 mac  staff   160B  6 20 00:48 img
drwxr-xr-x  7 mac  staff   224B  6 20 00:48 internal
-rwxr-xr-x  1 mac  staff   5.9K  6 20 00:48 kubectx
-rwxr-xr-x  1 mac  staff   5.4K  6 20 00:48 kubens
drwxr-xr-x  7 mac  staff   224B  6 20 00:48 test
➜  [/Users/mac/kubectx] git:(master) cp kubectx/kube* /usr/local/bin/
➜  [/Users/mac/kubectx] git:(master) chmod +x /usr/local/bin/kube*
➜  [/Users/mac/kubectx] git:(master) mv /usr/local/bin/kubectx /usr/local/bin/kbx
➜  [/Users/mac/kubectx] git:(master) mv /usr/local/bin/kubens /usr/local/bin/kbs


注意,这里对下载下来的二进制进行重命名主要是为了避免kubectx这个工具会影响对kubectl的自动补全,



2 使用kubectx快速切换context


在完成了上述模版对config文件自动融合之后,拷贝到管理机的~/.kube/目录,使用这个工具就可以快速的切换不同的操作集群,同时这个工具还支持bash/zsh的tab自动补全,以及fzf这个快速选择工具,可以说从此以后切换集群就可以如丝般顺滑了


2.1 基本使用


➜  [/Users/mac] kbx -h
USAGE:
  kubectx                       : list the contexts
  kubectx <NAME>                : switch to context <NAME>
  kubectx -                     : switch to the previous context
  kubectx -c, --current         : show the current context name
  kubectx <NEW_NAME>=<NAME>     : rename context <NAME> to <NEW_NAME>
  kubectx <NEW_NAME>=.          : rename current-context to <NEW_NAME>
  kubectx -d <NAME> [<NAME...>] : delete context <NAME> ('.' for current-context)
                                  (this command won't delete the user/cluster entry
                                  that is used by the context)
  kubectx -u, --unset           : unset the current context
  kubectx -h,--help             : show this message


kubectx                     : 列出目前所有的context
kubectx <NAME>              : 切换到<NAME>对应的context
kubectx -                   : 切换到上一次的context
kubectx <NEW NAME>=<NAME>   : 给<NAME>context命名一个新名字
kubectx <NAME>=.            : 给当前context命名一个新名字


2.2 列出全部context


➜  [/Users/mac] kbx
cluster1
cluster2


2.3 切换到指定context


➜  [/Users/mac] kbx cluster1
Switched to context "cluster1".


查看cluster-info
kbx cluster-info
结果示例
Kubernetes master is running at https://10.0.2.15:6443
KubeDNS is running at https://10.0.2.15:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.


2.4 切换到上一次的context


➜  [/Users/mac] kbx cluster1
Switched to context "cluster1".
➜  [/Users/mac] kbx cluster2
Switched to context "cluster2".
➜  [/Users/mac] kbx -
Switched to context "cluster1".


3 使用kubens快速切换namespace


3. 1 参数说明


➜  [/Users/mac] kbs -h
USAGE:
  kubens                    : list the namespaces in the current context
  kubens <NAME>             : change the active namespace of current context
  kubens -                  : switch to the previous namespace in this context
  kubens -c, --current      : show the current namespace
  kubens -h,--help          : show this message


3.2 列出全部namespace


➜  [/Users/mac] kbs
default
kube-public
kube-system


3.3 切换到指定namespace


kbs kube-system
结果示例
Context "cluster1" modified.
Active namespace is "kube-system".
接下来,可以过以下命令在最近使用过的2个namespace快速切换。
kubens -


特别注意⚠️,特别注意,特别注意:同一个管理机上管理多个集群是方便,但是需要注意多个集群的管理员的安全问题,也可以参考官方文档,自己去创建一个不同权限的上下文 https://blog.csdn.net/qq_21816375/article/details/80305851?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecasehttps://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#define-clusters-users-and-contexts

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
Kubernetes 监控 数据安全/隐私保护
K8s好看的管理页面Rancher管理K8S
K8s好看的管理页面Rancher管理K8S
98 4
|
6月前
|
Prometheus Kubernetes 监控
Kubernetes 的 NameSpace 无法删除应该怎么办?
Kubernetes 的 NameSpace 无法删除应该怎么办?
|
6月前
|
Kubernetes 开发工具 Docker
微服务实践k8s与dapr开发部署实验(2)状态管理
微服务实践k8s与dapr开发部署实验(2)状态管理
109 3
微服务实践k8s与dapr开发部署实验(2)状态管理
|
6月前
|
存储 Kubernetes API
使用Kubernetes管理容器化应用的深度解析
【5月更文挑战第20天】本文深度解析Kubernetes在管理容器化应用中的作用。Kubernetes是一个开源平台,用于自动化部署、扩展和管理容器,提供API对象描述应用资源并维持其期望状态。核心组件包括负责集群控制的Master节点(含API Server、Scheduler、Controller Manager和Etcd)和运行Pod的工作节点Node(含Kubelet、Kube-Proxy和容器运行时环境)。
|
3月前
|
Kubernetes 前端开发 API
在K8S中,在容器内如何获取pod和namespace名字?
在K8S中,在容器内如何获取pod和namespace名字?
|
4月前
|
存储 Kubernetes 容器
k8s卷管理-2
k8s卷管理-2
28 2
|
4月前
|
存储 Kubernetes 调度
k8s卷管理-1
k8s卷管理-1
24 2
|
3月前
|
Kubernetes API 容器
在K8s中,容器内如何获取pod和namespace名?
在K8s中,容器内如何获取pod和namespace名?
|
4月前
|
Kubernetes 持续交付 Python
Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。
Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。
|
4月前
|
存储 弹性计算 运维
阿里云容器服务Kubernetes版(ACK)部署与管理体验评测
阿里云容器服务Kubernetes版(ACK)是一个功能全面的托管Kubernetes服务,它为企业提供了快速、灵活的云上应用管理能力。
179 2

推荐镜像

更多
下一篇
无影云桌面