<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>centos | 伪架构师</title>
    <link>/tags/centos/</link>
      <atom:link href="/tags/centos/index.xml" rel="self" type="application/rss+xml" />
    <description>centos</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Thu, 17 Mar 2016 22:22:31 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>centos</title>
      <link>/tags/centos/</link>
    </image>
    
    <item>
      <title>Docker 镜像：Cent OS 7 的 Yum 仓库</title>
      <link>/post/centos-7-yum-repostion-image/</link>
      <pubDate>Thu, 17 Mar 2016 22:22:31 +0800</pubDate>
      <guid>/post/centos-7-yum-repostion-image/</guid>
      <description>

&lt;p&gt;&lt;a href=&#34;https://github.com/fleeto/yum.centos7&#34; target=&#34;_blank&#34;&gt;Github&lt;/a&gt;
&lt;a href=&#34;https://hub.docker.com/r/dustise/yum.centos7/&#34; target=&#34;_blank&#34;&gt;Dockerhub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker file, Yum repository for CentOS 7.&lt;/p&gt;

&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;h3 id=&#34;build&#34;&gt;Build&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Build&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;docker build \
-t image.registry/yumrepo:0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Build with proxy&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;docker build \
--build-arg http_proxy=web.proxy:8080 \
--build-arg https_proxy=web.proxy:8080 \
-t image.registry/yumrepo:0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;run&#34;&gt;Run&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#!/bin/sh
docker run -d \
    -e http_proxy=&#39;web.proxy:8080&#39; \
    -e https_proxy=&#39;web.proxy:8080&#39; \
    -v /u01/repo.data/:/repo \
    -v /u01/repo.total:/repo.def \
    -p 8084:80 \
    --name=centos7yum \
    &amp;quot;image.registry/yumrepo:0.1&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;/repo&lt;/code&gt;: RPMs path, we can map it to an external volume to make it persistent&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/repo.def&lt;/code&gt;: you can store &lt;code&gt;*.repo&lt;/code&gt; files into it, and it will replace the origin &lt;code&gt;total.repo&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&#34;update&#34;&gt;Update&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docker exec [container id] refresh.sh&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&#34;yum-repository-defination&#34;&gt;Yum Repository defination&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;[localrepo]
name=LAN Repository
baseurl=http://repo.server.url:8084
enabled=1
gpgcheck=0
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>CentOS 7 &#43; Kubernetes 1.1.x  &#43; Docker 1.9.x  安装指南</title>
      <link>/post/install-kubernetes-and-docker-on-centos/</link>
      <pubDate>Thu, 24 Dec 2015 00:17:17 +0800</pubDate>
      <guid>/post/install-kubernetes-and-docker-on-centos/</guid>
      <description>

&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;

&lt;p&gt;&lt;a href=&#34;http://docker.io/&#34; target=&#34;_blank&#34;&gt;Docker&lt;/a&gt; 和 &lt;a href=&#34;http://kubernetes.io/&#34; target=&#34;_blank&#34;&gt;Kubernates&lt;/a&gt;最近可以说红的发紫，各种大部头和高深研究也层出不穷。&lt;/p&gt;

&lt;p&gt;学习过程中看了官网和社区提供的不少起步文档，但是手工半手工这一块，总感觉语焉不详，操作性不很好，因此就边学边记，整理成这么一篇东西，本文只涉及操作，理论、架构、前景等内容，还请读者自行翻阅相关材料。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;注意这里按照我的个人习惯，会把所有可执行文件复制到 &lt;code&gt;/usr/local/share&lt;/code&gt;，并链接到 &lt;code&gt;/usr/local/bin&lt;/code&gt;；环境配置文件统一放置到 &lt;code&gt;/etc/sysconfig/kubernetes&lt;/code&gt; 中，这个做法跟手工安装一样，纯属个人恶趣味，没什么具体理由。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;环境准备&#34;&gt;环境准备&lt;/h2&gt;

&lt;p&gt;这里我们使用的是 CentOS 7 为例子。&lt;/p&gt;

&lt;p&gt;接下来内容里面会使用 A, B 两台服务器：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;服务器 A

&lt;ul&gt;
&lt;li&gt;IP: 10.211.55.12&lt;/li&gt;
&lt;li&gt;职责&lt;/li&gt;
&lt;li&gt;Kubernate Master&lt;/li&gt;
&lt;li&gt;Docker Private Registry&lt;/li&gt;
&lt;li&gt;Kubernate Master UI&lt;/li&gt;
&lt;li&gt;Kubernate Node&lt;/li&gt;
&lt;li&gt;ETCD&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;服务器 B

&lt;ul&gt;
&lt;li&gt;IP: 10.211.55.13&lt;/li&gt;
&lt;li&gt;职责&lt;/li&gt;
&lt;li&gt;Kubernate Node&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;etcd-仅-master-需要&#34;&gt;ETCD （仅 Master 需要）&lt;/h3&gt;

&lt;p&gt;可以简单理解为，用来管理容器 IP 的数据库。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/coreos/etcd&#34; target=&#34;_blank&#34;&gt;Github 地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;使用 Yum 直接安装：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yum install -y etcd;&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;注意：安装后需要修改 &lt;code&gt;/etc/etcd/etcd.conf&lt;/code&gt;，将其中的监听地址由 &lt;code&gt;127.0.0.1&lt;/code&gt; 改为 &lt;code&gt;0.0.0.0&lt;/code&gt; 或者其他 Node 可以访问的地址。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;# 启动服务
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd

# 为后续服务提供初始值
etcdctl mk /docker.intranet/network/config &#39;{&amp;quot;Network&amp;quot;:&amp;quot;192.168.0.0/16&amp;quot;}&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;flannel-所有服务器都需要&#34;&gt;Flannel (所有服务器都需要)&lt;/h3&gt;

&lt;p&gt;对前面的 ETCD 有依赖，这里利用这一服务来为 Docker 提供网络分配和部分网络参数生成的任务。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yum install -y flannel&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;接下来编辑配置文件 &lt;code&gt;/etc/sysconfig/flanneld&lt;/code&gt;，将其中的 &lt;code&gt;FLANNEL_ETCD&lt;/code&gt; 地址修改为之前我们配置的地址，并修改 &lt;code&gt;FLANNEL_ETCD_KEY&lt;/code&gt; 为我们使用 etcdctl 设置的值，上文中是 &lt;strong&gt;&amp;ldquo;docker.intranet&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;# 启动服务
systemctl daemon-reload
systemctl enable flanneld
systemctl start flanneld
&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;h2 id=&#34;kubernates-master&#34;&gt;Kubernates Master&lt;/h2&gt;

&lt;h3 id=&#34;下载和安装&#34;&gt;下载和安装&lt;/h3&gt;

&lt;p&gt;首先下载压缩包，并复制其中需要的文件，然后做符号链接到习惯位置。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;wget https://github.com/kubernetes/kubernetes/releases/download/v1.1.3/kubernetes.tar.gz
cd kubernetes/server
tar xf kubernetes-server-linux-amd64.tar.gz
cp -Rf kubernetes/ /usr/local/share
cp kubernetes/cluster/centos/node/scripts/remove-docker0.sh /usr/local/share/kubernetes/server/bin
cd /usr/local/bin
ln -s /usr/local/share/kubernetes/server/bin/hyperkube
ln -s /usr/local/share/kubernetes/server/bin/kube-apiserver
ln -s /usr/local/share/kubernetes/server/bin/kube-controller-manager
ln -s /usr/local/share/kubernetes/server/bin/kubectl
ln -s /usr/local/share/kubernetes/server/bin/kubelet
ln -s /usr/local/share/kubernetes/server/bin/kube-proxy
ln -s /usr/local/share/kubernetes/server/bin/kube-scheduler
ln -s /usr/local/share/kubernetes/server/bin/linkcheck
ln -s /usr/local/share/kubernetes/server/bin/remove-docker0.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;主控服务器 A 除去前面提到的 ETCD 和 FlannelD 两个服务之外，需要三个服务&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Server&lt;/li&gt;
&lt;li&gt;Controller Manager&lt;/li&gt;
&lt;li&gt;Scheduler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;前面下载的包解压之后，&lt;code&gt;kubernetes/cluster/centos/master/scripts&lt;/code&gt; 中有以下脚本分别对应上面三个必要的服务：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;apiserver.sh&lt;/li&gt;
&lt;li&gt;controller-manager.sh&lt;/li&gt;
&lt;li&gt;scheduler.sh&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;这几个脚本大概看了一下，是自动安装过程的一部分，这里拿来进行修改，以适应我们自己的环境，方便应用，也有利于学习，并最终生成一个符合自己洁癖的环境:D&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;apiserver-sh&#34;&gt;apiserver.sh&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MASTER_ADDRESS&lt;/code&gt; 取值为服务器 A 的地址&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ETCD_SERVERS&lt;/code&gt; 取值为ETCD的完整网址&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SERVICE_CLUSTER_IP_RANGE&lt;/code&gt; 中的内容，按照之前我们给 ETCD 初始化的 IP 范围来设置。&lt;/li&gt;
&lt;li&gt;修改过时用法：&lt;code&gt;KUBE_API_ADDRESS=&amp;quot;--insecure-bind-address=${MASTER_ADDRESS}&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改过时用法：&lt;code&gt;KUBE_API_PORT=&amp;quot;--insecure-port=8080&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF&lt;/code&gt; 所在行涉及的文件名，按照个人习惯更改&lt;/li&gt;
&lt;li&gt;用于服务定义的 service 文件，其中的 &lt;code&gt;ExecStart&lt;/code&gt; 要注意修改为我们之前生成连接的位置。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最后把涉及证书的一块删掉，这部分内容比较繁杂，先砍掉为好&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;KUBE_APISERVER_OPTS=&amp;quot;   \${KUBE_LOGTOSTDERR}         \\
                        \${KUBE_LOG_LEVEL}           \\
                        \${KUBE_ETCD_SERVERS}        \\
                        \${KUBE_API_ADDRESS}         \\
                        \${KUBE_API_PORT}            \\
                        \${MINION_PORT}              \\
                        \${KUBE_ALLOW_PRIV}          \\
                        \${KUBE_SERVICE_ADDRESSES}   \\&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;编辑结束之后，运行该脚本，也就完成了 API SERVER 的配置。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;语法错误等情况是在所难免的，可以使用 &lt;code&gt;systemctl status -l [服务名称]&lt;/code&gt; 来检查出错信息，如果信息不够详尽，可以把所生成的环境文件中的 &lt;code&gt;loglevel&lt;/code&gt; 设置为 0。&lt;/p&gt;

&lt;p&gt;另外还可以直接把 ExecStart 中的最终内容直接在命令行执行进行除错。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;controller-manager-sh-和-scheduler-sh&#34;&gt;controller-manager.sh 和 scheduler.sh&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;修改 &lt;code&gt;MASTER_ADDRESS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改文件位置&lt;/li&gt;
&lt;li&gt;执行&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;走到这里，就可以使用 &lt;code&gt;kubectl get nodes&lt;/code&gt; 之类的命令来跟 Master 互动了，浏览器也可以在服务器的 8080 端口获得一点没用的基本信息了。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;docker&#34;&gt;Docker&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;本不想在 Master 机安装 Docker，但是后面的 Kubernates UI，如果不涉及网络操作的话，似乎必须在 Master 上运行，所以只能如此处理了。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Docker 这里我们使用 Docker.io 提供的官方源进行安装：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;# !bin/sh
tee /etc/yum.repos.d/docker.repo &amp;lt;&amp;lt;-&#39;EOF&#39;
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

yum update -y
yum install -y docker-engine
systemctl daemon-reload
systemctl enable docker
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这个配置就不准备使用脚本生成了，会稍微麻烦一些，简单粗暴上代码：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;首先创建文件 &lt;code&gt;/etc/systemd/system/docker.service.d/custom.conf&lt;/code&gt; 这个文件会覆盖 docker.service 中的部分内容&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-conf&#34;&gt;[Service]
Environment=&amp;quot;HTTP_PROXY=10.211.55.2:8016&amp;quot; &amp;quot;NO_PROXY=localhost,center.docker.local,16.158.51.247&amp;quot;
EnvironmentFile=-/run/flannel/docker
EnvironmentFile=-/etc/sysconfig/kubernetes/docker
ExecStartPre=/usr/local/bin/remove-docker0.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;上面文件中包含了代理的设置，用于在公司内网环境下，使用代理服务器获取外部仓库的内容。
两行&lt;code&gt;EnvironmentFile&lt;/code&gt;，其中一个是我们自行编写的 Docker 环境文件，另一个则是 flannel 运行生成的配置文件，而 &lt;code&gt;ExecStartPre&lt;/code&gt; 则是从 Kubernetes 压缩包中的 Docker 配置内容中抄来的，修改了文件位置而已。&lt;/p&gt;

&lt;p&gt;上面看出，Docker 服务对 Flanneld 服务是有依赖的，经过对 &lt;code&gt;systemctl status docker&lt;/code&gt; 的观察，可以看到这一服务在 &lt;code&gt;/usr/lib/systemd/system/docker.service.d&lt;/code&gt; 生成了一份文件，用于声明这一依赖关系。&lt;/p&gt;

&lt;p&gt;编辑这个文件：&lt;code&gt;/etc/systemd/system/multi-user.target.wants/docker.service&lt;/code&gt;
如果位置不同，可以使用 &lt;code&gt;find /etc -name &#39;docker.service&#39;&lt;/code&gt;，ExecStart 一行改为 &lt;code&gt;ExecStart=/usr/bin/docker daemon $DOCKER_OPT_BIP $DOCKER_OPT_MTU $DOCKER_OPTS&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;systemctl daemon-reload
systemctl enable docker
systemctl start docker
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;node&#34;&gt;Node&lt;/h2&gt;

&lt;p&gt;同样的，可以在 &lt;code&gt;kubernetes/cluster/centos/node/scripts&lt;/code&gt; 找到两个 Node 服务的配置脚本，这里先后修改运行 &lt;code&gt;kubelet.sh&lt;/code&gt; 以及 &lt;code&gt;proxy.sh&lt;/code&gt; 即可。&lt;/p&gt;

&lt;h2 id=&#34;kubeletes-ui&#34;&gt;Kubeletes UI&lt;/h2&gt;

&lt;p&gt;Kubeletes UI 的安装很简单：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl create -f cluster/addons/kube-ui/kube-ui-rc.yaml --namespace=kube-system
kubectl create -f cluster/addons/kube-ui/kube-ui-svc.yaml --namespace=kube-system
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;运行之后，可以使用 &lt;code&gt;kubectl get pods --all-namespace&lt;/code&gt; 查看进展状况，第一次创建，会到 Google 仓库下载基础镜像，前面介绍的代理使用技巧可能就派上用场了。等到状态从 Pending 变为 Running 之后，就可以用浏览器访问 &lt;code&gt;http://master:8080/ui&lt;/code&gt; 来查看控制台了。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
