<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>runc | 伪架构师</title>
    <link>/tags/runc/</link>
      <atom:link href="/tags/runc/index.xml" rel="self" type="application/rss+xml" />
    <description>runc</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Fri, 18 May 2018 18:48:12 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>runc</title>
      <link>/tags/runc/</link>
    </image>
    
    <item>
      <title>在 K8S 集群中分布构建 Docker 镜像</title>
      <link>/post/jenkins-build-image-on-k8s-tricks/</link>
      <pubDate>Fri, 18 May 2018 18:48:12 +0800</pubDate>
      <guid>/post/jenkins-build-image-on-k8s-tricks/</guid>
      <description>

&lt;h2 id=&#34;镜像更新&#34;&gt;镜像更新&lt;/h2&gt;

&lt;p&gt;最近给我的 &lt;a href=&#34;https://github.com/fleeto/docker-jenkins&#34; target=&#34;_blank&#34;&gt;Jenkins 镜像&lt;/a&gt; 做了一些更新：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;加入了基于 RunC 的镜像操作工具：&lt;a href=&#34;https://github.com/genuinetools/img&#34; target=&#34;_blank&#34;&gt;IMG&lt;/a&gt;。在特权模式下，可以方便的使用命令行创建和操作 Docker 镜像。&lt;/li&gt;
&lt;li&gt;更新 Jenkins 以及 Remoting 版本。&lt;/li&gt;
&lt;li&gt;修复一些初始化问题。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;下面根据这一版本的镜像简单说说分布式构建过程中的一些要点。&lt;/p&gt;

&lt;h2 id=&#34;jenkins-镜像的一些值得注意的东西&#34;&gt;Jenkins 镜像的一些值得注意的东西&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Jenkins 在启动 Slave 节点时，会设置下面三个环境变量，所以在 &lt;code&gt;run.sh&lt;/code&gt; 就可以引用这几个环境变量启动 Worker 节点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JENKINS_URL：MASTER 服务的地址。&lt;/li&gt;
&lt;li&gt;JENKINS_NAME：为 Worker 节点分配的名称&lt;/li&gt;

&lt;li&gt;&lt;p&gt;JENKINS_SECRET：Worker 节点和 Master 节点通信时所使用的认证密钥。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;java \
-cp /usr/share/jenkins/slave.jar hudson.remoting.jnlp.Main \
-headless -url $JENKINS_URL $JENKINS_SECRET $JENKINS_NAME
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;code&gt;img&lt;/code&gt; 工具依赖于 &lt;a href=&#34;https://github.com/opencontainers/runc/&#34; target=&#34;_blank&#34;&gt;runc&lt;/a&gt;，因此也需要把 runc 加入到镜像之中。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;code&gt;config.xml&lt;/code&gt; 中：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;直接设置了 8081 作为 jnlp 端口，因此在 Dockerfile 中也进行了 EXPOSE 声明。&lt;/li&gt;
&lt;li&gt;开启 CSRF 选项，并设置代理服务器兼容，防止在 Kube-Proxy 的情况下无法提供服务。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;jenkins-在-kubernetes-中的启动&#34;&gt;Jenkins 在 Kubernetes 中的启动：&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;RBAC：因为要启动 Worker 节点，因此在开启了 RBAC 的集群上，要给 Jenkins 的 Service Account 进行授权，允许进行 Pod 的操作。&lt;/li&gt;
&lt;li&gt;Service：需要暴露 jnlp 端口到集群内部，无需为其提供 loadbalancer 以及 nodePort 等形式的外网接入能力。&lt;/li&gt;
&lt;li&gt;可以根据需要提供加载卷，用于保存配置等。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;分布式构建的配置&#34;&gt;分布式构建的配置&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;首先需要安装 Kubernetes 插件。&lt;/li&gt;
&lt;li&gt;插件安装后，就可以在 Jenkins 的 credentials 中加入 &lt;code&gt;Kubernetes ServiceAccount&lt;/code&gt; 类型的凭据，用于连接和操作 Kubernetes 集群。&lt;/li&gt;
&lt;li&gt;容器模板设置中，系统缺省会提供一个名为 jnlp 的容器模板，要想使用自己的镜像，需要进行同名覆盖。

&lt;ul&gt;
&lt;li&gt;容器模板中可以按需设置加载卷等，例如要进行镜像的 PUSH 操作，就需要将 CA 证书通过一定方法加入到容器的信任列表之中。&lt;/li&gt;
&lt;li&gt;如果要进行 IMG 的操作，需要选中容器的 &lt;code&gt;Run in privileged mode&lt;/code&gt; 选项，开启特权模式。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;任务的设置&#34;&gt;任务的设置&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;要进行镜像的构建，就非常的容易，加入几行简单的 Shell 命令，例如：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;mkdir tmp
# 生成一个 Dokerfile
echo &amp;quot;FROM registry.docker-cn.com/library/alpine&amp;quot; &amp;gt; tmp/Dockerfile
# 构建镜像
img build -t 10.211.55.19:5000/alpine:163 tmp
# 更新证书信任列表
update-ca-certificates
# 把镜像推送到私库
img push 10.211.55.19:5000/alpine:163
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
