<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>http://lernfunk.de/media/654321</id>
  <title>double12gzh - Posts tagged kubeconfig</title>
  <updated>2020-11-08T14:11:59.786000+00:00</updated>
  <link href="double12gzhblogs.readthedocs.io"/>
  <link href="double12gzhblogs.readthedocs.io/blogs/tag/kubeconfig/atom.xml"/>
  <generator uri="https://ablog.readthedocs.org" version="0.10.9">ABlog</generator>
  <entry>
    <id>double12gzhblogs.readthedocs.io/blogs/Kubernetes/2020-10-13-client-go%E7%B3%BB%E5%88%97%E4%B9%8B2---%E7%AE%A1%E7%90%86kubeconfig.html</id>
    <title>client-go系列之2—管理kubeconfig</title>
    <updated>2020-10-13T00:00:00+00:00</updated>
    <author>
      <name>JeffreyGuan</name>
    </author>
    <content type="html">&lt;div class="section" id="client-go2-kubeconfig"&gt;

&lt;p&gt;摘要：分析如何通过client-go来管理kubeconfig。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://gitee.com/double12gzh/wiki-pictures/raw/master/2020-10-13-client-go-kubeconfig/0.png" /&gt;&lt;/p&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;1. 写在前面&lt;/h2&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;个人主页: https://gzh.readthedocs.io&lt;/p&gt;
&lt;p&gt;关注容器技术、关注&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Kubernetes&lt;/span&gt;&lt;/code&gt;。问题或建议，请公众号留言。&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;本系列内容都是基于这个版本的&lt;a class="reference external" href="https://github.com/kubernetes/client-go/tree/becbabb360023e1825a48b4db85f454e452ae249"&gt;client-go&lt;/a&gt;进行讲解，不同版本的略有差异。&lt;/p&gt;
&lt;p&gt;在使用client-go开发时，通常会遇到两种情况：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;在集群内部访问kubernetes资源&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在集群外部访问kubernetes资源&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关于这两种方式的区别，可以分别看一下下面这段代码直观感受一下：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/kubernetes/client-go/tree/becbabb360023e1825a48b4db85f454e452ae249/examples/in-cluster-client-configuration"&gt;in-cluster-client-configuration&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/kubernetes/client-go/tree/becbabb360023e1825a48b4db85f454e452ae249/examples/out-of-cluster-client-configuration"&gt;out-of-cluster-client-configuration&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;2. 集群配置管理&lt;/h2&gt;
&lt;p&gt;k8s的配置文件默认会存放在~/.kube/config中，其内容如下：&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: &lt;span class="nv"&gt;LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0xxxxxxxxCg&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;
    server: https://127.0.0.1:33629
  name: kind-kind
contexts:
- context:
    cluster: kind-kind
    user: kind-kind
  name: kind-kind
current-context: kind-kind
kind: Config
preferences: &lt;span class="o"&gt;{}&lt;/span&gt;
users:
- name: kind-kind
  user:
    client-certificate-data: &lt;span class="nv"&gt;LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1Jxxxxxxx&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;
    client-key-data: &lt;span class="nv"&gt;LS0tLS1yyyyyyyCg&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上面这是单个配置文件情况，client-go提供了合并多个配置文件的能力，合并完成后如下：&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;apiVersion: v1

clusters:
- cluster:
    certificate-authority-data: &lt;span class="nv"&gt;LS0tLS1CRUdJTiBDRVJUSUZJQtCg&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;
    server: https://127.0.0.1:51107
  name: kind-guan
- cluster:
    certificate-authority-data: &lt;span class="nv"&gt;LS0tLS1CRUdJTiBDRVJtCg&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;
    server: https://127.0.0.1:33629
  name: kind-kind

contexts:
- context:
    cluster: kind-guan
    user: kind-guan
  name: kind-guan
- context:
    cluster: kind-kind
    user: kind-kind
  name: kind-kind


current-context: kind-kind

kind: Config

preferences: &lt;span class="o"&gt;{}&lt;/span&gt;

users:
- name: kind-guan
  user:
    client-certificate-data: &lt;span class="nv"&gt;LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUUtLS0tLQo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
    client-key-data: &lt;span class="nv"&gt;LS0tLS1CRUdJTiBxxxxxS0tCg&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;
- name: kind-kind
  user:
    client-certificate-data: &lt;span class="nv"&gt;LS0tLS1CRUdJTiBDRVJxxxxxxEUtLS0tLQo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
    client-key-data: &lt;span class="nv"&gt;LS0tLS1CRUdJTiBSU0EgUFJJVkFURSxxxxg&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;client-go中对于配置文件的管理可以简单概括为以下两点：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;加载配置文件&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;合并配置文件&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来分别从代码层面看一下。&lt;/p&gt;
&lt;div class="section" id="id3"&gt;
&lt;h3&gt;2.1 加载配置文件&lt;/h3&gt;
&lt;p&gt;加载配置文件的代码如下：&lt;/p&gt;
&lt;div class="highlight-go notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;kubeconfig&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;

        &lt;span class="c1"&gt;// 默认会从~/.kube/config路径下获取配置文件&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;home&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;homeDir&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="nx"&gt;home&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;kubeconfig&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kubeconfig&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;home&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;.kube&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;config&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;(optional)absolute path to the kubeconfig file&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;kubeconfig&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kubeconfig&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;absolute path to the kubeconfig file&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nx"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;// 使用k8s.io/client-go/tools/clientcmd加载配置文件并生成config的对象&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;clientcmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BuildConfigFromFlags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;kubeconfig&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;clientcmd.BuildConfigFromFlags&lt;/span&gt;&lt;/code&gt;加载配置文件后, 会生成一个&lt;a class="reference external" href="https://github.com/kubernetes/client-go/blob/becbabb360023e1825a48b4db85f454e452ae249/rest/config.go#L53"&gt;Config&lt;/a&gt;的对象，这个对象中会包含如：apiserver地址、用户名、密码、token等信息。&lt;/p&gt;
&lt;p&gt;进入到&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;clientcmd.BuildConfigFromFlags&lt;/span&gt;&lt;/code&gt;查看其进行配置加载相关的代码：&lt;/p&gt;
&lt;p&gt;代码位置：&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tools/clientcmd/client_config.go&lt;/span&gt;&lt;/code&gt;
&lt;img alt="tools/clientcmd/client_config.go" src="https://gitee.com/double12gzh/wiki-pictures/raw/master/2020-10-13-client-go-kubeconfig/1.png" /&gt;&lt;/p&gt;
&lt;p&gt;生成一个结构体：&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ClientConfigLoadingRules&lt;/span&gt;&lt;/code&gt;，这里面记录了当前传入的kubeconfig文件的位置。另外，在这个结构体中有一个变量&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;load&lt;/span&gt; &lt;span class="pre"&gt;ClientConfigLoader&lt;/span&gt;&lt;/code&gt;，对于kubeconfig文件的管理，就是通过其中定义的&lt;a class="reference external" href="https://github.com/kubernetes/client-go/blob/becbabb360023e1825a48b4db85f454e452ae249/tools/clientcmd/loader.go#L76"&gt;ClientConfigLoadingRules.Load()&lt;/a&gt;实现的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://gitee.com/double12gzh/wiki-pictures/raw/master/2020-10-13-client-go-kubeconfig/2.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://gitee.com/double12gzh/wiki-pictures/raw/master/2020-10-13-client-go-kubeconfig/3.png" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h3&gt;2.2 合并配置文件&lt;/h3&gt;
&lt;p&gt;上面对kubeconfig完成加载后，下一步就需要对kubeconfig做合并处理。&lt;/p&gt;
&lt;p&gt;代码位置: &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tools/clientcmd/loader.go&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://gitee.com/double12gzh/wiki-pictures/raw/master/2020-10-13-client-go-kubeconfig/4.png" /&gt;&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;欢迎关注我的微信公众号：&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://gitee.com/double12gzh/wiki-pictures/raw/master/wechat_public.jpg" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
    <link href="double12gzhblogs.readthedocs.io/blogs/Kubernetes/2020-10-13-client-go%E7%B3%BB%E5%88%97%E4%B9%8B2---%E7%AE%A1%E7%90%86kubeconfig.html" rel="alternate"/>
    <published>2020-10-13T00:00:00+00:00</published>
  </entry>
</feed>
