Kubeconfig介绍
Kubeconfig用于管理访问kube-apiserver的配置信息,同时也支持访问多个kube-apiserver的配置管理。
kubeconfig中存储了集群、用户、命名空间和身份验证信息,在默认情况下,kubeconfig存放在$Home/.kube/config中。
配置如下:
apiVersion: v1
Kind: Config
preferences: {}
# 定义Kubernetes集群信息,例如kube-apiserver的地址及集群的证书信息
clusters:
- cluster:
name: dev
# 定义Kubernetes集群用户身份验证的客户端凭据,例如client-certificate、client-key、token及username/password等。
users:
- name: dev-user
# 定义Kubernetes集群用户信息和命名空间等,用于将请求发送到指定的集群。
contexts:
- context:
name: dev-context
例子:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRFNE1EY3lOREV5TlRReU5Wb1hEVEk0TURjeU1URXlOVFF5TlZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTFBSCm9JMkZpbHVuTzBNL1R6UXErczdDN1Bud1lGQndQZ3RWWnY4cDBrOUE1akwvVVVrNE4wWitPempPM1Vva2tsMEwKNFRBMExTWEVuMXh2ZXVsUkhZbTNydWdWVjJ4a2hPTEJRUm9DYnRJM3VyZjFteTBnN1dqYzFTaDFZMjZNWkFRcQo1K3M0QUNSbEh2TDZyR3J3TW8vQ3RtSkk1VHNLUy9KK1dSSDRZV0R5Ykd5NG55TmcwTE1xZnFlSG0zSlcxb2c4Cm5yakVqNmw5ck9kczlXWng4YytYdzZYWHJUeXBUY1g1Q3Y1QnFpTEpVZzlUK0V5WWFhSHZxRmx0dkRSbTNid0gKZVpGUVFlbnZvM1RhbU5Od0dUWFUxVG9TY25zQVFrVXlzTjlTcW5SMmQwVmpqS09ZV0czNnVkS1YxdkVIUkhxSgpjLzBHSmZtcmpKTjJnblJadTVjQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFCZHQwQ1Y5aEJxS3doV2ZqR2ZkTVovVmhzR3MKSEh4SjJzOXBvTkFjTlVhdzUrdmkvcXNKVDRZaXRFenNsMnhZU2Y5VmJBL3dZTVBDR3JFWlI3Y2FHdjlRUkRKZAowbENFTmU4dDdvZGNhNk14dnk5cjlkVkl4ZjdWZ2htZml5SFQ1UW5za00rZkEwZmd2ZmVkNWtEZkp3VmkxTmpmClBoZXRGckdTZGRTVWtSSTREdmlOeGJjdmRjMzhiMTcrVFZBWXJ4a2RNTWdMZVVkMmduYmh1NG5ZR1hUMnZzTXAKUDJjQ0xWUnUwVkFVcER0c2Y5TnRqM2pHZ2FSMGxwbXQ2VlJCQlhLeEFYeVhmVGdkSndNR2dYZ01IQnB2OS82LwpFWXB6UCs4MUhvaDdnbitFRVQ3ZHpzRWhIZGc0eTQ3eEprNWNKNHdQS1RVenJFakM1SEVmcklXcGdncz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
server: https://kubernetes.docker.internal:6443
name: docker-desktop
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01Ea3lNakV6TXpFd04xb1hEVE13TURreU1ERXpNekV3TjFvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTmY3CnRVYnY5d1U2TlpvR210SW1TMmJPaFZ0eUMwUkxXRnhKc0FZZnZwVWVFWSt3KzhLajloSFAxZmxVbFByaXkwNksKZUViSWNORjJVbVp1RnQvTUZsNHBhK2kwdDBYY0JwUlFPc2hQczFrOVlVRkFKa09IR1RYL3lzcFhUS2lmbUt4cwp0c2JweGpRUFk2b09vZ0NGbW9LbDZsTFNtSVIzWjJGS2xBZWtPNldQQTdMUzNoTGZrK0pvMXd0RElnOE5xY2p1ClNkM3pMdlVkMlh5cWlsNlI5ZEJ3eXBOMTBVWG54ZlQwdDlZdkdiZ2ZnalByTkRYdW5JTjF0N0JsbCtqZVNiTlMKdmw0cGxSOW1keHpzV0tzdG1ZUlFSUzU5eGJMVW1IMjNEbXRoSEtWbjlRdmk0RHFwS3hmOHVQNU5mVzVTNHNydwpuOVNlaEl2THJBdU5kdVg3cE9NQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZDTjEyNDczYi9TYTJMcmpYYjI3MXJ2b1dkenJNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBM2tlekhaTmpuWXNxQkdBbjR0MSswWU8xL2VXWTA3cE9DZjhmUExQSVNja3F4Mzc1dwpJemt0bnRGWndHQlowYTkrM0l0ek80OTJwVnA3YzQ0Ymc3ZXVpVmdBNnM2NndOayt4Z3R1Znd0K0hBRStGbFZNCjdSU2ZrR1lyZjgwYTEvbURKanVGbkRXOFpZT1lmcUZrTGRXMG9ZSGR1WWNLa3pFZHZsQUx4c0lxaWtISFFRQzQKRk9zcU9EeWdidmF6U21xZlZpVlFBQmFGR1lHbE9pVUhJR2g2dVE2VHlhQmxCZXVBclFxcHhxS2EwQiswZ1IwcAoraWhUTWVUK0FTZU1ITUV0RldnWVhGdTFxYTV3ZzYvMUZLcEJZWjhSWm9wYkY5SWp2cUUzTnZGc0lwRTBza0xjCjJqMW1VemhsMjZ2Ny81NzJZQzhEODNCWC83RVk0Mm82K1JHSgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://10.176.122.1:6443
name: kubernetes
contexts:
- context:
cluster: docker-desktop
user: docker-desktop
name: docker-desktop
- context:
cluster: docker-desktop
user: docker-desktop
name: docker-for-desktop
- context:
cluster: kubernetes
user: kylinxiang
name: fudan1
current-context: fudan1
kind: Config
preferences: {}
users:
- name: docker-desktop
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5RENDQWR5Z0F3SUJBZ0lJTW5zSGR4NHNXdkF3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB4T0RBM01qUXhNalUwTWpWYUZ3MHlNVEEzTWpjd09EUTBNVGRhTURZeApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sc3dHUVlEVlFRREV4SmtiMk5yWlhJdFptOXlMV1JsCmMydDBiM0F3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREhicEVVZWh3YVY3S2EKS2tweFl6SnArRGxHYmxiM1dzSmZOVjhTS29lRUhrRnZGVkN2SFptUkdWRWQ3VWUwQzhkRGRnc1VuaGplUFFoMwpWTXpSem81WkozYW9WcWpSQU9meEMxOWdQcVJJYU1VdmxiWVpzYUVuZCt2cXdJZ0NWbUpmRU1HbFVzYVViT203ClFhMnlZaC9GSVRpN3MxQUJuTldjTE5QVXUwMjlpTHhFMlNjbGpJWWJwYXc5S3BkTElVM29RRzJKSDZYcUFVN0YKNE9abnp1UHF0N241dlN3THM4ZlNmS0Nxa0Z6dTBLaDVxTlBNb3hMbnc3MUZWWDRJbDRCb0I4N3Zia1Bpa2J6cQp6UGYwNDI2TGdZMTZreWlhREc2T1kwcWFpbU85ZlExS2kxa2dwUXh5aUQ1SlkxOFZ2aTA1SkdhNDh0SW9BZWhuCjlDaU9WL3BMQWdNQkFBR2pKekFsTUE0R0ExVWREd0VCL3dRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUYKQlFjREFqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFSUW14VWJWMmU1cE5RTU1nYkpZWVk0VWNGU08rOVJnRAord3RyTnQxdFp0MWlpR2VSMTdKNTcwUkxPYVVGOVdVc3BoLytXQms1Ni9TV3J5dzFoQ2VuQW9XcmUwSXRlTDBxCnA0OHdkWXEvNXpZQ1FlVy9zdW1heEdmVmh4ZnI3enkxTmF1bTdMTDFySEMvcnV3dzVxSnlzMlp0N0VyaVJJamUKY3JIaDZCcmNGRS9YalFRaXM5aHhoaDJEcUozVExhTGthOENCOHBmUWFEd24rR3IxSEorQVJxVXcvWWt2T3dwSQpna0RmWU03Y2pLTmYxV3ErYy9nWVpVZ0ZEaWlNT09FUDkvMTBWekRaa0lJV0R1aGpMLzE5YXNsa1UwSXNYZkJLCmFGb0h5WVkxNlN5c1grektjY3FhNWxzRG0veEczTkVXZlRWQnVuTSs1NWR0UlJRaDMzVzhDdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBeDI2UkZIb2NHbGV5bWlwS2NXTXlhZmc1Um01VzkxckNYelZmRWlxSGhCNUJieFZRCnJ4MlprUmxSSGUxSHRBdkhRM1lMRko0WTNqMElkMVRNMGM2T1dTZDJxRmFvMFFEbjhRdGZZRDZrU0dqRkw1VzIKR2JHaEozZnI2c0NJQWxaaVh4REJwVkxHbEd6cHUwR3RzbUlmeFNFNHU3TlFBWnpWbkN6VDFMdE52WWk4Uk5rbgpKWXlHRzZXc1BTcVhTeUZONkVCdGlSK2w2Z0ZPeGVEbVo4N2o2cmU1K2Iwc0M3UEgwbnlncXBCYzd0Q29lYWpUCnpLTVM1OE85UlZWK0NKZUFhQWZPNzI1RDRwRzg2c3ozOU9OdWk0R05lcE1vbWd4dWptTkttb3BqdlgwTlNvdFoKSUtVTWNvZytTV05mRmI0dE9TUm11UExTS0FIb1ovUW9qbGY2U3dJREFRQUJBb0lCQURJRExVallVb0hjcWtKMQpCcFFtenphNTlBc1FrcWlYVHhVM09pOUJFUmoxeVcwRkNHWFI0M2Y2eEZmZjhGSmJmYzRTSlRjM2FuOFpDUzE3Cnk1MTEwa2JUV2JOZmdCaGh4TWl6RkdqN2JKRm9ETU1oSlRpT1RoNnF1VFAyc21UN3F0R3lUdzJaazRrWFF3b2QKcjJTRHJQbnZtZDJnV3hqOGJxa3FxTGk1ZkFaaWVaWHNvM2FqQlJpN3hYbHBydEd5UzVnNlFjT0oyUllKU0wxbwpRQStHSzFncUpEeFBMWGkrZXZNeWJ3aEx3b2FlUnp5Y3p5THh3NGpNdkEvbnZrck1rODlJam50dWlKUGozTTdmCkFSb1FuMGcwbTRTREpUTlJXS0NPNktxSXAwVUpsa1Ywc1J5ZWxoWFdkMkV1ZU9BVmlFYktiWnhmbGdYRXJsSkoKdnFKY0lPa0NnWUVBM3haNzN0S0lMQ1ZCdE9sNHZCTUZwSjkxL0xHeEZjSXZkejJ2ZktPcmdITFZXMDQ3WThlQQpzRmRoT3dDZ1ZtUE9iQlMrbUxGRnVQaGpGUmVCOTYwRXN3bjlTMUIrYjhmZm1tSy9najl2cThWZ3NIQUtSVWhwCnp1QXNnOXpydTRSZUE0cHJUU2tHaEpNWGh6THl6OGVTZUdXQWtnRVVaM05XRmhkeEpjWXh3eThDZ1lFQTVOcW4KRi9SMXhLWmNSS0ZiVnp2RVNiN1UrSHdvMlRZUkFoZURQcTlmQkhvK2k1M2krNitKdjZaalgyUUVrdUdwOTFCbQpaU3JWYkZaMWNDdmwxdmtwdnFaVGNuQ3NvWjA4V1prOGhGR0lmTjZGM2FtUGd6Qmk3cWVwMmlSamZDbDRGWTZMCnMraUx3QVVBazVRayswM2lUZUJpMnVPK3FteDZpVHJmL1FCV1k2VUNnWUFldnJLRG12QTVaVWtRN2J3OTcwRXYKMXVvajBUbGVqa3lNV212OCtYR0JXbElkSzBMMEZXS2U2dXZ6ZmJxYkxWWWRmeDVsWE1rSEhQUkt5OXFWajdxKwpFZnBlanRGZUJtWENtU2xiZ2ZLWjhiSEpueWRMTlJlZjh6VXZWeHNGMU5CQUhLdDlEdEpmSXdaekU0cHpLRVgvClliMitZWGUyYWliTEZKLzdYTDB1OFFLQmdRRGMwTWozU1M0MDc1d0pzSE5VeVZ0TkdLK2ZqeFZPK0djUzBLTVgKWWRsWmxhWXh5c2NQdUVFK1JZcU9xUS9zdFlidEZZdW5ROXdvSzRnbkVvUXpsN2lhdHh1L1NVNllwZ0ZzSm5vSQo1aTYrNVdyZkJWTnU3c29Xb25vMS9IUnRnZ25YS3ZKTFJpOUp1TW5rbThYUElVZ2hna2VBRXMyTzNScWl2TWNRCjlEbG03UUtCZ0I4VWUxajBEcUNVNGNqSU5HNDFHcTk2R2tzbkFqSHk5MTBOTEtjOEdja2JpN09JangrNWhiTVQKbHNDTXlsQjFYakdsY0wyeFFiVWlZZ2JkcmhseXVhbkp4enhsVmdrd0JmVTJFWS93SnRCSFhMT0Z1NnhYTEFHUwovbXBhVEl3czIvbUk2NHh4djJJc0NRZE1veTNRMWMzaFRMaDc4UExSZlpKK1liR0dUYldnCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
- name: kylinxiang
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNwakNDQVk0Q0NRRHNLeHBLekFzWEREQU5CZ2txaGtpRzl3MEJBUXNGQURBVk1STXdFUVlEVlFRREV3cHIKZFdKbGNtNWxkR1Z6TUI0WERUSXdNVEV4TURFek1qZ3lNMW9YRFRJek1EZ3dOekV6TWpneU0xb3dGVEVUTUJFRwpBMVVFQXd3S2EzbHNhVzU0YVdGdVp6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFOdUJmdE9UNmtSOWI4ZnFQWldVMXNPY2hKdEt1b2VlWUFiSmpkTFdPd2ZURFhCeWMybVlpV1dEaEhQUHM1NC8KQ0hzY1JoQ1I1TVV3OTFBMnJLTlU2dzRyTnZVVUdPVGJjWjAzRnk5YmpnTTR3U01UcFZDdTM5Q2g2SGVmNDZpNQpJcCt3emZ4cUhZLzlibkNpR2hZZVJzbUd2TkJ6ZUJYcFFucFhLVG85R1M0R3NlOXZzeW5GYi9JeVg1YWJkVXVzClljNnhCV1hSUWFPanlrNnpyU0lmeVI4cktTa0lWK3NDcktQemliYkxSc1c5bnNZVERDcXRlaXZmSU1neDNEb2kKeWxQNVdDWnl6WWw2YjZWc2lyYmVocDRKYnlxRERXQWhFVFRRTW5uNFJDaHFsN0MrZGhsd3VrNW94WHlkNXRUbwprejRBYXVSTHNhSTQvU1hMZVI1VkxEMENBd0VBQVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQTBsdE9oaWdaCmp6NWxzeStCbzhRMXYwSVFER2J2WnhaNUJqL2diVmszSUZscEgyTWpwdVg5bVV4UjRRaFdaSkh1U2VOQjVSajUKMnk1L2Q4aDc4dnJzZ1lNNkU3NkNra0JickZVVFk0bEcraFR0V1BXVEdZeTdDVm5BZkEwQnFNSjRSN3J6cktFOApzdHhkZWNuR25nalJFYm5oWnNZUDNwMGQyY1dtMFEvRjgvWjNYNUZTdFFCTnBFMWxUTVoyUmVRdENYZlV6VmdrCnJoMGwwUlp4U3B1N3IyU01CdS9uV0k4d3RYVlVxT3NwT1MrQ3ppZEhsUWhseXg5WGJNRVF1WkpDWFhNcUdjVjIKSEFIOVY0RmZkb2dXTExBV21YbDhEVzhsNkEwOCtHRm5Oc3JsdkppWmVyMUZodnNXTUZJQS95Ky9hMkJPeVh4VgpwREQxOC9tc0FyRk5iZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBMjRGKzA1UHFSSDF2eCtvOWxaVFd3NXlFbTBxNmg1NWdCc21OMHRZN0I5TU5jSEp6CmFaaUpaWU9FYzgrem5qOElleHhHRUpIa3hURDNVRGFzbzFUckRpczI5UlFZNU50eG5UY1hMMXVPQXpqQkl4T2wKVUs3ZjBLSG9kNS9qcUxraW43RE4vR29kai8xdWNLSWFGaDVHeVlhODBITjRGZWxDZWxjcE9qMFpMZ2F4NzIregpLY1Z2OGpKZmxwdDFTNnhoenJFRlpkRkJvNlBLVHJPdEloL0pIeXNwS1FoWDZ3S3NvL09KdHN0R3hiMmV4aE1NCktxMTZLOThneURIY09pTEtVL2xZSm5MTmlYcHZwV3lLdHQ2R25nbHZLb01OWUNFUk5OQXllZmhFS0dxWHNMNTIKR1hDNlRtakZmSjNtMU9pVFBnQnE1RXV4b2pqOUpjdDVIbFVzUFFJREFRQUJBb0lCQUI0MFVYbFhyekxCZC9JdwpYMDBIOEExMnFpQ2NSZEtIam5zZ25PMVlJVU5RWFZjTnlLZk5INHJpY0FWbm5UVzNRcmwrQ0g0Yk5UbVZKVkxhClV5TWVla0cyM0pjWXJ0dysvZ0UrSldpVTFwUEc2WHlrSldsV3h1RjBoZ0ovODlteHIvdjlYanJQZDBYcS81bHMKRk43YVI2OVBaUWZoKzdJNEtMZWc2c0ZpeXVZME1GNUdQTTN1U2FvclBmc096cTN6V0wxblhtY0JVWUtLQkdZQQp3YTZyeS9RaTl6WEFmVXYyYkhxcGQwQkpkeDV3WHBmWERaQlFtbUhsellyRnVoMXFCS1NmRTRiL2JZcVB6Mm92Cnd6VWZyR05QaERhTUpKSXJvSkNoYzVVeVFEbTdMbDFNaXIybHhJM0ZRMFJqNlZrOU55bnBtSldBaE14N1l4RHgKaXdzdVlWa0NnWUVBOU1Ma1ZoK3cwdVhOUFhtVnRLTmd6ekFEZ0djUnQrNXJMcVJmOXB2bGRrd3pjb2kvc1pzTgpXc2RGYWhSUzRSRXFWbU1PR0ZGZDFwdSt1RFlZa2ZPMkZ0cG9zU3prN3hrMTV1aWI0b2xhd0Q4UStWbTFpSU8wClJoVTB6aWVZb3MvRjRlQ0ZmQzM4VkRkYVEwR0F0a3hGTitNRitidFZjOGFGdExYd0dSb09VaHNDZ1lFQTVaVzcKWFdBUWJHK09Tb2RscDFCbi8yRk04ejRBL0RwUTRaeXJDdG9aaStLY2pQMUtVcm5vcy83cTBhSGgySkNKbWdZVwprZDlobmUyUzA2SDF1VDBOaTBLQVBXMW4wR3BUSUVWaUUyYTRJcmR0NHBocUwrcU9jTHJVanYrWmpybDJVbkZoCnkrMGt2TDRKeEZQSElDWllEN0xZVGxOWGZUOXpCcTZGQlNmVm9JY0NnWUE4MjJSNHdZSnV2Ykt0VVZqV3hEU2kKNzFZL2krRU04WnYyeWVvT1lDN0tuaUhBblozRUpFQkt6UGRHYSswN2h0QVhFS1FGaWQyaUtiRmZEaHhIMWVmMQpnTEs5TXVOdFM4QnFQSFhkK3JiMHkvbUZkamU3ekx0N0hYUzJ1WU9ySDZ3ZEFIMVFKZ0x5VVowQTBmMlYxaHJ6CnpWL0QrejlBL1NCcmtUMDBrSlQwOXdLQmdRRFF0M3NLdkpheHZna2lBRTJOK2k5Um9HZVFpMEhpRERJVHFaWmwKMnpsMlRxSDhHeGxDYy9qMkNqMzRMcTlmYnFkcCt6YnhqcDcwTUZOWFN0cFZlUWVqSHVYdThsTjZ5ZTZnVy9ONQpwOXltMHhOMitSRXdWcEVBTXhtaWx3UkhHSnhVL3ZibHFjWElRUXdvQy9IdmJHeUtlUkRreENlNW1jRTh4ZFB3CmgvSlNhUUtCZ0hoM0NTbEFNMm5mQ1R2eHR6RHNzWkNYT2hTQmdOVCtkUHhuVUhmVEVXaE1KcmV4R05DMHMxREwKb09wam14MUhiSGZIK3lqREpMMDVVY0NDMFZPcjRHVzhSN3MyN05YQysyWEh4TGdxemJubFh4QmlBSmFhamsxSgo0UlVhU2NDdEszWUxSTEIyRUxJdDRmcGxEUTY0WG5nMXNaMDRHOW9JUEF3bXIxVDJKSW9wCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
Kubeconfig读取
package main
import (
"fmt"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
// 读取kubeconfig信息
config, err := clientcmd.BuildConfigFromFlags("", "/Users/xiangqilin/.kube/config")
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", config)
}
kubeconfig管理多个集群信息
Kubeconfig最核心的功能是管理多个集群的配置,并将其合并成同一份,并解决配置冲出。
这个过程由Load函数完成,共分为两步:
- 加载kubeconfig配置
- 合并多个kubeconfig配置
代码示例:
代码路径:vendor/k8s.io/client-go/tools/clientcmd/loader.go
func (rules *ClientConfigLoadingRules) Load() (*clientcmdapi.Config, error) {
if err := rules.Migrate(); err != nil {
return nil, err
}
errlist := []error{}
missingList := []string{}
kubeConfigFiles := []string{}
// 两种方式获取Kubeconfig,通过显示的文件名(ExplicitPath)和环境变量(KUBECONFIG环境变量,即rules.Precedence)
// Make sure a file we were explicitly told to use exists
if len(rules.ExplicitPath) > 0 {
if _, err := os.Stat(rules.ExplicitPath); os.IsNotExist(err) {
return nil, err
}
kubeConfigFiles = append(kubeConfigFiles, rules.ExplicitPath)
} else {
kubeConfigFiles = append(kubeConfigFiles, rules.Precedence...)
}
// 最终将其都apppend到kubeConfigFiles中
kubeconfigs := []*clientcmdapi.Config{}
// read and cache the config files so that we only look at them once
for _, filename := range kubeConfigFiles {
if len(filename) == 0 {
// no work to do
continue
}
config, err := LoadFromFile(filename) // 通过LoadFromFile读取数据并反序列化到config中
if os.IsNotExist(err) {
// skip missing files
// Add to the missing list to produce a warning
missingList = append(missingList, filename)
continue
}
if err != nil {
errlist = append(errlist, fmt.Errorf("error loading config file \"%s\": %v", filename, err))
continue
}
kubeconfigs = append(kubeconfigs, config)
}
if rules.WarnIfAllMissing && len(missingList) > 0 && len(kubeconfigs) == 0 {
klog.Warningf("Config not found: %s", strings.Join(missingList, ", "))
}
// first merge all of our maps
mapConfig := clientcmdapi.NewConfig()
for _, kubeconfig := range kubeconfigs {
mergo.MergeWithOverwrite(mapConfig, kubeconfig)
}
// merge all of the struct values in the reverse order so that priority is given correctly
// errors are not added to the list the second time
nonMapConfig := clientcmdapi.NewConfig()
for i := len(kubeconfigs) - 1; i >= 0; i-- {
kubeconfig := kubeconfigs[i]
mergo.MergeWithOverwrite(nonMapConfig, kubeconfig)
}
// since values are overwritten, but maps values are not, we can merge the non-map config on top of the map config and
// get the values we expect.
config := clientcmdapi.NewConfig()
mergo.MergeWithOverwrite(config, mapConfig)
mergo.MergeWithOverwrite(config, nonMapConfig)
if rules.ResolvePaths() {
if err := ResolveLocalPaths(config); err != nil {
errlist = append(errlist, err)
}
}
return config, utilerrors.NewAggregate(errlist)
}
代码路径:vendor/k8s.io/client-go/tools/clientcmd/loader.go
// LoadFromFile takes a filename and deserializes the contents into Config object
func LoadFromFile(filename string) (*clientcmdapi.Config, error) {
kubeconfigBytes, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
config, err := Load(kubeconfigBytes) // 通过Load方法反序列化
if err != nil {
return nil, err
}
klog.V(6).Infoln("Config loaded from file: ", filename)
// set LocationOfOrigin on every Cluster, User, and Context
for key, obj := range config.AuthInfos {
obj.LocationOfOrigin = filename
config.AuthInfos[key] = obj
}
for key, obj := range config.Clusters {
obj.LocationOfOrigin = filename
config.Clusters[key] = obj
}
for key, obj := range config.Contexts {
obj.LocationOfOrigin = filename
config.Contexts[key] = obj
}
if config.AuthInfos == nil {
config.AuthInfos = map[string]*clientcmdapi.AuthInfo{}
}
if config.Clusters == nil {
config.Clusters = map[string]*clientcmdapi.Cluster{}
}
if config.Contexts == nil {
config.Contexts = map[string]*clientcmdapi.Context{}
}
return config, nil
}
代码路径:vendor/k8s.io/client-go/tools/clientcmd/loader.go
// Load takes a byte slice and deserializes the contents into Config object.
// Encapsulates deserialization without assuming the source is a file.
func Load(data []byte) (*clientcmdapi.Config, error) {
config := clientcmdapi.NewConfig()
// if there's no data in a file, return the default object instead of failing (DecodeInto reject empty input)
if len(data) == 0 {
return config, nil
}
decoded, _, err := clientcmdlatest.Codec.Decode(data, &schema.GroupVersionKind{Version: clientcmdlatest.Version, Kind: "Config"}, config)
if err != nil {
return nil, err
}
return decoded.(*clientcmdapi.Config), nil
}