本地調試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會好理解些,如果有什么意見,建議或者問題,歡迎在評論區給我留言


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM