本地调试kubernetes核心组件apiserver方法记录

前提

1、虚拟机中已经用kubeadm搭建了一套k8s集群

操作步骤概括

1、linux上下载发布版本的源码包进行编译,在linux上编译主要是window上编译有几个链接文件在windows文件系统失效导致不能编译,编译的原因则是直接跑github上源码会有个GetOpenAPIDefinitions函数不存在,需要make编译生成

2、将linux上文件目录复制到window

3、通过ca证书签发本地apiserver使用证书

4、生成连接本地apiserver的kubeconfig

5、debug模式通过goland启动apiserver,配置直接连接linux上的kubernetes集群etcd

6、通过kubectl或者本地的client-go调用本地apiserver

 

具体操作

1、linux上下载发布版本的源码包进行编译,在linux上编译主要是window上编译有几个链接文件在windows文件系统失效导致不能编译,编译的原因则是直接跑github上源码会有个GetOpenAPIDefinitions函数不存在,需要make编译生成

# 下载源码
wget
https://github.91chifun.workers.dev/https://github.com//kubernetes/kubernetes/archive/refs/tags/v1.22.3.tar.gz # 解压 tar xvf v1.22.3.tar.gz # 编译 cd kubernetes-1.22.3/ KUBE_BUILD_PLATFORMS=linux/amd64 make all GOFLAGS=-v GOGCFLAGS="-N -l"

 

2、将linux上文件目录复制到window

# 压缩后复制到window,用zip压缩不会因为解压时候window文件系统不支持链接文件报错
yum
install zip -y zip -r -y kubernetes-1.22.3.zip kubernetes-1.22.3

 

3、通过ca证书签发本地apiserver使用证书

 kubeadm生成的证书都在/etc/kubernetes/pki这边直接使用相同的ca证书

 

 

 

[root@1-4 ~]# mkdir tmpdir
[root@1-4 ~]# cd tmpdir/

# 这边生成了私钥 [root@1-4 tmpdir]# openssl genrsa -out server.key 2048 Generating RSA private key, 2048 bit long modulus ................................+++ ....................................+++ e is 65537 (0x10001)

# 这边生成了证书申请文件 go 1.5以后要用san证书,否则会报错。CN=后面用自己的CN名称,一般是域名 [root@
1-4 tmpdir]# openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/CN=*.wsc.com" -out server.csr Generating a 2048 bit RSA private key .......................................................................................................................................................................................................+++ ..........................+++ writing new private key to 'server.key' -----
# 这边通过ca审批通过之前的证书申请server.csr生成了server.crt
[root@1-4 tmpdir]# openssl x509 -req -extfile <(printf "subjectAltName=DNS:wsc.com,DNS:www.wsc.com") -days 365 -in server.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out server.crt Signature ok subject=/CN=*.wsc.com Getting CA Private Key

此时已经有3个文件了

 

 

 

4、生成连接本地apiserver的kubeconfig

 

 

 

# 生成客户端私钥
[root@1-4 tmpdir]# openssl genrsa -out client.key 2048 Generating RSA private key, 2048 bit long modulus ........................................+++ ..+++ e is 65537 (0x10001)
# 这里生成了证书申请,CN名称要和前面服务端一致 [root@
1-4 tmpdir]# openssl req -new -sha256 -key client.key -subj "/CN=*.wsc.com" -reqexts SAN -extensions SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:wsc.com,DNS:www.wsc.com")) -out client.csr # 这里通过上一步ca的公钥私钥审核通过了上一步生成的证书申请csr文件,生成了crt证书
[root@
1-4 tmpdir]# openssl x509 -req -in client.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out client.crt -days 5000 Signature ok subject=/CN=*.wsc.com Getting CA Private Key [root@1-4 tmpdir]# ls client.crt client.csr client.key server.crt server.csr server.key [root@1-4 tmpdir]#

这边生成证书申请的时候,指定/etc/pki/tls/openssl.cnf位置不一定和我机子一样,可以通过以下命令查看

openssl version -a|grep OPENSSLDIR

 

 

5、debug模式通过goland启动apiserver,配置直接连接linux上的kubernetes集群etcd

 

# 指定新KUBECONFIG生成的路径和名称
[root@1-4 tmpdir]# export KUBECONFIG=`pwd`/myadmin.conf
# 指定apiserver连接地址,这边要用前面证书生成的CN域名 [root@
1-4 tmpdir]# kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://wsc.com:6443 W1029 22:38:31.489220 11658 loader.go:221] Config not found: /root/tmpdir/myadmin.conf W1029 22:38:31.489444 11658 loader.go:221] Config not found: /root/tmpdir/myadmin.conf Cluster "kubernetes" set.
# 指定用户 [root@
1-4 tmpdir]# kubectl config set-credentials wsc --client-certificate=client.crt --client-key=client.key --embed-certs=true User "wsc" set.
# 指定集群上下文名称 [root@
1-4 tmpdir]# kubectl config set-context wsc --cluster=kubernetes --user=wsc Context "wsc" created.
# 查看上下文 [root@
1-4 tmpdir]# kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE wsc kubernetes wsc
# 设置使用的上下文 [root@
1-4 tmpdir]# kubectl config use-context wsc Switched to context "wsc".

 这样wsc用户使用的KUBECONFIG就生成了,但是还需要授权

这边直接用原先的KUBECONFIG上下文进行最大权限授权

kubectl create clusterrolebinding root-cluster-admin-binding --clusterrole=cluster-admin --user=*.wsc.com

 

6、通过kubectl或者本地的client-go调用本地apiserver

然后启动apiserver,我是直接参考了kubeadm原先的启动配置,配置位置/etc/kubernetes/manifests/kube-apiserver.yaml 

 

 

启动得加cmd参数,这里附上我的参数主要是最下面两行,apiserver的证书要替换成前面生成的服务端证书,其他配置都是替换下证书的位置,和linux集群上的一样

--advertise-address=192.168.137.14
--allow-privileged=true
--authorization-mode=Node,RBAC
--client-ca-file=D:\06_mnt\kubernetes\pki\ca.crt
--enable-admission-plugins=NodeRestriction
--enable-bootstrap-token-auth=true
--etcd-cafile=D:\06_mnt\kubernetes\pki\etcd\ca.crt
--etcd-certfile=D:\06_mnt\kubernetes\pki\apiserver-etcd-client.crt
--etcd-keyfile=D:\06_mnt\kubernetes\pki\apiserver-etcd-client.key
--etcd-servers=https://192.168.137.14:2379
--insecure-port=0
--kubelet-client-certificate=D:\06_mnt\kubernetes\pki\apiserver-kubelet-client.crt
--kubelet-client-key=D:\06_mnt\kubernetes\pki\apiserver-kubelet-client.key
--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
--proxy-client-cert-file=D:\06_mnt\kubernetes\pki\front-proxy-client.crt
--proxy-client-key-file=D:\06_mnt\kubernetes\pki\front-proxy-client.key
--requestheader-allowed-names=front-proxy-client
--requestheader-client-ca-file=D:\06_mnt\kubernetes\pki\front-proxy-ca.crt
--requestheader-extra-headers-prefix=X-Remote-Extra-
--requestheader-group-headers=X-Remote-Group
--requestheader-username-headers=X-Remote-User
--secure-port=6443
--service-account-issuer=https://kubernetes.default.svc.cluster.local
--service-account-key-file=D:\06_mnt\kubernetes\pki\sa.pub
--service-account-signing-key-file=D:\06_mnt\kubernetes\pki\sa.key
--service-cluster-ip-range=10.96.0.0/12
--tls-cert-file=D:\06_mnt\tmpdir\server.crt
--tls-private-key-file=D:\06_mnt\tmpdir\server.key

这样服务端就能启动了

客户端连接的话就是两点

(1)是使用前面生成的KUBECONFIG

(2)是使用KUBECONFIG的HOSTS加上域名解析,注意由于是本地跑apiserver所以域名解析应该是本地的ip

 

 window上执行如下命令,可以看到客户端可以顺利的请求到windows本地的apiserver,而且apiserver返回的数据和linux集群上一致

 

最后附上一张本地成功打断点的图

 

 

个人觉得看源码的时候能debug会好理解些,如果有什么意见,建议或者问题,欢迎在评论区给我留言

posted @ 2021-10-30 00:28  边走边摇  阅读(425)  评论(0编辑  收藏  举报