<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>kubeadm | 伪架构师</title>
    <link>/tags/kubeadm/</link>
      <atom:link href="/tags/kubeadm/index.xml" rel="self" type="application/rss+xml" />
    <description>kubeadm</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Mon, 06 Jan 2020 23:58:31 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>kubeadm</title>
      <link>/tags/kubeadm/</link>
    </image>
    
    <item>
      <title>Kubernetes 权威指南第二章校对（1）</title>
      <link>/post/read-k8s-guide-2-1.md/</link>
      <pubDate>Mon, 06 Jan 2020 23:58:31 +0800</pubDate>
      <guid>/post/read-k8s-guide-2-1.md/</guid>
      <description>

&lt;p&gt;权威指南第二章的内容，是 Kubernetes 有史以来最经久不衰的入门话题：安装。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这里出了个巧合，编写第二章时，我负责的是 kubeadm 的部分，搭建虚拟机集群准备开始校对的时候，发现这一批虚拟机被分配的 IP 和写稿时候是一样的——10.211.55.30-32&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;推荐软硬件规格&#34;&gt;推荐软硬件规格&lt;/h2&gt;

&lt;p&gt;实际上我经常用一组 2G 内存的虚拟机安装测试集群，到处翻看了一下，似乎也没看到很确切的说明，&lt;a href=&#34;https://kubernetes.io/docs/setup/best-practices/cluster-large/&#34; target=&#34;_blank&#34;&gt;Building large clusters&lt;/a&gt; 一文给出了一些配置推荐，其中 1-5 节点的微型集群推荐的 Master 节点配置是 1 核 3.75 G 的虚拟机实例。&lt;/p&gt;

&lt;p&gt;其次是 Docker 版本的推荐，建议去 Release Notes 中查找对应的版本说明，例如 1.14 版本的验证列表包含： 1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;过期文档查看方法示例：
&lt;code&gt;https://kubernetes.io/docs/setup/release/notes/&lt;/code&gt; =&amp;gt;
&lt;code&gt;https://v1-14.docs.kubernetes.io/docs/setup/release/notes/&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;kubeadm-init&#34;&gt;kubeadm init&lt;/h2&gt;

&lt;p&gt;在 &lt;code&gt;kubeadm init&lt;/code&gt; 命令配置一节，原本使用了我自己的 Docker hub 仓库，现在 AWS 提供了 gcr 镜像，这里也就顺便改成了：&lt;code&gt;imageRepository: gcr.azk8s.cn/google_containers&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;init&lt;/code&gt; 命令执行过程中，会进行预检，&lt;a href=&#34;https://kubernetes.io/docs/reference/setup-tools/kubeadm/implementation-details/&#34; target=&#34;_blank&#34;&gt;官方文档&lt;/a&gt;中也介绍了预检内容：&lt;/p&gt;

&lt;p&gt;init命令首先会执行一段称为preflight的预检工作，对当前的服务器状况进行检查，会导致检查不通过的情况包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubnernetes 需求：

&lt;ul&gt;
&lt;li&gt;操作系统是否为 Linux；&lt;/li&gt;
&lt;li&gt;内核是否为 3.10+ 或者 4+，并启用特定开关；&lt;/li&gt;
&lt;li&gt;是否有合适的 cgroup 子系统配置；&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Docker 服务不存在或者无法工作；&lt;/li&gt;
&lt;li&gt;crictl sockert 无应答。&lt;/li&gt;
&lt;li&gt;当前用户不是 root；&lt;/li&gt;
&lt;li&gt;主机名称不是有效的 DNS 子域；&lt;/li&gt;
&lt;li&gt;kubelet 版本低于 kubeadm 的要求（通常能够容忍一个小版本号的差异）；&lt;/li&gt;
&lt;li&gt;kubelet 版本比 kubeadm 版本高出一个小版本号以上；&lt;/li&gt;
&lt;li&gt;API Server 的绑定端口（10250、10251以及10252）被占用；&lt;/li&gt;
&lt;li&gt;/etc/kubernetes/manifest 已经存在并且非空；&lt;/li&gt;
&lt;li&gt;/proc/sys/net/bridge/bridge-nf-call-iptables 不存在或者内容中不包含“1”；&lt;/li&gt;
&lt;li&gt;公布地址为 ipv6 并且 /proc/sys/net/bridge/bridge-nf-call-ip6tables 文件不存在或者内容中不包含“1”；&lt;/li&gt;
&lt;li&gt;找不到 ip、iptables、mount 或者 nsenter 命令；&lt;/li&gt;
&lt;li&gt;启用了交换文件；&lt;/li&gt;
&lt;li&gt;如果指定了外部 etcd：

&lt;ul&gt;
&lt;li&gt;如果 etcd 版本低于 3.0.14；&lt;/li&gt;
&lt;li&gt;如果 etcd 中引用了不存在的证书或密钥。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;如果没有指定外部的 etcd：

&lt;ul&gt;
&lt;li&gt;如果 2379 端口被占用；&lt;/li&gt;
&lt;li&gt;如果 Etcd.DataDir 路径已经存在并且非空；&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;如果认证模式为 ABAC：

&lt;ul&gt;
&lt;li&gt;abac_policy.json 文件不存在。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;如果认证模式为 WebHook：

&lt;ul&gt;
&lt;li&gt;webhook_authz.conf 不存在。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;常见的三个操作&#34;&gt;常见的三个操作&lt;/h2&gt;

&lt;p&gt;以CentOS 7.5 Minimal版本为例，一般会有三个需要修改的地方：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;关闭交换文件：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-plaintext&#34;&gt;swapoff -a
删除 /etc/fstab/ 中的 swap 一行，重新启动。
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;使用 sysctl 设置net.bridge.bridge-nf-call-iptables 和 net.ipv4.ip_forward 为 1。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;设置 Docker 配置文件 /etc/docker/daemon.json 内容如下，设置 Docker的 cgroupdriver 为 systemd，并重新启动 Docker 服务：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{
&amp;quot;exec-opts&amp;quot;: [&amp;quot;native.cgroupdriver=systemd&amp;quot;],
&amp;quot;log-driver&amp;quot;: &amp;quot;json-file&amp;quot;,
&amp;quot;log-opts&amp;quot;: {
&amp;quot;max-size&amp;quot;: &amp;quot;100m&amp;quot;
},
&amp;quot;storage-driver&amp;quot;: &amp;quot;overlay2&amp;quot;,
&amp;quot;storage-opts&amp;quot;: [
&amp;quot;overlay2.override_kernel_check=true&amp;quot;
]
}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;单节点集群&#34;&gt;单节点集群&lt;/h2&gt;

&lt;p&gt;该操作并非删除标签，而是去污点操作。&lt;/p&gt;

&lt;h2 id=&#34;参考连接&#34;&gt;参考连接&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;预检：&lt;code&gt;https://kubernetes.io/docs/reference/setup-tools/kubeadm/implementation-details/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Building large clusters：&lt;code&gt;https://kubernetes.io/docs/setup/best-practices/cluster-large/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Containerd 1.1.0 尝鲜记</title>
      <link>/post/containerd-kubeadm/</link>
      <pubDate>Wed, 30 May 2018 00:41:44 +0800</pubDate>
      <guid>/post/containerd-kubeadm/</guid>
      <description>

&lt;p&gt;&lt;a href=&#34;https://blog.fleeto.us/post/kubernetes-containerd-integration-goes-ga/&#34; target=&#34;_blank&#34;&gt;Containerd 1.1.0 的 Kubernetes 支持已经进入可用阶段&lt;/a&gt;，Kubernetes 1.10 和未来的的 Docker 版本都会以此为基础，作为一个熟练软件安装工，自然是要先睹为快了。&lt;/p&gt;

&lt;p&gt;这里使用 Kubeadm 进行测试。&lt;/p&gt;

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

&lt;p&gt;首先进行 Kubeadm 的环境准备：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;安装 libseccomp, conntrack&lt;/li&gt;
&lt;li&gt;关闭防火墙服务&lt;/li&gt;
&lt;li&gt;开启 sysctl：&lt;code&gt;ip_forward&lt;/code&gt;、&lt;code&gt;net.bridge.bridge-nf-call-iptables&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;参考&lt;a href=&#34;https://kubernetes.io/docs/tasks/tools/install-kubeadm/&#34; target=&#34;_blank&#34;&gt;官方指南&lt;/a&gt;，安装 kubeadm、kubelet 以及 kubectl，此处暂时不启动 kubelet 服务。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;安装-contaierd&#34;&gt;安装 contaierd&lt;/h2&gt;

&lt;p&gt;下载 &lt;a href=&#34;https://storage.googleapis.com/cri-containerd-release/cri-containerd-1.1.0.linux-amd64.tar.gz&#34; target=&#34;_blank&#34;&gt;cri-containerd 1.1.0&lt;/a&gt;，并解压，其中包含 &lt;code&gt;/usr&lt;/code&gt;、&lt;code&gt;/etc&lt;/code&gt; 以及 &lt;code&gt;opt&lt;/code&gt; 三个目录，这里我们只是用前两个目录的内容，目录结构如下，直接复制即可：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;├── etc
│   ├── crictl.yaml
│   └── systemd
│       └── system
│           └── containerd.service
└── usr
    └── local
        ├── bin
        │   ├── containerd
        │   ├── containerd-release
        │   ├── containerd-shim
        │   ├── containerd-stress
        │   ├── crictl
        │   ├── critest
        │   └── ctr
        └── sbin
            └── runc
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;crictl.yaml&lt;/code&gt;：crictl 的配置文件，缺省包含一行 &lt;code&gt;runtime-endpoint: unix:///run/containerd/containerd.sock&lt;/code&gt;，指定运行时的连接方式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;containerd.service&lt;/code&gt;：服务文件，设置自动启动即可。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctr&lt;/code&gt;：containerd 客户端&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crictl&lt;/code&gt;：cri 客户端&lt;/li&gt;
&lt;li&gt;&lt;code&gt;runc&lt;/code&gt;：运行时，contaienrd 依赖项&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这里可以发现，并没有包含 containerd 自己的配置文件，可以使用 &lt;code&gt;containerd config default &amp;gt; /etc/containerd/config.toml&lt;/code&gt; 命令，来生成缺省配置文件，然后自行变更。例如可以&lt;a href=&#34;https://github.com/containerd/cri/blob/v1.0.0/docs/registry.md&#34; target=&#34;_blank&#34;&gt;修改仓库镜像地址&lt;/a&gt;。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;另外对国内用户比较重要的一点是，仍然是可以使用环境变量方式的配置来设置 &lt;code&gt;HTTP_PROXY&lt;/code&gt; 以及 &lt;code&gt;NO_PROXY&lt;/code&gt; 的内容。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;配置完成后，使用 &lt;code&gt;systemctl&lt;/code&gt; 启动服务。&lt;/p&gt;

&lt;h2 id=&#34;载入镜像&#34;&gt;载入镜像&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;docker.io/coredns/coredns:1.0.6&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/kube-proxy-amd64:v1.10.3&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/etcd-amd64&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/kube-apiserver-amd64:v1.10.3&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/kube-controller-manager-amd64:v1.10.3&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/kube-proxy-amd64:v1.10.3&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/kube-scheduler-amd64:v1.10.3&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/pause:3.1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ctr 的镜像载入命令&lt;/strong&gt;：&lt;code&gt;ctr cri load image.tar&lt;/code&gt;，似乎不支持 gz。&lt;/p&gt;

&lt;h2 id=&#34;配置-kubelet-使用-containerd&#34;&gt;配置 Kubelet 使用 containerd&lt;/h2&gt;

&lt;p&gt;简单的在 Kubelet 的环境变量上加入如下内容，再启动 Kubelet 服务：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Service]
Environment=&amp;quot;KUBELET_EXTRA_ARGS=--runtime-cgroups=/system.slice/containerd.service --container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;kubeadm-集群安装&#34;&gt;Kubeadm 集群安装&lt;/h2&gt;

&lt;p&gt;这里提供一个简单的初始化命令：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;kubeadm init \
--pod-network-cidr=192.168.0.0/16 \
--feature-gates CoreDNS=true \
--ignore-preflight-errors=Service-Docker \
--ignore-preflight-errors=SystemVerification \
--kubernetes-version=v1.10.3 # 防止 kubeadm 向服务器查询镜像列表。
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Kubeadm 缺省情况下依旧是需要检查 Docker 的运行情况的，因此这里我们使用 &lt;code&gt;--ignore-preflight-errors&lt;/code&gt; 开关关闭这项检查。&lt;/p&gt;

&lt;p&gt;Master 初始化结束之后，就可以跟随 kubeadm 指示，进入其他节点，运行 &lt;code&gt;kubeadm join&lt;/code&gt; 命令来加入集群了，加入命令同样需要设置 &lt;code&gt;--ignore-preflight-errors=all&lt;/code&gt; 来规避 Docker 检查。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;接下来可以按照自己喜好安装网络插件了。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;可以使用 &lt;code&gt;kubectl describe nodes [node name]&lt;/code&gt; 来检查节点信息：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;...
Container Runtime Version:  containerd://1.1.0
Kubelet Version:            v1.10.3
Kube-Proxy Version:         v1.10.3
PodCIDR:                     192.168.0.0/24
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里可以看到，运行时已经更新为 &lt;code&gt;containerd://1.1.0&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&#34;后记&#34;&gt;后记&lt;/h2&gt;

&lt;p&gt;正如在前面文章提到的，containerd 并非 Docker 的替代品，只是一个子集，独立使用是很困难的，因此还是比较适合用于 Kubelet 控制之下的容器运行支持。&lt;/p&gt;

&lt;h2 id=&#34;下载链接以及参考链接&#34;&gt;下载链接以及参考链接&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;cri-containerd 1.1.0&lt;/strong&gt;：&lt;code&gt;https://storage.googleapis.com/cri-containerd-release/cri-containerd-1.1.0.linux-amd64.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kubeadm 安装指南&lt;/strong&gt;：&lt;code&gt;https://kubernetes.io/docs/tasks/tools/install-kubeadm/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;containerd 安装指南&lt;/strong&gt;：&lt;code&gt;https://github.com/containerd/containerd/releases&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Containerd 1.1.0 的 Kubernetes 支持已经进入可用阶段&lt;/strong&gt;： &lt;code&gt;https://blog.fleeto.us/post/kubernetes-containerd-integration-goes-ga/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Kubeadm 离线安装器 1.10</title>
      <link>/post/kubeadm-offline-installer/</link>
      <pubDate>Mon, 02 Apr 2018 05:30:37 +0800</pubDate>
      <guid>/post/kubeadm-offline-installer/</guid>
      <description>

&lt;h2 id=&#34;项目地址-https-github-com-fleeto-kubeadm-offline-installer&#34;&gt;项目地址：&lt;a href=&#34;https://github.com/fleeto/kubeadm-offline-installer&#34; target=&#34;_blank&#34;&gt;https://github.com/fleeto/kubeadm-offline-installer&lt;/a&gt;&lt;/h2&gt;

&lt;h2 id=&#34;更新内容&#34;&gt;更新内容&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;升级到了 Kubernetes 1.10。&lt;/li&gt;
&lt;li&gt;使用 CoreDNS 代替了原来的 KubeDNS。&lt;/li&gt;
&lt;li&gt;升级 Calico 网络插件为 3.0.4 版。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;仅在 centos 7 minimal 测试通过。&lt;/p&gt;

&lt;h2 id=&#34;使用方法&#34;&gt;使用方法：&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;需要 2.4.0 以上版本的 ansible。&lt;/li&gt;
&lt;li&gt;从 &lt;a href=&#34;https://github.com/fleeto/kubeadm-offline-installer/releases&#34; target=&#34;_blank&#34;&gt;Releases 页&lt;/a&gt; 下载和解压所需版本。&lt;/li&gt;
&lt;li&gt;编写 Host 文件，分组方式可以参考 &lt;code&gt;hosts/hosts.sample&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;group_vars/all&lt;/code&gt; 中有部分可以修改的变量。&lt;/li&gt;
&lt;li&gt;运行脚本。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/local/bin&lt;/code&gt; 目录下会生成初始化和加入集群的脚本。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/kubernetes&lt;/code&gt; 目录中包含证书和配置文件。&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Kubeadm offline installer 升级到 1.7.0 版本</title>
      <link>/post/kubeadm-offline-installer-1.7.0/</link>
      <pubDate>Thu, 06 Jul 2017 23:19:51 +0800</pubDate>
      <guid>/post/kubeadm-offline-installer-1.7.0/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/fleeto/kubeadm-offline-installer/releases&#34; target=&#34;_blank&#34;&gt;仓库地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;本来做这玩意的初衷就是，Kubeadm 和 Kubernetes 是一家人，升级比较方便跟得住。未曾想第一次大版本升级，就遇到了个不大不小的坑，导致安装无法完成。这个 Issue 会在 1.7.1 修补，下面介绍一下曲线救国的安装方式。&lt;/p&gt;

&lt;p&gt;这一问题的似乎是 kubeadm 的更新破坏了 TLS 自动授权过程造成的，具体症状是：主节点的 &lt;code&gt;kubeadm init&lt;/code&gt; 完成之后，在其他节点上使用 &lt;code&gt;kubeadm join --token=xxxx host_ip:host_port&lt;/code&gt; 命令加入集群时，集群会反复输出错误信息，大意是 &lt;code&gt;kube-public&lt;/code&gt; 命名空间中名为 &lt;code&gt;cluster-info&lt;/code&gt; 的 ConfigMap 中没有对应 token 的签署记录。&lt;/p&gt;

&lt;p&gt;使用 kubectl 查看该 ConfigMap，和 1.6.6 的集群作对照（是的，安装的够快，想要什么版本都容易），发现 1.7.0 里面这个 ConfigMap 的元素列表确缺少这一块内容。&lt;/p&gt;

&lt;p&gt;既然如此，看样子手工签署也是要不少工夫，干脆转头使用上一版本（1.6.6）的 kubeadm，使用指定版本的方式来安装 1.7.0 的集群。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubeadm init&lt;/code&gt; 过程会顺利完成，然而在 &lt;code&gt;kubeadm join&lt;/code&gt; 过程中，会卡在 &lt;code&gt;CSR&lt;/code&gt; 阶段，经过翻查文档，1.7.0 的自动授权方式有变化，废弃了原有的根据 Group 自动通过的开关，一不做二不休，在 Playbook 的 Master Role 中新建一个 Cron Job，每分钟执行一次如下命令：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#!/bin/sh
TOKEN=`kubectl get csr | grep csr | grep -i pending | cut -f1 -d &amp;quot; &amp;quot; | head -n 1`
if [[ -n &amp;quot;$TOKEN&amp;quot; ]]; then
  kubectl certificate approve $TOKEN
  echo &amp;quot;CSR: $TOKEN had been approved.&amp;quot; &amp;gt;&amp;gt; /var/log/auto_approval.log
else
  echo &amp;quot;CSR not found.&amp;quot; &amp;gt;&amp;gt; /var/log/auto_approval.log
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;简单说就是获取在途的 CSR，进行 Approve。
这样在后面的节点进行加入的时候，主节点会每分钟进行一次 Approve，在所有节点成功加入之后，调用 Cleanup 角色，禁用这一功能即可。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;最后，Github 不建议在版本库中存放二进制文件，这里我将所有二进制文件集中到了根目录的 &lt;code&gt;files&lt;/code&gt; 目录下，要顺利使用这一脚本，一定要在 Release 页面中下载相应的压缩包来使用。&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>kubeadm 踩坑记</title>
      <link>/post/kubeadm-traps/</link>
      <pubDate>Tue, 27 Jun 2017 08:14:05 +0800</pubDate>
      <guid>/post/kubeadm-traps/</guid>
      <description>&lt;p&gt;Kubeadm 是个让我爱恨交加的东西，一方面，我不认为一个生产集群应该使用这样一个第三方工具进行在线安装，尤其是在目前这种网络环境之下；而另外一方面，Kubeadm 这一工具是随 Kubernetes 同步更新的，其中包含了大量的集群配置方面的最佳实践，是追新的最佳参考，所以这个讨厌的东西的运行是必须需要得到保障的。kubeadm 的执行过程沉默到令人发指，因此下面分享几个使用过程中遇到的一些问题和解决的思路和方法，希望对同行们有所帮助。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;下面的例子是基于 kubeadm 1.6.6 + Centos 7 的执行过程记录的。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;写入 yum repo 并进行安装之后，利用 &lt;code&gt;systemctl enable kubelet&lt;/code&gt; 启用 kubelet 服务之后，只要运行一下 &lt;code&gt;systemctl daemon-reload&lt;/code&gt;即可，这一服务的启动需要 kubeadm 生成的证书和配置文件等的支持，因此无需进行启动。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubeadm init&lt;/code&gt;过程首先会检查代理服务器，确定跟 kube-apiserver 的 https 连接方式，如果有代理设置，会提出警告。&lt;/li&gt;
&lt;li&gt;接下来会对 sysctl 进行检查，我这里需要执行 &lt;code&gt;sysctl net.bridge.bridge-nf-call-iptables=1&lt;/code&gt; ，对这一参数进行调整，解决他的警告。&lt;/li&gt;
&lt;li&gt;接下来进入最抓狂的一个等待时间，屏幕显示为&lt;code&gt;[apiclient] Created API client, waiting for the control plane to become ready&lt;/code&gt;，这一过程中会遇到大多数的坑，我一般会另外启动一个连接或者 tmux 窗口，进行观察和除错：

&lt;ul&gt;
&lt;li&gt;这里已经做好运行 kubelet 服务的准备，因此这一时间内，我们可以利用&lt;code&gt;systemctl statusl -l kubelet&lt;/code&gt;对服务的启动状况进行检查，目前比较容易遇到的是 kubectl 和 docker 两个服务的&lt;code&gt;cgroup-driver&lt;/code&gt;不一致的问题，这里编辑文件&lt;code&gt;/etc/systemd/system/kubelet.service.d/10-kubeadm.conf&lt;/code&gt;，修改这一参数值为跟 docker 一致的&lt;code&gt;cgroupfs&lt;/code&gt;即可。&lt;strong&gt;这一步可以在 kubeadm init 之前执行完成&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;kubelet 启动之后，会尝试运行系统组件的 Pod，这里我们可以通过观察&lt;code&gt;docker images&lt;/code&gt;的镜像列表来观察是否能够顺利进行下载。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;镜像下载完成之后就会开始运行各个系统组件，因此也是事故最为集中的阶段&lt;/strong&gt;，我们可以使用&lt;code&gt;docker ps&lt;/code&gt;、&lt;code&gt;docker logs&lt;/code&gt;、&lt;code&gt;docker inspect&lt;/code&gt;几个命令，逐个查看组件的运行情况，对失败组件的原因进行排除，之前提过的&lt;code&gt;resolv.conf&lt;/code&gt;的故障就是在这一阶段发现并排除的。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>kubeadm 安装 Kubernetes 1.6.2</title>
      <link>/post/kubeadm-install-k8s/</link>
      <pubDate>Mon, 08 May 2017 19:20:39 +0800</pubDate>
      <guid>/post/kubeadm-install-k8s/</guid>
      <description>

&lt;p&gt;因为一些莫可名状的原因，国内网络使用 Kubeadm 颇有难度，这里大概说一下过程中的一些坑。&lt;/p&gt;

&lt;p&gt;主体流程遵循官网指南：&lt;strong&gt;&lt;a href=&#34;https://kubernetes.io/docs/getting-started-guides/kubeadm/&#34; target=&#34;_blank&#34;&gt;https://kubernetes.io/docs/getting-started-guides/kubeadm/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&#34;1-4-准备工作&#34;&gt;&lt;sup&gt;1&lt;/sup&gt;&amp;frasl;&lt;sub&gt;4&lt;/sub&gt; 准备工作&lt;/h3&gt;

&lt;p&gt;这里用包管理的方式安装 kubeadm、Docker 等组件。需要注意一点点的是，如果用的非 Root 用户，要注意 sudo 的时候的环境代理设置问题。或者干脆在 apt/yum 的配置文件中写入代理服务器。&lt;/p&gt;

&lt;p&gt;另外这里安装 Docker 之后，注意给 Docker 配置代理。或者可以直接想法子搞到下面列表中的镜像，并导入 Docker 之中：&lt;/p&gt;

&lt;h3 id=&#34;镜像准备&#34;&gt;镜像准备&lt;/h3&gt;

&lt;p&gt;下面提到的镜像基于目前的 1.6.2 版本，每次更新都会有不同。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Image&lt;/th&gt;
&lt;th&gt;Ver&lt;/th&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;gcr.io/google_containers/kube-proxy-amd64&lt;/td&gt;
&lt;td&gt;v1.6.2&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;gcr.io/google_containers/kube-controller-manager-amd64&lt;/td&gt;
&lt;td&gt;v1.6.2&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;gcr.io/google_containers/kube-apiserver-amd64&lt;/td&gt;
&lt;td&gt;v1.6.2&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;gcr.io/google_containers/kube-scheduler-amd64&lt;/td&gt;
&lt;td&gt;v1.6.2&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;gcr.io/google_containers/etcd-amd64&lt;/td&gt;
&lt;td&gt;3.0.17&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;gcr.io/google_containers/pause-amd64&lt;/td&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;gcr.io/google_containers/k8s-dns-sidecar-amd64&lt;/td&gt;
&lt;td&gt;1.14.1&lt;/td&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;gcr.io/google_containers/k8s-dns-kube-dns-amd64&lt;/td&gt;
&lt;td&gt;1.14.1&lt;/td&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64&lt;/td&gt;
&lt;td&gt;1.14.1&lt;/td&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;gcr.io/google_containers/etcd&lt;/td&gt;
&lt;td&gt;2.2.1&lt;/td&gt;
&lt;td&gt;Calico&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;quay.io/calico/node&lt;/td&gt;
&lt;td&gt;v1.1.3&lt;/td&gt;
&lt;td&gt;Calico&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;quay.io/calico/cni&lt;/td&gt;
&lt;td&gt;v1.8.0&lt;/td&gt;
&lt;td&gt;Calico&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;quay.io/calico/kube-policy-controller&lt;/td&gt;
&lt;td&gt;v0.5.4&lt;/td&gt;
&lt;td&gt;Calico&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;2-4-master-初始化&#34;&gt;&lt;sup&gt;2&lt;/sup&gt;&amp;frasl;&lt;sub&gt;4&lt;/sub&gt; Master 初始化&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;kubeadm init&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;这里的几个问题：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;如果准备采用 flannel 插件，需要 &lt;code&gt;-pod-network-cidr 10.244.0.0/16&lt;/code&gt; 参数&lt;/li&gt;
&lt;li&gt;Ubuntu 下可能会出现无限等待 Node 加入的情况，可能的原因是 /etc/resolv.conf 中有关于 localhost 的 search 记录，删掉这行就能解决。&lt;/li&gt;
&lt;li&gt;如果准备采用 Calico 插件，那么要注意 Calico 的 YAML 中的 ip pool 跟集群设置一致。&lt;/li&gt;
&lt;li&gt;如果不是预先准备好的备份，过程会比较长，耐心。。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Init 成功之后会出一堆文本信息，其中包含几点内容，最好保存下来：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;自动生成的 kubectl config 文件，可以复制到 ~/.kube/config 中作为缺省 kubectl 使用。&lt;/li&gt;
&lt;li&gt;把新节点加入集群的方法。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;另外这里还有个提示——没有安装 Pod Network。&lt;/p&gt;

&lt;h2 id=&#34;3-4-安装-pod-network&#34;&gt;&lt;sup&gt;3&lt;/sup&gt;&amp;frasl;&lt;sub&gt;4&lt;/sub&gt; 安装 Pod Network&lt;/h2&gt;

&lt;p&gt;这一步很重要，所有的应用包括 Kube DNS 在内，都依赖于此。&lt;/p&gt;

&lt;p&gt;如上文所示，准备使用的是 Calico，这里值得注意的一坑是，不同版本的 Kubernetes 会有不同的 Calico 安装，1.6 版本应该使用的是：&lt;code&gt;kubectl apply -f http://docs.projectcalico.org/v2.1/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://docs.projectcalico.org/v2.1/getting-started/kubernetes/installation/hosted/kubeadm/&lt;/code&gt; 还有一些其他的安装方式可以参考。&lt;/p&gt;

&lt;h3 id=&#34;calico-的注意事项&#34;&gt;Calico 的注意事项&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;他的 ETCD 服务器要求装在 Master 所在的 Node 上，使用的是 nodeSelector 的方式，选择标签：&lt;code&gt;node-role.kubernetes.io/master: &amp;quot;&amp;quot;&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;上文提到的 pod network cidr 和 ip pool 的一致性问题&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--service-cidr&lt;/code&gt; 和 IP Pool 不能重叠&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;4-4-加入节点&#34;&gt;&lt;sup&gt;4&lt;/sup&gt;&amp;frasl;&lt;sub&gt;4&lt;/sub&gt; 加入节点&lt;/h3&gt;

&lt;p&gt;在其他 Node 上做好准备工作之后，用&lt;code&gt;kubeadm init&lt;/code&gt;命令中提到的&lt;code&gt;kubeadmin join&lt;/code&gt;方法加入集群。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
