天天看点

本地调试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

具体操作

# 下载源码
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"      
# 压缩后复制到window,用zip压缩不会因为解压时候window文件系统不支持链接文件报错
yum install zip -y
zip -r -y kubernetes-1.22.3.zip kubernetes-1.22.3      

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

本地调试kubernetes核心组件apiserver方法记录
[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个文件了

本地调试kubernetes核心组件apiserver方法记录
本地调试kubernetes核心组件apiserver方法记录
# 生成客户端私钥
[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      
本地调试kubernetes核心组件apiserver方法记录
本地调试kubernetes核心组件apiserver方法记录
# 指定新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上下文进行最大权限授权

本地调试kubernetes核心组件apiserver方法记录
kubectl create clusterrolebinding root-cluster-admin-binding --clusterrole=cluster-admin --user=*.wsc.com      

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

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

启动得加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

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

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

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

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

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

继续阅读