• K8S-kubelet启动过程


    官方文档

    kubelet 引导身份认证方式

    • bootstrap token (secret)
    • token file (token.csv)

    bootstrap Secret

    token格式

    必须符合正则表达式 [a-z0-9]{6}.[a-z0-9]{16}

    • 第一部分是 “Token ID”,它是一种公开信息,用于引用令牌并确保不会泄露认证所使用的秘密信息。
    • 第二部分是“令牌秘密(Token Secret)”,它应该被共享给受信的第三方

    启用bootstrap

    kube-apiserver 使用--enable-bootstrap-token-auth=true选项启动

    image-20210414164413965

    • 令牌认证为用户名 system:bootstrap:<token id> 并且是组 system:bootstrappers 的成员。额外的组信息可以通过 Secret 来设置。
    • 过期的令牌可以通过启用控制器管理器中的 tokencleaner 控制器来删除。

    Secret 格式

    每个合法的令牌背后对应着 kube-system 名字空间中的某个 Secret 对象。Secret 数据总是采用 Base64 编码来存储

    apiVersion: v1
    kind: Secret
    metadata:
      # name 必须是 "bootstrap-token-<token id>" 格式的
      name: bootstrap-token-07401b
      namespace: kube-system
    
    # type 必须是 'bootstrap.kubernetes.io/token'
    type: bootstrap.kubernetes.io/token
    stringData:
      # 供人阅读的描述,可选。
      description: "The default bootstrap token generated by 'kubeadm init'."
    
      # 令牌 ID 和秘密信息,必需。
      token-id: 07401b
      token-secret: base64(f395accd246ae52d)
    
      # 可选的过期时间字段
      expiration: "2017-03-10T03:22:11Z"
      # 允许的用法
      usage-bootstrap-authentication: "true"
      usage-bootstrap-signing: "true"
    
      # 令牌要认证为的额外组,必须以 "system:bootstrappers:" 开头
      auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress
    

    Secret 的类型必须是 bootstrap.kubernetes.io/token,而且名字必须是 bootstrap-token-。 令牌必须存在于 kube-system 名字空间中。

    usage-bootstrap-* 成员表明这个 Secret 的用途。启用时,值必须设置为 true

    • usage-bootstrap-authentication 表示令牌可以作为持有者令牌用于 API 服务器的身份认证。
    • usage-bootstrap-signing 表示令牌可被用于 cluster-info ConfigMap 的签名, 就像下面描述的那样。

    expiration 字段控制令牌的失效期。过期的令牌在用于身份认证时会被拒绝,在用于 ConfigMap 签名时会被忽略。 过期时间值是遵循 RFC3339 进行编码的 UTC 时间。 启用 TokenCleaner 控制器会自动删除过期的令牌

    kubeadm管理token

    # 显示
    kubeadm token list
    
    # 打印并生成规定格式的令牌
    [root@k8s-master01 bin]# kubeadm token generate 
    nkp60x.mcsn25irqqg9oe2p
    [root@k8s-master01 bin]# 
    
    

    token file内容

    cat token.csv
    02b50b05283e98dd0fd71db496ef01e8,kubelet-bootstrap,10001,"system:bootstrappers"
    
    # 使用下面的命令生成 token.csv 第一部分的内容: 02b50b05283e98dd0fd71db496ef01e8
    head -c 16 /dev/urandom | od -An -t x | tr -d ' '
    
    • 其中,前面3个列值可以是任意值,分别:令牌、用户名和用户的 UID
    • 用引号括起来的组名称则只能用上面例子中给的值: "system:bootstrappers"

    启用token file选项

    kube-apiserver 使用 --token-auth-file=FILENAME 选项启动服务

    image-20210414164328618

    apiserver读取该文件的提取持有者令牌,令牌长期有效,在不重启apiserver的情况下,无法更改令牌列值

    kubelet 启动过程

    1. 查找kubeconfig文件(一般文件 /etc/kubernetes/kubelet.kubeconfig)
    2. 从kubeconfig文件中检索API Server的URL和证书(通常是TLS密钥和签名证书)
    3. 然后使用凭证和api server 进行交互通信

    TLS Bootstrapping初始化流程

    1. kubelet 启动
    2. kubelet 看到自己 没有 对应的 kubeconfig 文件
    3. kubelet 搜索并发现 bootstrap-kubeconfig 文件
    4. kubelet 读取该bootstrap-kubeconfig启动引导文件,从中获得 API Server的 URL 和用途有限的 一个“令牌(Token)”
    5. kubelet 使用上述令牌与 API Server 建立连接,并使用该token进行身份认证
      • apiserver识别tokenid, apiserver查看该tokenid对应的bootstrap
    6. kubelet 现在拥有受限制的凭据来创建和取回证书签名请求(CSR)
    7. kubelet 为自己创建一个 CSR,并将其 signerName 设置为 kubernetes.io/kube-apiserver-client-kubelet
    8. CSR 被以如下两种方式之一批复:
      • 如果配置了,kube-controller-manager 会自动批复该 CSR
      • 如果配置了,一个外部进程,或者是人,使用 Kubernetes API 或者使用 kubectl 来批复该 CSR
    9. kubelet 所需要的证书被创建
    10. 证书被发放给 kubelet
    11. kubelet 取回该证书
    12. kubelet 创建一个合适的 kubeconfig,其中包含密钥和已签名的证书
    13. kubelet 开始正常操作
    14. 可选地,如果配置了,kubelet 在证书接近于过期时自动请求更新证书
    15. 更新的证书被批复并发放;取决于配置,这一过程可能是自动的或者手动完成
  • 相关阅读:
    PHP 数组函数整理
    HTML5多文件上传
    ttf字体转换成web中使用的woff、svg、eot格式字体
    jQuery之防止冒泡事件
    HTTP协议详解(真的很经典)
    selenium + python自动化测试unittest框架学习(七)随机生成姓名
    selenium + python自动化测试unittest框架学习(四)python导入模块及包知识点
    selenium + python自动化测试unittest框架学习(五)webdriver的二次封装
    selenium + python自动化测试unittest框架学习(三)webdriver对页面其他控件操作(三)
    selenium + python自动化测试unittest框架学习(三)webdriver元素操作(二)
  • 原文地址:https://www.cnblogs.com/binliubiao/p/14856150.html
Copyright © 2020-2023  润新知