资讯专栏INFORMATION COLUMN

Heapster启动的进一步研究

printempw / 3017人阅读

摘要:若我们将这两个参数分别设定值为和那么启动后,执行命令,并详细地查看该可以看到,该中有了两个和,他们分别是和进行再次加密后的数据。

kube-apiserver启动的时候如果加了如下的参数:

--admission_control=ServiceAccount

会自动生成一个apiserver.crt和apiserver.key文件,所在目录是/var/run/kubernetes/,并且程序启动后会发现,有一个默认的serviceaccount,这种模式下我们创建的resource都会有一个默认的serviceaccount。

kube-controller-manager启动时有这么两个参数:

--root-ca-file="": If set, this root certificate authority will be included in service account"s token secret. This must be a valid PEM-encoded CA bundle.

--service-account-private-key-file="": Filename containing a PEM-encoded private RSA key used to sign service account tokens.

这两个参数指定了要用哪些文件做token和根证书。若我们将这两个参数分别设定值为apiserver.crt和apiserver.key,那么启动后,执行:

kubectl get secrets

命令,并详细地查看该secret可以看到,该secret中有了两个data:ca.crt和token,他们分别是apiserver.crt和apiserver.key进行再次加密后的数据。

这样,我们创建一个heapster,heapster所属的serviceaccount的secret中的两个data,会被copy到创建出来的容器中,我们可以进入该容器找到两个数据。

我们看到kubernetes的源码中,apiserver的模块有这么一个函数,这个函数在启动apiserver的时候会被调用:

func GenerateSelfSignedCert(host, certPath, keyPath string, alternateIPs []net.IP, alternateDNS []string) error {
        priv, err := rsa.GenerateKey(rand.Reader, 2048)
        if err != nil {
            return err
        }

        template := x509.Certificate{
            SerialNumber: big.NewInt(1),
            Subject: pkix.Name{
                CommonName: fmt.Sprintf("%s@%d", host, time.Now().Unix()),
            },
            NotBefore: time.Now(),
            NotAfter:  time.Now().Add(time.Hour * 24 * 365),

            KeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
            ExtKeyUsage:           []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
            BasicConstraintsValid: true,
        }
        ...
    }

这个函数的功能是创建crt和key,调用这个函数的地方是kubernetescmdkube-apiserverappserver.go

if s.TLSCertFile == "" && s.TLSPrivateKeyFile == "" {
                    s.TLSCertFile = path.Join(s.CertDirectory, "apiserver.crt")
                    s.TLSPrivateKeyFile = path.Join(s.CertDirectory, "apiserver.key")
                    // TODO (cjcullen): Is PublicAddress the right address to sign a cert with?
                    alternateIPs := []net.IP{config.ServiceReadWriteIP}
                    alternateDNS := []string{"kubernetes.default.svc", "kubernetes.default", "kubernetes"}
                    // It would be nice to set a fqdn subject alt name, but only the kubelets know, the apiserver is clueless
                    // alternateDNS = append(alternateDNS, "kubernetes.default.svc.CLUSTER.DNS.NAME")
                    if err := util.GenerateSelfSignedCert(config.PublicAddress.String(), s.TLSCertFile, s.TLSPrivateKeyFile, alternateIPs, alternateDNS); err != nil {
                        glog.Errorf("Unable to generate self signed cert: %v", err)
                    } else {
                        glog.Infof("Using self-signed cert (%s, %s)", s.TLSCertFile, s.TLSPrivateKeyFile)
                    }
                }

通过上一篇可以知heapster启动后是要向apiserver做https请求的,所以crt和token必不可少。那为什么我们不直接拿这边的crt和key去用呢?

这篇文章详细地讲了证书生成的相关知识,其中的“添加了SAN的证书生成的过程”和上文源码中调用生成证书的地方是相似的,但是生成证书的过程中,hostname部分引用了了一个host@time.Now()作为/CN。见源代码中这句:

 Subject: pkix.Name{
                    CommonName: fmt.Sprintf("%s@%d", host, time.Now().Unix()),
                },

这句将生成crt的时候的hostname设置成了host@time,比如vm-56-65@23542343562 这样的形式,而且每次重启了apiserver,hostname都会变,容器内部可不知道这个hostname,所以根本没法访问。

heapster内部会记录apiserver的几个common name,即kubernetes源码中的:

[]string{"kubernetes.default.svc", "kubernetes.default", "kubernetes"}

我认为这肯定是要与kubernetes自生成的crt公用而设计的。 至于为什么不行,等有时间再研究。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32431.html

相关文章

  • kubernetes下heapster部署案例

    摘要:举个例子,我们在这种状态下创建一个,然后执行在中会发现有了字段,并且装载了一个是的,这个就是我们这个下的。 注:本案例在我的部署环境下是可行的,但不保证在所有环境下都可行。我尽可能讲得直白而详细,因为我自己也才刚开始接触,已经做过深入研究的可以浏览,若有什么错误,烦请指正,感激不尽! 我的环境: K8S1.0.0+flannel+docker1.6的分布式集群。 这里先不赘述fla...

    Ali_ 评论0 收藏0
  • kubernetes下heapster部署案例

    摘要:举个例子,我们在这种状态下创建一个,然后执行在中会发现有了字段,并且装载了一个是的,这个就是我们这个下的。 注:本案例在我的部署环境下是可行的,但不保证在所有环境下都可行。我尽可能讲得直白而详细,因为我自己也才刚开始接触,已经做过深入研究的可以浏览,若有什么错误,烦请指正,感激不尽! 我的环境: K8S1.0.0+flannel+docker1.6的分布式集群。 这里先不赘述fla...

    Jinkey 评论0 收藏0
  • Kubernetes监控之Heapster源码分析

    摘要:源码版本简介是下的一个监控项目,用于进行容器集群的监控和性能分析。基本的功能及概念介绍可以回顾我之前的一篇文章监控之介绍。在源码分析之前我们先介绍的实现流程,由上图可以看出会从各个上获取相关的监控信息,然后进行汇总发送给后台数据库。 源码版本 heapster version: release-1.2 简介 Heapster是Kubernetes下的一个监控项目,用于进行容器集群的监控...

    gclove 评论0 收藏0
  • 闲谈 Kubernetes 主要特性和经验分享

    摘要:主要介绍的主要特性和一些经验。先从整体上看一下的一些理念和基本架构,然后从网络资源管理存储服务发现负载均衡高可用安全监控等方面向大家简单介绍的这些主要特性。集群范围内的监控主要由和如构建。 主要介绍 Kubernetes 的主要特性和一些经验。先从整体上看一下Kubernetes的一些理念和基本架构, 然后从网络、 资源管理、存储、服务发现、负载均衡、高可用、rolling upgra...

    Guakin_Huang 评论0 收藏0
  • 闲谈 Kubernetes 主要特性和经验分享

    摘要:主要介绍的主要特性和一些经验。先从整体上看一下的一些理念和基本架构,然后从网络资源管理存储服务发现负载均衡高可用安全监控等方面向大家简单介绍的这些主要特性。集群范围内的监控主要由和如构建。 主要介绍 Kubernetes 的主要特性和一些经验。先从整体上看一下Kubernetes的一些理念和基本架构, 然后从网络、 资源管理、存储、服务发现、负载均衡、高可用、rolling upgra...

    shevy 评论0 收藏0

发表评论

0条评论

printempw

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<