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