Kubeconfig介绍

Kubeconfig用于管理访问kube-apiserver的配置信息,同时也支持访问多个kube-apiserver的配置管理。
kubeconfig中存储了集群、用户、命名空间和身份验证信息,在默认情况下,kubeconfig存放在$Home/.kube/config中。
配置如下:

  1. apiVersion: v1
  2. Kind: Config
  3. preferences: {}
  4. # 定义Kubernetes集群信息,例如kube-apiserver的地址及集群的证书信息
  5. clusters:
  6. - cluster:
  7. name: dev
  8. # 定义Kubernetes集群用户身份验证的客户端凭据,例如client-certificate、client-key、token及username/password等。
  9. users:
  10. - name: dev-user
  11. # 定义Kubernetes集群用户信息和命名空间等,用于将请求发送到指定的集群。
  12. contexts:
  13. - context:
  14. name: dev-context

例子:

  1. apiVersion: v1
  2. clusters:
  3. - cluster:
  4. certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRFNE1EY3lOREV5TlRReU5Wb1hEVEk0TURjeU1URXlOVFF5TlZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTFBSCm9JMkZpbHVuTzBNL1R6UXErczdDN1Bud1lGQndQZ3RWWnY4cDBrOUE1akwvVVVrNE4wWitPempPM1Vva2tsMEwKNFRBMExTWEVuMXh2ZXVsUkhZbTNydWdWVjJ4a2hPTEJRUm9DYnRJM3VyZjFteTBnN1dqYzFTaDFZMjZNWkFRcQo1K3M0QUNSbEh2TDZyR3J3TW8vQ3RtSkk1VHNLUy9KK1dSSDRZV0R5Ykd5NG55TmcwTE1xZnFlSG0zSlcxb2c4Cm5yakVqNmw5ck9kczlXWng4YytYdzZYWHJUeXBUY1g1Q3Y1QnFpTEpVZzlUK0V5WWFhSHZxRmx0dkRSbTNid0gKZVpGUVFlbnZvM1RhbU5Od0dUWFUxVG9TY25zQVFrVXlzTjlTcW5SMmQwVmpqS09ZV0czNnVkS1YxdkVIUkhxSgpjLzBHSmZtcmpKTjJnblJadTVjQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFCZHQwQ1Y5aEJxS3doV2ZqR2ZkTVovVmhzR3MKSEh4SjJzOXBvTkFjTlVhdzUrdmkvcXNKVDRZaXRFenNsMnhZU2Y5VmJBL3dZTVBDR3JFWlI3Y2FHdjlRUkRKZAowbENFTmU4dDdvZGNhNk14dnk5cjlkVkl4ZjdWZ2htZml5SFQ1UW5za00rZkEwZmd2ZmVkNWtEZkp3VmkxTmpmClBoZXRGckdTZGRTVWtSSTREdmlOeGJjdmRjMzhiMTcrVFZBWXJ4a2RNTWdMZVVkMmduYmh1NG5ZR1hUMnZzTXAKUDJjQ0xWUnUwVkFVcER0c2Y5TnRqM2pHZ2FSMGxwbXQ2VlJCQlhLeEFYeVhmVGdkSndNR2dYZ01IQnB2OS82LwpFWXB6UCs4MUhvaDdnbitFRVQ3ZHpzRWhIZGc0eTQ3eEprNWNKNHdQS1RVenJFakM1SEVmcklXcGdncz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
  5. server: https://kubernetes.docker.internal:6443
  6. name: docker-desktop
  7. - cluster:
  8. certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01Ea3lNakV6TXpFd04xb1hEVE13TURreU1ERXpNekV3TjFvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTmY3CnRVYnY5d1U2TlpvR210SW1TMmJPaFZ0eUMwUkxXRnhKc0FZZnZwVWVFWSt3KzhLajloSFAxZmxVbFByaXkwNksKZUViSWNORjJVbVp1RnQvTUZsNHBhK2kwdDBYY0JwUlFPc2hQczFrOVlVRkFKa09IR1RYL3lzcFhUS2lmbUt4cwp0c2JweGpRUFk2b09vZ0NGbW9LbDZsTFNtSVIzWjJGS2xBZWtPNldQQTdMUzNoTGZrK0pvMXd0RElnOE5xY2p1ClNkM3pMdlVkMlh5cWlsNlI5ZEJ3eXBOMTBVWG54ZlQwdDlZdkdiZ2ZnalByTkRYdW5JTjF0N0JsbCtqZVNiTlMKdmw0cGxSOW1keHpzV0tzdG1ZUlFSUzU5eGJMVW1IMjNEbXRoSEtWbjlRdmk0RHFwS3hmOHVQNU5mVzVTNHNydwpuOVNlaEl2THJBdU5kdVg3cE9NQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZDTjEyNDczYi9TYTJMcmpYYjI3MXJ2b1dkenJNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBM2tlekhaTmpuWXNxQkdBbjR0MSswWU8xL2VXWTA3cE9DZjhmUExQSVNja3F4Mzc1dwpJemt0bnRGWndHQlowYTkrM0l0ek80OTJwVnA3YzQ0Ymc3ZXVpVmdBNnM2NndOayt4Z3R1Znd0K0hBRStGbFZNCjdSU2ZrR1lyZjgwYTEvbURKanVGbkRXOFpZT1lmcUZrTGRXMG9ZSGR1WWNLa3pFZHZsQUx4c0lxaWtISFFRQzQKRk9zcU9EeWdidmF6U21xZlZpVlFBQmFGR1lHbE9pVUhJR2g2dVE2VHlhQmxCZXVBclFxcHhxS2EwQiswZ1IwcAoraWhUTWVUK0FTZU1ITUV0RldnWVhGdTFxYTV3ZzYvMUZLcEJZWjhSWm9wYkY5SWp2cUUzTnZGc0lwRTBza0xjCjJqMW1VemhsMjZ2Ny81NzJZQzhEODNCWC83RVk0Mm82K1JHSgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
  9. server: https://10.176.122.1:6443
  10. name: kubernetes
  11. contexts:
  12. - context:
  13. cluster: docker-desktop
  14. user: docker-desktop
  15. name: docker-desktop
  16. - context:
  17. cluster: docker-desktop
  18. user: docker-desktop
  19. name: docker-for-desktop
  20. - context:
  21. cluster: kubernetes
  22. user: kylinxiang
  23. name: fudan1
  24. current-context: fudan1
  25. kind: Config
  26. preferences: {}
  27. users:
  28. - name: docker-desktop
  29. user:
  30. client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5RENDQWR5Z0F3SUJBZ0lJTW5zSGR4NHNXdkF3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB4T0RBM01qUXhNalUwTWpWYUZ3MHlNVEEzTWpjd09EUTBNVGRhTURZeApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sc3dHUVlEVlFRREV4SmtiMk5yWlhJdFptOXlMV1JsCmMydDBiM0F3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREhicEVVZWh3YVY3S2EKS2tweFl6SnArRGxHYmxiM1dzSmZOVjhTS29lRUhrRnZGVkN2SFptUkdWRWQ3VWUwQzhkRGRnc1VuaGplUFFoMwpWTXpSem81WkozYW9WcWpSQU9meEMxOWdQcVJJYU1VdmxiWVpzYUVuZCt2cXdJZ0NWbUpmRU1HbFVzYVViT203ClFhMnlZaC9GSVRpN3MxQUJuTldjTE5QVXUwMjlpTHhFMlNjbGpJWWJwYXc5S3BkTElVM29RRzJKSDZYcUFVN0YKNE9abnp1UHF0N241dlN3THM4ZlNmS0Nxa0Z6dTBLaDVxTlBNb3hMbnc3MUZWWDRJbDRCb0I4N3Zia1Bpa2J6cQp6UGYwNDI2TGdZMTZreWlhREc2T1kwcWFpbU85ZlExS2kxa2dwUXh5aUQ1SlkxOFZ2aTA1SkdhNDh0SW9BZWhuCjlDaU9WL3BMQWdNQkFBR2pKekFsTUE0R0ExVWREd0VCL3dRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUYKQlFjREFqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFSUW14VWJWMmU1cE5RTU1nYkpZWVk0VWNGU08rOVJnRAord3RyTnQxdFp0MWlpR2VSMTdKNTcwUkxPYVVGOVdVc3BoLytXQms1Ni9TV3J5dzFoQ2VuQW9XcmUwSXRlTDBxCnA0OHdkWXEvNXpZQ1FlVy9zdW1heEdmVmh4ZnI3enkxTmF1bTdMTDFySEMvcnV3dzVxSnlzMlp0N0VyaVJJamUKY3JIaDZCcmNGRS9YalFRaXM5aHhoaDJEcUozVExhTGthOENCOHBmUWFEd24rR3IxSEorQVJxVXcvWWt2T3dwSQpna0RmWU03Y2pLTmYxV3ErYy9nWVpVZ0ZEaWlNT09FUDkvMTBWekRaa0lJV0R1aGpMLzE5YXNsa1UwSXNYZkJLCmFGb0h5WVkxNlN5c1grektjY3FhNWxzRG0veEczTkVXZlRWQnVuTSs1NWR0UlJRaDMzVzhDdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
  31. client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBeDI2UkZIb2NHbGV5bWlwS2NXTXlhZmc1Um01VzkxckNYelZmRWlxSGhCNUJieFZRCnJ4MlprUmxSSGUxSHRBdkhRM1lMRko0WTNqMElkMVRNMGM2T1dTZDJxRmFvMFFEbjhRdGZZRDZrU0dqRkw1VzIKR2JHaEozZnI2c0NJQWxaaVh4REJwVkxHbEd6cHUwR3RzbUlmeFNFNHU3TlFBWnpWbkN6VDFMdE52WWk4Uk5rbgpKWXlHRzZXc1BTcVhTeUZONkVCdGlSK2w2Z0ZPeGVEbVo4N2o2cmU1K2Iwc0M3UEgwbnlncXBCYzd0Q29lYWpUCnpLTVM1OE85UlZWK0NKZUFhQWZPNzI1RDRwRzg2c3ozOU9OdWk0R05lcE1vbWd4dWptTkttb3BqdlgwTlNvdFoKSUtVTWNvZytTV05mRmI0dE9TUm11UExTS0FIb1ovUW9qbGY2U3dJREFRQUJBb0lCQURJRExVallVb0hjcWtKMQpCcFFtenphNTlBc1FrcWlYVHhVM09pOUJFUmoxeVcwRkNHWFI0M2Y2eEZmZjhGSmJmYzRTSlRjM2FuOFpDUzE3Cnk1MTEwa2JUV2JOZmdCaGh4TWl6RkdqN2JKRm9ETU1oSlRpT1RoNnF1VFAyc21UN3F0R3lUdzJaazRrWFF3b2QKcjJTRHJQbnZtZDJnV3hqOGJxa3FxTGk1ZkFaaWVaWHNvM2FqQlJpN3hYbHBydEd5UzVnNlFjT0oyUllKU0wxbwpRQStHSzFncUpEeFBMWGkrZXZNeWJ3aEx3b2FlUnp5Y3p5THh3NGpNdkEvbnZrck1rODlJam50dWlKUGozTTdmCkFSb1FuMGcwbTRTREpUTlJXS0NPNktxSXAwVUpsa1Ywc1J5ZWxoWFdkMkV1ZU9BVmlFYktiWnhmbGdYRXJsSkoKdnFKY0lPa0NnWUVBM3haNzN0S0lMQ1ZCdE9sNHZCTUZwSjkxL0xHeEZjSXZkejJ2ZktPcmdITFZXMDQ3WThlQQpzRmRoT3dDZ1ZtUE9iQlMrbUxGRnVQaGpGUmVCOTYwRXN3bjlTMUIrYjhmZm1tSy9najl2cThWZ3NIQUtSVWhwCnp1QXNnOXpydTRSZUE0cHJUU2tHaEpNWGh6THl6OGVTZUdXQWtnRVVaM05XRmhkeEpjWXh3eThDZ1lFQTVOcW4KRi9SMXhLWmNSS0ZiVnp2RVNiN1UrSHdvMlRZUkFoZURQcTlmQkhvK2k1M2krNitKdjZaalgyUUVrdUdwOTFCbQpaU3JWYkZaMWNDdmwxdmtwdnFaVGNuQ3NvWjA4V1prOGhGR0lmTjZGM2FtUGd6Qmk3cWVwMmlSamZDbDRGWTZMCnMraUx3QVVBazVRayswM2lUZUJpMnVPK3FteDZpVHJmL1FCV1k2VUNnWUFldnJLRG12QTVaVWtRN2J3OTcwRXYKMXVvajBUbGVqa3lNV212OCtYR0JXbElkSzBMMEZXS2U2dXZ6ZmJxYkxWWWRmeDVsWE1rSEhQUkt5OXFWajdxKwpFZnBlanRGZUJtWENtU2xiZ2ZLWjhiSEpueWRMTlJlZjh6VXZWeHNGMU5CQUhLdDlEdEpmSXdaekU0cHpLRVgvClliMitZWGUyYWliTEZKLzdYTDB1OFFLQmdRRGMwTWozU1M0MDc1d0pzSE5VeVZ0TkdLK2ZqeFZPK0djUzBLTVgKWWRsWmxhWXh5c2NQdUVFK1JZcU9xUS9zdFlidEZZdW5ROXdvSzRnbkVvUXpsN2lhdHh1L1NVNllwZ0ZzSm5vSQo1aTYrNVdyZkJWTnU3c29Xb25vMS9IUnRnZ25YS3ZKTFJpOUp1TW5rbThYUElVZ2hna2VBRXMyTzNScWl2TWNRCjlEbG03UUtCZ0I4VWUxajBEcUNVNGNqSU5HNDFHcTk2R2tzbkFqSHk5MTBOTEtjOEdja2JpN09JangrNWhiTVQKbHNDTXlsQjFYakdsY0wyeFFiVWlZZ2JkcmhseXVhbkp4enhsVmdrd0JmVTJFWS93SnRCSFhMT0Z1NnhYTEFHUwovbXBhVEl3czIvbUk2NHh4djJJc0NRZE1veTNRMWMzaFRMaDc4UExSZlpKK1liR0dUYldnCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
  32. - name: kylinxiang
  33. user:
  34. client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNwakNDQVk0Q0NRRHNLeHBLekFzWEREQU5CZ2txaGtpRzl3MEJBUXNGQURBVk1STXdFUVlEVlFRREV3cHIKZFdKbGNtNWxkR1Z6TUI0WERUSXdNVEV4TURFek1qZ3lNMW9YRFRJek1EZ3dOekV6TWpneU0xb3dGVEVUTUJFRwpBMVVFQXd3S2EzbHNhVzU0YVdGdVp6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFOdUJmdE9UNmtSOWI4ZnFQWldVMXNPY2hKdEt1b2VlWUFiSmpkTFdPd2ZURFhCeWMybVlpV1dEaEhQUHM1NC8KQ0hzY1JoQ1I1TVV3OTFBMnJLTlU2dzRyTnZVVUdPVGJjWjAzRnk5YmpnTTR3U01UcFZDdTM5Q2g2SGVmNDZpNQpJcCt3emZ4cUhZLzlibkNpR2hZZVJzbUd2TkJ6ZUJYcFFucFhLVG85R1M0R3NlOXZzeW5GYi9JeVg1YWJkVXVzClljNnhCV1hSUWFPanlrNnpyU0lmeVI4cktTa0lWK3NDcktQemliYkxSc1c5bnNZVERDcXRlaXZmSU1neDNEb2kKeWxQNVdDWnl6WWw2YjZWc2lyYmVocDRKYnlxRERXQWhFVFRRTW5uNFJDaHFsN0MrZGhsd3VrNW94WHlkNXRUbwprejRBYXVSTHNhSTQvU1hMZVI1VkxEMENBd0VBQVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQTBsdE9oaWdaCmp6NWxzeStCbzhRMXYwSVFER2J2WnhaNUJqL2diVmszSUZscEgyTWpwdVg5bVV4UjRRaFdaSkh1U2VOQjVSajUKMnk1L2Q4aDc4dnJzZ1lNNkU3NkNra0JickZVVFk0bEcraFR0V1BXVEdZeTdDVm5BZkEwQnFNSjRSN3J6cktFOApzdHhkZWNuR25nalJFYm5oWnNZUDNwMGQyY1dtMFEvRjgvWjNYNUZTdFFCTnBFMWxUTVoyUmVRdENYZlV6VmdrCnJoMGwwUlp4U3B1N3IyU01CdS9uV0k4d3RYVlVxT3NwT1MrQ3ppZEhsUWhseXg5WGJNRVF1WkpDWFhNcUdjVjIKSEFIOVY0RmZkb2dXTExBV21YbDhEVzhsNkEwOCtHRm5Oc3JsdkppWmVyMUZodnNXTUZJQS95Ky9hMkJPeVh4VgpwREQxOC9tc0FyRk5iZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
  35. client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBMjRGKzA1UHFSSDF2eCtvOWxaVFd3NXlFbTBxNmg1NWdCc21OMHRZN0I5TU5jSEp6CmFaaUpaWU9FYzgrem5qOElleHhHRUpIa3hURDNVRGFzbzFUckRpczI5UlFZNU50eG5UY1hMMXVPQXpqQkl4T2wKVUs3ZjBLSG9kNS9qcUxraW43RE4vR29kai8xdWNLSWFGaDVHeVlhODBITjRGZWxDZWxjcE9qMFpMZ2F4NzIregpLY1Z2OGpKZmxwdDFTNnhoenJFRlpkRkJvNlBLVHJPdEloL0pIeXNwS1FoWDZ3S3NvL09KdHN0R3hiMmV4aE1NCktxMTZLOThneURIY09pTEtVL2xZSm5MTmlYcHZwV3lLdHQ2R25nbHZLb01OWUNFUk5OQXllZmhFS0dxWHNMNTIKR1hDNlRtakZmSjNtMU9pVFBnQnE1RXV4b2pqOUpjdDVIbFVzUFFJREFRQUJBb0lCQUI0MFVYbFhyekxCZC9JdwpYMDBIOEExMnFpQ2NSZEtIam5zZ25PMVlJVU5RWFZjTnlLZk5INHJpY0FWbm5UVzNRcmwrQ0g0Yk5UbVZKVkxhClV5TWVla0cyM0pjWXJ0dysvZ0UrSldpVTFwUEc2WHlrSldsV3h1RjBoZ0ovODlteHIvdjlYanJQZDBYcS81bHMKRk43YVI2OVBaUWZoKzdJNEtMZWc2c0ZpeXVZME1GNUdQTTN1U2FvclBmc096cTN6V0wxblhtY0JVWUtLQkdZQQp3YTZyeS9RaTl6WEFmVXYyYkhxcGQwQkpkeDV3WHBmWERaQlFtbUhsellyRnVoMXFCS1NmRTRiL2JZcVB6Mm92Cnd6VWZyR05QaERhTUpKSXJvSkNoYzVVeVFEbTdMbDFNaXIybHhJM0ZRMFJqNlZrOU55bnBtSldBaE14N1l4RHgKaXdzdVlWa0NnWUVBOU1Ma1ZoK3cwdVhOUFhtVnRLTmd6ekFEZ0djUnQrNXJMcVJmOXB2bGRrd3pjb2kvc1pzTgpXc2RGYWhSUzRSRXFWbU1PR0ZGZDFwdSt1RFlZa2ZPMkZ0cG9zU3prN3hrMTV1aWI0b2xhd0Q4UStWbTFpSU8wClJoVTB6aWVZb3MvRjRlQ0ZmQzM4VkRkYVEwR0F0a3hGTitNRitidFZjOGFGdExYd0dSb09VaHNDZ1lFQTVaVzcKWFdBUWJHK09Tb2RscDFCbi8yRk04ejRBL0RwUTRaeXJDdG9aaStLY2pQMUtVcm5vcy83cTBhSGgySkNKbWdZVwprZDlobmUyUzA2SDF1VDBOaTBLQVBXMW4wR3BUSUVWaUUyYTRJcmR0NHBocUwrcU9jTHJVanYrWmpybDJVbkZoCnkrMGt2TDRKeEZQSElDWllEN0xZVGxOWGZUOXpCcTZGQlNmVm9JY0NnWUE4MjJSNHdZSnV2Ykt0VVZqV3hEU2kKNzFZL2krRU04WnYyeWVvT1lDN0tuaUhBblozRUpFQkt6UGRHYSswN2h0QVhFS1FGaWQyaUtiRmZEaHhIMWVmMQpnTEs5TXVOdFM4QnFQSFhkK3JiMHkvbUZkamU3ekx0N0hYUzJ1WU9ySDZ3ZEFIMVFKZ0x5VVowQTBmMlYxaHJ6CnpWL0QrejlBL1NCcmtUMDBrSlQwOXdLQmdRRFF0M3NLdkpheHZna2lBRTJOK2k5Um9HZVFpMEhpRERJVHFaWmwKMnpsMlRxSDhHeGxDYy9qMkNqMzRMcTlmYnFkcCt6YnhqcDcwTUZOWFN0cFZlUWVqSHVYdThsTjZ5ZTZnVy9ONQpwOXltMHhOMitSRXdWcEVBTXhtaWx3UkhHSnhVL3ZibHFjWElRUXdvQy9IdmJHeUtlUkRreENlNW1jRTh4ZFB3CmgvSlNhUUtCZ0hoM0NTbEFNMm5mQ1R2eHR6RHNzWkNYT2hTQmdOVCtkUHhuVUhmVEVXaE1KcmV4R05DMHMxREwKb09wam14MUhiSGZIK3lqREpMMDVVY0NDMFZPcjRHVzhSN3MyN05YQysyWEh4TGdxemJubFh4QmlBSmFhamsxSgo0UlVhU2NDdEszWUxSTEIyRUxJdDRmcGxEUTY0WG5nMXNaMDRHOW9JUEF3bXIxVDJKSW9wCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

Kubeconfig读取

  1. package main
  2. import (
  3. "fmt"
  4. "k8s.io/client-go/tools/clientcmd"
  5. )
  6. func main() {
  7. // 读取kubeconfig信息
  8. config, err := clientcmd.BuildConfigFromFlags("", "/Users/xiangqilin/.kube/config")
  9. if err != nil {
  10. panic(err)
  11. }
  12. fmt.Printf("%+v\n", config)
  13. }

kubeconfig管理多个集群信息

Kubeconfig最核心的功能是管理多个集群的配置,并将其合并成同一份,并解决配置冲出。
这个过程由Load函数完成,共分为两步:

  1. 加载kubeconfig配置
  2. 合并多个kubeconfig配置

代码示例:
代码路径:vendor/k8s.io/client-go/tools/clientcmd/loader.go

  1. func (rules *ClientConfigLoadingRules) Load() (*clientcmdapi.Config, error) {
  2. if err := rules.Migrate(); err != nil {
  3. return nil, err
  4. }
  5. errlist := []error{}
  6. missingList := []string{}
  7. kubeConfigFiles := []string{}
  8. // 两种方式获取Kubeconfig,通过显示的文件名(ExplicitPath)和环境变量(KUBECONFIG环境变量,即rules.Precedence)
  9. // Make sure a file we were explicitly told to use exists
  10. if len(rules.ExplicitPath) > 0 {
  11. if _, err := os.Stat(rules.ExplicitPath); os.IsNotExist(err) {
  12. return nil, err
  13. }
  14. kubeConfigFiles = append(kubeConfigFiles, rules.ExplicitPath)
  15. } else {
  16. kubeConfigFiles = append(kubeConfigFiles, rules.Precedence...)
  17. }
  18. // 最终将其都apppend到kubeConfigFiles中
  19. kubeconfigs := []*clientcmdapi.Config{}
  20. // read and cache the config files so that we only look at them once
  21. for _, filename := range kubeConfigFiles {
  22. if len(filename) == 0 {
  23. // no work to do
  24. continue
  25. }
  26. config, err := LoadFromFile(filename) // 通过LoadFromFile读取数据并反序列化到config中
  27. if os.IsNotExist(err) {
  28. // skip missing files
  29. // Add to the missing list to produce a warning
  30. missingList = append(missingList, filename)
  31. continue
  32. }
  33. if err != nil {
  34. errlist = append(errlist, fmt.Errorf("error loading config file \"%s\": %v", filename, err))
  35. continue
  36. }
  37. kubeconfigs = append(kubeconfigs, config)
  38. }
  39. if rules.WarnIfAllMissing && len(missingList) > 0 && len(kubeconfigs) == 0 {
  40. klog.Warningf("Config not found: %s", strings.Join(missingList, ", "))
  41. }
  42. // first merge all of our maps
  43. mapConfig := clientcmdapi.NewConfig()
  44. for _, kubeconfig := range kubeconfigs {
  45. mergo.MergeWithOverwrite(mapConfig, kubeconfig)
  46. }
  47. // merge all of the struct values in the reverse order so that priority is given correctly
  48. // errors are not added to the list the second time
  49. nonMapConfig := clientcmdapi.NewConfig()
  50. for i := len(kubeconfigs) - 1; i >= 0; i-- {
  51. kubeconfig := kubeconfigs[i]
  52. mergo.MergeWithOverwrite(nonMapConfig, kubeconfig)
  53. }
  54. // since values are overwritten, but maps values are not, we can merge the non-map config on top of the map config and
  55. // get the values we expect.
  56. config := clientcmdapi.NewConfig()
  57. mergo.MergeWithOverwrite(config, mapConfig)
  58. mergo.MergeWithOverwrite(config, nonMapConfig)
  59. if rules.ResolvePaths() {
  60. if err := ResolveLocalPaths(config); err != nil {
  61. errlist = append(errlist, err)
  62. }
  63. }
  64. return config, utilerrors.NewAggregate(errlist)
  65. }

代码路径:vendor/k8s.io/client-go/tools/clientcmd/loader.go

  1. // LoadFromFile takes a filename and deserializes the contents into Config object
  2. func LoadFromFile(filename string) (*clientcmdapi.Config, error) {
  3. kubeconfigBytes, err := ioutil.ReadFile(filename)
  4. if err != nil {
  5. return nil, err
  6. }
  7. config, err := Load(kubeconfigBytes) // 通过Load方法反序列化
  8. if err != nil {
  9. return nil, err
  10. }
  11. klog.V(6).Infoln("Config loaded from file: ", filename)
  12. // set LocationOfOrigin on every Cluster, User, and Context
  13. for key, obj := range config.AuthInfos {
  14. obj.LocationOfOrigin = filename
  15. config.AuthInfos[key] = obj
  16. }
  17. for key, obj := range config.Clusters {
  18. obj.LocationOfOrigin = filename
  19. config.Clusters[key] = obj
  20. }
  21. for key, obj := range config.Contexts {
  22. obj.LocationOfOrigin = filename
  23. config.Contexts[key] = obj
  24. }
  25. if config.AuthInfos == nil {
  26. config.AuthInfos = map[string]*clientcmdapi.AuthInfo{}
  27. }
  28. if config.Clusters == nil {
  29. config.Clusters = map[string]*clientcmdapi.Cluster{}
  30. }
  31. if config.Contexts == nil {
  32. config.Contexts = map[string]*clientcmdapi.Context{}
  33. }
  34. return config, nil
  35. }

代码路径:vendor/k8s.io/client-go/tools/clientcmd/loader.go

  1. // Load takes a byte slice and deserializes the contents into Config object.
  2. // Encapsulates deserialization without assuming the source is a file.
  3. func Load(data []byte) (*clientcmdapi.Config, error) {
  4. config := clientcmdapi.NewConfig()
  5. // if there's no data in a file, return the default object instead of failing (DecodeInto reject empty input)
  6. if len(data) == 0 {
  7. return config, nil
  8. }
  9. decoded, _, err := clientcmdlatest.Codec.Decode(data, &schema.GroupVersionKind{Version: clientcmdlatest.Version, Kind: "Config"}, config)
  10. if err != nil {
  11. return nil, err
  12. }
  13. return decoded.(*clientcmdapi.Config), nil
  14. }