参考

kubeadm 部署的 kubernetes 集群,默认的证书有效时间是1年,需要每年手工更新。

1. 重新编译kubeadm

1.1 准备

  1. # 下载对应的kubernetes源代码,这里采用 "v1.14.1" 版本
  2. wget https://codeload.github.com/kubernetes/kubernetes/tar.gz/v1.14.1
  3. # untar
  4. tar -zxvf kubernetes-1.14.1.tar.gz
  5. cd kubernetes-1.14.1
  6. # 进入源代码目录
  7. cd kubernetes-1.14.1

1.2 修改源代码-cert.go

  • 文件:staging/src/k8s.io/client-go/util/cert/cert.go
  • NewSelfSignedCACert 方法,签发以下证书,且默认为10年有效期:
    • front-proxy-ca.crt
    • front-proxy-client.crt
    • ca.crt
    • etcd/ca.crt
    • etcd/peer.crt
  1. # 1.14.0版本开始,此文件不需要修改
  2. vim staging/src/k8s.io/client-go/util/cert/cert.go
  3. const duration365d = time.Hour * 24 * 365
  4. // Config contains the basic fields required for creating a certificate
  5. type Config struct {
  6. CommonName string
  7. Organization []string
  8. AltNames AltNames
  9. Usages []x509.ExtKeyUsage
  10. }
  11. // AltNames contains the domain names and IP addresses that will be added
  12. // to the API Server's x509 certificate SubAltNames field. The values will
  13. // be passed directly to the x509.Certificate object.
  14. type AltNames struct {
  15. DNSNames []string
  16. IPs []net.IP
  17. }
  18. // NewSelfSignedCACert creates a CA certificate
  19. func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, error) {
  20. now := time.Now()
  21. tmpl := x509.Certificate{
  22. SerialNumber: new(big.Int).SetInt64(0),
  23. Subject: pkix.Name{
  24. CommonName: cfg.CommonName,
  25. Organization: cfg.Organization,
  26. },
  27. NotBefore: now.UTC(),
  28. # 默认已调整有效期为10年;
  29. # 但只影响部分证书:
  30. NotAfter: now.Add(duration365d * 10).UTC(),
  31. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
  32. BasicConstraintsValid: true,
  33. IsCA: true,
  34. }
  35. certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &tmpl, &tmpl, key.Public(), key)
  36. if err != nil {
  37. return nil, err
  38. }
  39. return x509.ParseCertificate(certDERBytes)
  40. }

1.3 修改源代码-pki_helpers.go

  • ,以下证书由 NewSignedCert 方法签发,但签发的证书默认只有一年有效期:

    • apiserver.crt
    • apiserver-etcd-client.crt
    • etcd/server.crt
    • etcd/healthcheck-client.crt
    • apiserver-kubelet-client.crt
  1. # `NewSignedCert` 方法:
  2. # 部分证书是通过NewSignedCert这个方法签发,而这个方法签发的证书默认只有一年有效期,查看代码逻辑
  3. vim cmd/kubeadm/app/util/pkiutil/pki_helpers.go
  4. // NewSignedCert creates a signed certificate using the given CA certificate and key
  5. func NewSignedCert(cfg *certutil.Config, key crypto.Signer, caCert *x509.Certificate, caKey crypto.Signer) (*x509.Certificate, error) {
  6. serial, err := rand.Int(rand.Reader, new(big.Int).SetInt64(math.MaxInt64))
  7. if err != nil {
  8. return nil, err
  9. }
  10. if len(cfg.CommonName) == 0 {
  11. return nil, errors.New("must specify a CommonName")
  12. }
  13. if len(cfg.Usages) == 0 {
  14. return nil, errors.New("must specify at least one ExtKeyUsage")
  15. }
  16. certTmpl := x509.Certificate{
  17. Subject: pkix.Name{
  18. CommonName: cfg.CommonName,
  19. Organization: cfg.Organization,
  20. },
  21. DNSNames: cfg.AltNames.DNSNames,
  22. IPAddresses: cfg.AltNames.IPs,
  23. SerialNumber: serial,
  24. NotBefore: caCert.NotBefore,
  25. # 修改签发相关证书的默认有效期为10年
  26. // NotAfter: time.Now().Add(duration365d).UTC(),
  27. NotAfter: time.Now().Add(duration365d * 10).UTC(),
  28. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
  29. ExtKeyUsage: cfg.Usages,
  30. }
  31. certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &certTmpl, caCert, key.Public(), caKey)
  32. if err != nil {
  33. return nil, err
  34. }
  35. return x509.ParseCertificate(certDERBytes)
  36. }

1.4 编译

  1. # go环境已经准备好
  2. # kubeadm
  3. make WHAT=cmd/kubeadm GOFLAGS=-v
  4. # 补充:编译kubelet
  5. # make all WHAT=cmd/kubelet GOFLAGS=-v
  6. # 补充:编译kubectl
  7. # make all WHAT=cmd/kubectl GOFLAGS=-v
  8. # 编译生成的二进制文件在 _output/bin/ 目录下

1.5 更新kubeadm

  1. # 将kubeadm 文件拷贝替换系统中原有kubeadm
  2. cp /usr/bin/kubeadm /usr/bin/kubeadm.origin
  3. cp _output/bin/kubeadm /usr/bin/kubeadm

2. 更新证书

2.1 更新 kube-master (任一)节点证书

  • 1.13.x 版本(含)之后的处理方式;
  • 不更新 kubeadm 的情况下,也可手动更新证书,但更新的证书有效期默认仍是一年。
  1. # 备份
  2. cp -r /etc/kubernetes/pki /etc/kubernetes/pki.origin
  3. # 更新证书;
  4. # "--config" 指定 "kubeadm" 的配置文件,建议使用部署集群时使用的配置文件;
  5. # 其他参数可参考官方文档
  6. cd /etc/kubernetes/pki
  7. kubeadm alpha certs renew all --config=/root/kubeadm/kubeadm-config.yaml
  8. # 验证
  9. openssl x509 -in apiserver.crt -text -noout | grep Not
  10. # 关于kubeconfig:$HOME/.kube/config
  11. # service account的密钥是以rsa密钥对形式生成,没有过期时间

2.2 (optional) HA集群其余mater节点证书更新

  • 在已更新证书的master节点运行脚本,将更新的证书同步到其余master节点
  1. # 如果可以,请提前在被同步master节点做备份
  2. cat certificate.sh
  3. #!/bin/bash
  4. # 2019-05-27 v0.1
  5. # scp certificate files from the first control plane node to the rest.
  6. USER=root # customizable
  7. CONTROL_PLANE_IPS="100.64.198.137 100.64.198.138"
  8. for host in ${CONTROL_PLANE_IPS}; do
  9. scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:/etc/kubernetes/pki/
  10. scp /etc/kubernetes/pki/ca.key "${USER}"@$host:/etc/kubernetes/pki/
  11. scp /etc/kubernetes/pki/sa.key "${USER}"@$host:/etc/kubernetes/pki/
  12. scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:/etc/kubernetes/pki/
  13. scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:/etc/kubernetes/pki/
  14. scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:/etc/kubernetes/pki/
  15. scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:/etc/kubernetes/pki/etcd/ca.crt
  16. scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:/etc/kubernetes/pki/etcd/ca.key
  17. scp /etc/kubernetes/admin.conf "${USER}"@$host:/etc/kubernetes/
  18. done

3. 补充:go 环境

  1. # download,根据需要选择版本
  2. wget https://studygolang.com/dl/golang/go1.12.1.linux-amd64.tar.gz
  3. # untar
  4. tar -zxvf go1.12.1.linux-amd64.tar.gz -C /usr/local
  5. # edit /etc/profile,在文件末尾添加如下内容
  6. vim /etc/profile
  7. # go setting
  8. export GOROOT=/usr/local/go
  9. export GOPATH=/usr/local/gopath
  10. export PATH=$PATH:$GOROOT/bin
  11. # enable /etc/profile
  12. source /etc/profile

重新编译kubeadm,修改默认证书时间的更多相关文章

  1. 编译kubeadm使生成证书有效期为100年

    目录 问题 编译 检查结果 问题 当我使用kubeadm部署成功k8s集群时在想默认生成的证书有效期是多久,如下所示 /etc/kubernetes/pki/apiserver.crt #1年有效期 ...

  2. mysql 连接超时解决方案: 怎样修改默认超时时间

    mysql数据库有一个wait_timeout的配置,默认值为28800(即8小时). 在默认配置不改变的情况下,如果连续8小时内都没有访问数据库的操作,再次访问mysql数据库的时候,mysql数据 ...

  3. Openwrt编译时修改默认IP的方法

    在~/openwrt/barrier_breaker/package/base-files/files/lib/functions/ uci-defaults.sh 第178行修改IP地址

  4. Android系统移植与调试之------->如何修改Android设备的默认休眠时间

    1.找到~/mx0831-0525/frameworks/base/packages/SettingsProvider/res/values/ defaults.xml文件 2.修改默认休眠时间 3. ...

  5. 修改Django的默认打印时间

    环境 Django版本:1.10 前言 默认情况下,Django会把日期按照“月份 天数, 年”的格式打印,比如2003年2月4日会打印成“Feb. 4, 2003”,这种格式对于西方人来说很好看,但 ...

  6. K8S 1.14.6中,将kubeadm集群证书颁发时间延长到100年

    更改两个文件,重新编译kubeadm. 1,D:\kubernetes-1.14.6\staging\src\k8s.io\client-go\util\cert\cert.go // NewSelf ...

  7. Unity3D项目实战笔记(10):Unity3D编译IPA的PostEvents–节约时间利器

    最近,SDK支付等接入差不多了,就从Unity3D生成IPA (企业版License), 然,需要手动执行的PostEvents竟然多大10项+, 这些我默默的承受了1周时间,每次约浪费20分钟-额外 ...

  8. MTK 修改默认时区

    首先介绍应用程序修改 : AlarmManager mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); mA ...

  9. 19.Eclipse 修改默认的keystore签名文件

    Android开发中apk运行都需要签名,就算连接手机直接运行调试,apk都有签名,开发工具会有默认的debug_keyStore Eclipse ADT调试运行使用的是临时生成的Debug专用证书, ...

随机推荐

  1. TensorFlow基础篇

    Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算.TensorFlow的运行机制属于“定义”和“运行”相分离.模型的构建只是相当于定义了一个图结构(代表一个计算任务),图中有 ...

  2. [LeetCode] 352. Data Stream as Disjoint Intervals 分离区间的数据流

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

  3. JavaWeb 笔记

    WEB-INF 目录 web.xml 文件配置 精准匹配 "/" "/index" "/go/index.html" 路径通配匹配 &quo ...

  4. Object.setPrototypeOf() 与Object.getPrototypeOf() 方法的使用

    Object.setPrototypeOf 方法的使用 [1] 将一个指定的对象的原型设置为另一个对象或者null(既对象的[[Prototype]]内部属性). 语法 Object.setProto ...

  5. GC分析工具使用-gceacy分析堆栈

    gceasy是一款在线的gc分析工具.试用一下分析jstack的日志 1.jstack -l 3539 > 3539.stack 2.打包成zip文件 3.上传https://gceasy.io ...

  6. IDEA整合GIT所有操作

    IDEA整合GIT操作 1.1 配置Idea集成Git 1.2 在使用SSH key 创建公钥私钥,上传公钥到github (1).点击开始菜单-->所有程序--->git选择 Git B ...

  7. 2018 ACM-ICPC徐州站网络赛 G题

    There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xxx , yy ...

  8. [转帖]tcpdump详细教程

    tcpdump详细教程 https://www.jianshu.com/p/d9162722f189 tcpdump tcpdump - dump traffic on a network tcpdu ...

  9. 那些前端二进制操作API

    一直以来,前端的工作主要涉及的是字符串操作,而对二进制的数据接触较少.但是这种需求却一直存在着,尤其是HTML5之后,随着web应用越来越复杂,File,Blob,TypedArray这些API的出现 ...

  10. Blend Brush介绍

    原文:Blend Brush介绍 这篇文章会介绍 Blend怎么设置Brush 全局画刷 1)blend面板的介绍 这5个rectangle分别对应 blend中的 5个设置 1 设置无颜色 2 设置 ...