参考文档:https://zhaohuabing.com/post/2020-05-19-k8s-certificate/

用于配置集群访问信息的文件叫作 kubeconfig 文件,在开启了 TLS 的集群中,每次与集群交互时都需要身份认证,生产环境一般使用证书进行认证,其认证所需要的信息会放在 kubeconfig 文件中。此外,k8s 的组件都可以使用 kubeconfig 连接 apiserver,client-go 、operator、helm 等其他组件也使用 kubeconfig 访问 apiserver

一、kubeconfig配置文件示例

  1. apiVersion: v1
  2. clusters:
  3. - cluster:
  4. certificate-authority-data: xxx
  5. server: https://192.168.0.126:6443
  6. name: cluster-1
  7. - cluster:
  8. certificate-authority-data: xxx
  9. server: https://192.168.0.126:6443
  10. name: cluster-2
  11. contexts:
  12. - context:
  13. cluster: cluster-1
  14. user: admin
  15. name: cluster-context-1
  16. - context:
  17. cluster: cluster-2
  18. user: admin
  19. name: cluster-context-2
  20. current-context: cluster-context-1
  21. kind: Config
  22. preferences: {}
  23. users:
  24. - name: admin
  25. user:
  26. client-certificate-data: xxx
  27. client-key-data: xxx

apiVersion 和 kind 标识客户端解析器的版本和模式,不应手动编辑。 preferences 指定可选(和当前未使用)的 kubectl 首选项。

1、clusters模块

cluster中包含 kubernetes 集群的端点数据,包括 kubernetes apiserver 的完整 url 以及集群的公钥。
可以使用 kubectl config set-cluster 添加或修改 cluster 条目。

2、users 模块

user 定义用于向 kubernetes 集群进行身份验证的客户端凭据。
可用凭证有 client-certificate、client-key、token 和 username/password
username/passwordtoken 是二者只能选择一个,但 client-certificateclient-key 可以分别与它们组合。
可以使用 kubectl config set-credentials 添加或者修改 user 条目。

3、contexts 模块

context 定义了一个命名的cluster、user、namespace元组,用于使用提供的认证信息和命名空间将请求发送到指定的集群。
三个都是可选的,仅使用 cluster、user、namespace 之一指定上下文,或指定none
未指定的值或在加载的 kubeconfig 中没有相应条目的命名值将被替换为默认值。
加载和合并 kubeconfig 文件的规则很简单,但有很多,具体可以查看加载和合并kubeconfig规则
可以使用kubectl config set-context添加或修改上下文条目。

4、current-context 模块

current-context 是作为cluster、user、namespace元组的 key,
当 kubectl 从该文件中加载配置的时候会被默认使用。
可以在 kubectl 命令行里覆盖这些值,通过分别传入--context=CONTEXT、--cluster=CLUSTER、--user=USER 和 --namespace=NAMESPACE
以上示例中若不指定 context 则默认使用 cluster-context-1。

kubectl  get node --kubeconfig=./kubeconfig --context=cluster2-context

可以使用 kubectl config use-context 更改 current-context。

二、kubectl生成kubeconfig示例

export KUBE_APISERVER="https://192.168.0.126:6443"
# 设置集群参数
kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER}

# 设置客户端认证参数
kubectl config set-credentials admin \
  --client-certificate=/etc/kubernetes/ssl/admin.pem \
  --embed-certs=true \
  --client-key=/etc/kubernetes/ssl/admin-key.pem

# 设置上下文参数
kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=admin

# 设置默认上下文
kubectl config use-context kubernetes

生成的 kubeconfig 被保存到 /root/.kube/config

1、集群参数

本段设置了所需要访问的集群的信息。使用set-cluster设置了需要访问的集群,如上为kubernetes,这只是个名称,实际为—server指向的apiserver;—certificate-authority设置了该集群的公钥;—embed-certs为true表示将—certificate-authority证书写入到kubeconfig中;—server则表示该集群的kube-apiserver地址

2、用户参数

本段主要设置用户的相关信息,主要是用户证书。如上的用户名为admin,证书为:/etc/kubernetes/ssl/admin.pem,私钥为:/etc/kubernetes/ssl/admin-key.pem。注意客户端的证书首先要经过集群CA的签署,否则不会被集群认可。此处使用的是ca认证方式,也可以使用token认证,如kubelet的 TLS Boostrap机制下的bootstrapping使用的就是token认证方式。上述kubectl使用的是ca认证,不需要token字段

3、上下文参数

集群参数用户参数可以同时设置多对,在上下文参数中将集群参数用户参数关联起来。上面的上下文名称为kubenetes,集群为kubenetes,用户为admin,表示使用admin的用户凭证来访问kubenetes集群的default命名空间,也可以增加—namspace来指定访问的命名空间。

4、设置默认上下文

最后使用kubectl config use-context kubernetes来使用名为kubenetes的环境项来作为配置。如果配置了多个环境项,可以通过切换不同的环境项名字来访问到不同的集群环境。

生成的kubeconfig文件

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM2VENDQWRHZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQ0FYRFRJeE1EWXhOVEV5TXpreU5Gb1lEekl4TWpFd05USXlNVEl6T1RJMFdqQVZNUk13RVFZRApWUVFERXdwcmRXSmxjbTVsZEdWek1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCnF2T1N5WncyaUtSWWJ6eFZ4N1ZWNUdTRjErSTFNNzBYWUlwRFExRVlSVVhLNWkyc1orWDgyZWNTYnM2NjdEdzYKVHM0TWxFSVlPMTh5WG1RKzZ2MVlZSWs2RlQ5RGpwRjJYZWFmY2RNQTQ1WkwyYU15S1V4TEhzWmVKQjZjOTczWgpXZ2RFeTdDbHBHcHk2cEsrOXhsT0VSOVV2ZkdtNWdZbUZuKzRMcGJNVTFQQjJxVXBaMFlVaWUzbEdCZ0NRenlSCjJBQjF3Sm56d1FxZEhBM2Z5OEI4RkFNeDJiU1NoeGpWNGFwV1ZhbWJhVi9xemkvd0tyWEdUZFViWFBTakpDNUMKUzFZejBmS3ZTcVMvck1uR1JhcmlkYU00VWR3UGh4QUJDMW42QStWYUtBa3VZNjB5OUtWaTRhODVVcHdWUUtESApOS3VHdWRZQ000SkZyZmN2b3MxWjV3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQXFRd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVV3YXowTEFIQVVPamwvUGZ0L2YxY1RxMUh6Qjh3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dFQkFGM2RTQWJKaTdBcVJjMGdvcFhGd2xWd0xXMjNjVmhnb3lad0s1MFBrdWkzdnIzVApLbDZNMkRFUjk3RXhqU1pHRE5BMzkwZmRHUVV5MTNjWUNYdVdJeXE5T3ZpVmsxYS9UVmszN2I0a1hTYmlkL1ZWCnViWkJybEFPczVDbnBTL3dGQ0l2NUp3dHY2RHdpa2p2ejVzUDhsRWN5VHFsRWx2TmREa3dmOUpsSTh0OUFIalAKMVk1Vm4va24rZDlUWXJFMFN2ZWlLYVp2M0tGTmdsUWZrdkJ0R0V5OFhzdk9UdE9FNmN5TmNMZ2FuT3hXK3k5RgpNZkdpOVE0ZmFtT25EMGlYdCtTSWZmSktxNk1LdnRBL3R6QmNHZnVyVXdhaW5TZTNkUFhyQm1tb3NyaEdoeHI1ClB1ZVZHTnlJRGo4enFiV2ozU2dtK3M0ZGozVGR2Y1NtN2hRNjRRST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    server: https://192.168.0.190:6443
  name: cluster-a5455b2a-73c8-4db1-8915-7ac9431d938d
contexts:
- context:
    cluster: cluster-a5455b2a-73c8-4db1-8915-7ac9431d938d
    user: admin-a5455b2a-73c8-4db1-8915-7ac9431d938d
  name: context-a5455b2a-73c8-4db1-8915-7ac9431d938d
current-context: context-a5455b2a-73c8-4db1-8915-7ac9431d938d
kind: Config
preferences: {}
users:
- name: admin-a5455b2a-73c8-4db1-8915-7ac9431d938d
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURDakNDQWZLZ0F3SUJBZ0lJSEl4emtQQUtvTnd3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWdGdzB5TVRBMk1UVXhNak01TWpSYUdBOHlNVEl4TURVeU1qRXlNemt5TkZvdwpLVEVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhEakFNQmdOVkJBTVRCV0ZrYldsdU1JSUJJakFOCkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXZuMytHKzgzcUpEQ1NmZTVDcUp2ZDNUNDFad2MKeTg1VVBiMTVYa0tKalduWndOVVZCeWhoOHd6Zm9jZXhoWUM3L2RmUG5DNmRHL2dYcW9Xb09QODN6VjJ3d3BMRgp3U0RZdlcvQkZYN3R0Y0J3WW5FSFNneEJVM2pSbXZQS3duZG1CZi90RTRGbjVTUlJkK05nbm5VSlNNdlo1T0h2CjhjY3ZhUGhoM21JZUhJdndVT0xvK0k1MmRGMXdCU2pBLzJyMDIvZ1h0NlBwQkNWNU1Ubnc3bUVDZC9CSENxRnkKYk55Y0dPMUdiU1VGaEhxVjNYWVp4UG5TYkVTTkhsQmZFNThvL25Ndmh6amtrTnpDcW1UL1duUmdOSklVRUk2QwpONXhqamdvcU5rOGk3QVREK1NlUVAxRDIvR1MxbUNZRzQyR0s4WUdYNldINUN3YkE1VXIvd25HNzdRSURBUUFCCm8wZ3dSakFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUhBd0l3SHdZRFZSMGoKQkJnd0ZvQVV3YXowTEFIQVVPamwvUGZ0L2YxY1RxMUh6Qjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUlFaApFWmdrbHd4OGdGbHNYN3lUYlRzajBqRUYrS0tqKzlxT1NHK2tsbFFPOHpOUjNFSW1PeG9VTnRJalBPYTd2MU92Cm1mOStJZGhuYXMwODdLQ3dPemttenR0U2NwWVgvWGE3MTNtQ0JlMzBLNmgzV28yMnNSUGdXc0dSQzBJcmhsYmIKRTNJR1pXVkJVQThrQ0RCYStjMXg2cWNIcU5XRkdsY2tmdzVHYTF4bXVFRER5RklXRHBXVmNSbTZFazhZYkJyaApTcE8zTm9GZlN1N244ZU1CMi90V2w1alhwYTVqWVJKUFRCN1E5MUluMmo5WHJTZStmNzRQeVc3bFEyVkZBa250CkY5Z1FsamJYbjFLOG9ucURoVi9ieUhBZmpjOVg0TTJFOEVQcTNBbWJPRVMzUUpBUUxueVVNZWJhZG9tR1Z6ZUMKZzlpNmhMWkhvcTlsTFlWOFd6ST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBdm4zK0crODNxSkRDU2ZlNUNxSnZkM1Q0MVp3Y3k4NVVQYjE1WGtLSmpXblp3TlVWCkJ5aGg4d3pmb2NleGhZQzcvZGZQbkM2ZEcvZ1hxb1dvT1A4M3pWMnd3cExGd1NEWXZXL0JGWDd0dGNCd1luRUgKU2d4QlUzalJtdlBLd25kbUJmL3RFNEZuNVNSUmQrTmdublVKU012WjVPSHY4Y2N2YVBoaDNtSWVISXZ3VU9MbworSTUyZEYxd0JTakEvMnIwMi9nWHQ2UHBCQ1Y1TVRudzdtRUNkL0JIQ3FGeWJOeWNHTzFHYlNVRmhIcVYzWFlaCnhQblNiRVNOSGxCZkU1OG8vbk12aHpqa2tOekNxbVQvV25SZ05KSVVFSTZDTjV4ampnb3FOazhpN0FURCtTZVEKUDFEMi9HUzFtQ1lHNDJHSzhZR1g2V0g1Q3diQTVVci93bkc3N1FJREFRQUJBb0lCQUdyNXptNVpsT1F4QnlzSwoxdnZGNU5zczhXRGtYcmVGazRGb21uUDQ0YzVzbDBEWGFRdXYvZkhFVlFKQlpzd1dVM3htYWN6SDBLc1lWQklMCkpVRjg4aFYrZS9tSSswMU42T25aakpGSnlxeTYrV0lQSDR6Ui9RMm5WKzZ3NGpqN1hHd2FJVVZHOHRXWDQ3aDAKRkpwb0YyS3VPQnQxVm81czBZOGRqYmlaV1ZlbHRnMnc0Nkxidkk3YU9mZGpRMTVVK2lUY25ENXVTbDU0d2NBWgprQXg4MjJGeld2Y1NmcTQxYU1EaVB6WXNyVFBYSjlJR0RtdzRralo5UkhKSUlmM1hCa21IKy80aXJOVGp1R3JrCmVlRklOZXhCeEdCbms1bzBERjlPRzZUWFd4Nlh0WGh1QTZRZit0QnB4RjBTalh1THNZUjlEV1VGUWcycWNoYm4KeC9VdWhJRUNnWUVBeld2Q2tiQkpTSkdWMG1tek5Wd2dTRnBJbG02bFN0QmFsQjFtci9maXovdU9OSmRhMXFWVgpzWm53TDE0eko4bmg1bnA3YUVUVm8xOWEzMThlU2FsSVhrd2JFN1luZk5JdWdjQ3VSSjRwbE9kd0Z6Z2xUdldlCmFpRWdRQmFHNlBVRFg2ejJOTG5jOUFDbExqTVFYRnB4RnRlRUx5S3lrV3JxSVdkMFVsemN2QVVDZ1lFQTdXVTcKSnpTdjZaNHRNU1JJMEl0anA5anJabitKdWt4ZHpJOHlpL1dtNXp4N2VMMGl5Yno3UUY2eGFTSXIybzJ3QU5FSQp4TXMrSjFKNVhVa2phME45c0FLdWJ0cVFucFpPT2lJK2VRaDFDUHRWeWpFNDlIb0FtWDc3UVhDeTFLemttQy9KCi9veXdsdi9WaUJJWWtkNThyS01BSnBJVXhVa015eHZWTHN1UWJNa0NnWUFJczMvU1cvMCtyYXdDOWFjNW8yVmEKcXpoWDV1ZnBlMW5hM0VQMVFETERUSXlCZmNmRFA4MlpjRVBVUGRFODVqaERZdnpITmVNMndGdEJDdTVsZ0Y0bwpZR0RsUE5uL1Y0ZlF4ekNhaDNpTGJpSTVXWTk3QUx4dEVtb2pUTkQ2SFNhL2Jyd2ZENkJrVllLcHFsQVBHV1dnCjZoQVhUd2p4VCs0SzdDN3BMalhMWVFLQmdRQ01pc1RsWmhUSyt3RUlPZEg5M0xmSDgrMFJCbXAwWjZlVVppWm4KbzZ3Rzg5Q3BYMWZNRlZ5dDlDR1YrMHY1SEs3WkhPZlRFZndlN1gyNlU0VnJpRTVOdUppcU9pMHFKaFB6NkxnUgprWWN3SlJQYUd4Lzc1SXFjVlFmTTZ6cUVIRU5OTWVXbEZJZXJMWlN0OVFDa3d4SU9ab1c5VC9pSi84QmFNb1VZCktoMjd1UUtCZ0NsQnlNYmNPNkRoNDVuSW5YV2JvaDFGYTJBbVo5VkI0YTJ0aUgxK1FSU3dmSmduT0d6c0IzNmIKNW5KUG9PMzhBbWZyb3NzOXVhSzA0QjZUZUhOYmZmWVhQekdqY2E1aDdDZWZnTEE3Y3dqQU80VHRpeG40d3c5aQpTeWhCTWdWK0JXTm9iS0Z6T2NrQWltZU1KcktTZEplTkdDQis5dUl1UlNkRzBQUllucmVNCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==