k8s客户端工具-kubectl
介绍
kubectl
是 Kubernetes 命令行工具,用于与 Kubernetes 集群进行交互。它允许用户执行各种操作,如部署应用、管理资源、查看集群状态等 。
下载
客户端的版本最好和集群的版本一致,或者大于集群的版本,我这儿是v1.29.2版本的集群。
https://cdn.dl.k8s.io/release/v1.29.2/kubernetes-client-linux-amd64.tar.gz
-
解压
tar -zxvf kubernetes-client-linux-amd64.tar.gz
-
验证
进入./kubernetes/client/bin
./kubectl version
也可以把kubectl命令行工具复制到/usr/local/bin目录下(配置快捷脚本)
使用
通过kubectl客户端和k8s集群进行交付时,默认回去找/root/.kube/config文件进行相关的集群认证鉴权,文章后面会有讲到这个config文件的创建。
可以通过 ./kubectl --help命令查看相关的参数信息
kubeconfig配置文件
kubeconfig 是 Kubernetes 集群的配置文件,用于存储与集群连接相关的信息,例如集群的地址、证书、用户名等。它是 kubectl
命令行工具和其他 Kubernetes 客户端与集群进行通信的重要配置文件 ;基于无状态协议HTTP/HTTPS的API Server需要验证每次连接请求中的用户身份,因而kube-controller-manager、kube-scheduler和kube-proxy等各类客户端组件必须能自动完成身份认证信息的提交,但通过程序选项来提供这些信息会导致敏感信息泄露。另外,管理员还面临着使用kubectl工具分别接入不同集群时的认证及认证信息映射难题。为此,Kubernetes设计了一种称为kubeconfig的配置文件,它保存有接入一到多个Kubernetes集群的相关配置信息,并允许管理员按需在各配置间灵活切换, 需要注意的是,kubeconfig
文件包含敏感信息,如证书和密码,因此应该妥善保管和保护该文件,避免将其泄露给未经授权的人员 。
kubeconfig文件结构
-
集群信息
集群信息给k8s集群创建一个集群名称用于后面给用户和命令空间绑定
-
集群上下文
简单理解是集群信息、用户、命令空间绑定,定义哪个用户在集群哪个命令空间下有相应的权限
-
用户信息
账号类型是user的需要跟api-server认证,然后配置相应的权限即可有集群资源的操作权限
X509数字证书身份凭据(user账号)
生成私钥
# umask 077; openssl genrsa -out test.key 2048
创建证书签署请求
-subj选项中CN的值将被API Server识别为用户名,O的值将被识别为用户组。
# openssl req -new -key test.key -out test.csr -subj "/CN=mason/O=devops"
签署证书请求
# openssl x509 -req -days 365 -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -in test.csr -out test.crt
注意*这里k8s集群的证书和密钥可以是ca.crt,ca.key和ca.pem,ca-key.pem
查看证书信息
# ls
mason.crt mason.csr mason.key
自定义kubeconfig文件
添加集群配置(cluster)
# kubectl config set-cluster devopser --embed-certs=true --certificate-authority=/etc/kubernetes/pki/ca.crt --server="https://x.x.x.x:6443" --kubeconfig=$HOME/.kube/kube-dev.config
- –server可以通过
kubectl config view
命令查看集群API地址的 - 这个命令执行后config文件已生成(kube-dev.config)
添加用户信息(user)
# kubectl config set-credentials test --embed-certs=true --client-certificate=test.crt --client-key=test.key --kubeconfig=$HOME/.kube/kube-dev.config
添加上下文信息(context)
# kubectl config set-context devopser --cluster=devopser --namespace=default --user=test --kubeconfig=$HOME/.kube/kube-dev.config
设置当前上下文
# kubectl config use-context devopser --kubeconfig=./kube-dev.config
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* devopser devopser user default
使用上下文测试访问资源
# kubectl get ns --kubeconfig=./kube-dev.config #注意如果授权非default命名空间记得-n
Error from server (Forbidden): namespaces "default" is forbidden: User "mason" cannot get resource "namespaces" in API group "" in the namespace "default" #error报错是user没有集权资源的访问权限,添加role,rolebinding和cluserbinding来赋予权限
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: mason-default-rolebinding
namespace: default
subjects:
- kind: User
name: mason
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io