<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>kind | 伪架构师</title>
    <link>/tags/kind/</link>
      <atom:link href="/tags/kind/index.xml" rel="self" type="application/rss+xml" />
    <description>kind</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Thu, 29 Aug 2019 02:57:10 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>kind</title>
      <link>/tags/kind/</link>
    </image>
    
    <item>
      <title>Funny Kind</title>
      <link>/post/funny-kind/</link>
      <pubDate>Thu, 29 Aug 2019 02:57:10 +0800</pubDate>
      <guid>/post/funny-kind/</guid>
      <description>&lt;p&gt;昨天的帖子可能是这个公众号诞生以来好笑的一幕——这个实操环节因为错上加错，收获了一个正确结果，以及好几个“在看”。&lt;/p&gt;

&lt;p&gt;事实上我们编写的 &lt;code&gt;config.yaml&lt;/code&gt;，在文末的命令行中并没有引用，所以&lt;strong&gt;其中的快速安装的结果完全是 Kind 的功劳，和之前的证书操作、镜像操作没有一毛钱的关系&lt;/strong&gt;。Kind 镜像自带了 Kubeadm 部署所需内容，因此它的的离线安装正常来说只需要：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker 正常运转&lt;/li&gt;
&lt;li&gt;本地有 Kind 镜像。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;私库之类的东西，完全不需要。&lt;/p&gt;

&lt;p&gt;昨天的错误原因主要在于：Docker 信任的 CA，并不被 Dind 所接受，所以要使用私库，首先要把自签发 CA 加入 Kind 镜像的信任列表，源码显示，它用的是 Ubuntu，因此可以这样构建一个新镜像：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-dockerfile&#34;&gt;FROM kindest/node:v1.15.3
COPY ca.crt /usr/local/share/ca-certificates/ca.crt
RUN update-ca-certificates
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;有了这个信任关系，就可以从容的使用私库了，例如：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#!/bin/sh
kind create cluster --image kindest/node:customize \
    --config config/kind-config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;使用这个镜像，就会加入对私库的信任关系，也就能够满足使用私库的需求了。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>使用 Kind 构建离线集群安装包</title>
      <link>/post/kind-offline/</link>
      <pubDate>Tue, 27 Aug 2019 23:29:07 +0800</pubDate>
      <guid>/post/kind-offline/</guid>
      <description>

&lt;p&gt;&lt;a href=&#34;https://github.com/kubernetes-sigs/kind&#34; target=&#34;_blank&#34;&gt;Kind（Kubernetes in Docker）&lt;/a&gt; 是一个 Kubernetes 孵化项目，它使用 Docker 为节点进行 Kubernetes 的快速部署，可以方便的搭建 Kubernetes 集群，虽然简单，但也是通过 &lt;a href=&#34;https://landscape.cncf.io/selected=kind&#34; target=&#34;_blank&#34;&gt;Kubernetes 一致性认证&lt;/a&gt;的安装器，因此用来做测试还是比较可靠的。&lt;/p&gt;

&lt;p&gt;按照社区的一贯德行，安装过程虽然只要有个 Docker 就可以了，但是对网络有严重的依赖。在 Workshop 之类的场合，会受到很大限制。这种情况下，有一个离线包就会非常方便了。&lt;/p&gt;

&lt;h2 id=&#34;获取安装文件&#34;&gt;获取安装文件&lt;/h2&gt;

&lt;p&gt;本文会从一个新安装的 CentOS Mini 服务器为例，逐个步骤展示构建离线 Kind 安装包的过程。最后再安装一个&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这里假设这个服务器有“优秀”的互联网连接。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;docker-离线包&#34;&gt;Docker 离线包&lt;/h3&gt;

&lt;p&gt;首先我们要为 Docker 的离线安装准备好 RPM 包，新建一个目录 &lt;code&gt;rpms&lt;/code&gt;，用来下载安装包：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ yum install --downloadonly --downloaddir=./rpms \
    yum-utils device-mapper-persistent-data lvm2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;执行完毕之后，会在 rpms 目录中找到 Docker 的依赖包，接下来获取 Docker 的 RPM。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
$ yum --downloadonly --downloaddir=./rpms \
    install docker-ce docker-ce-cli containerd.io  
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如此就获得了 Docker 自身以及所有的依赖 RPM 包。可以使用 rpm 直接安装。并启动 Docker 服务。&lt;/p&gt;

&lt;h3 id=&#34;kubeadm-和-kubectl&#34;&gt;Kubeadm 和 Kubectl&lt;/h3&gt;

&lt;p&gt;根据&lt;a href=&#34;https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-runtime&#34; target=&#34;_blank&#34;&gt;官方文档&lt;/a&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ cat &amp;lt;&amp;lt;EOF &amp;gt; /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

$ yum install --downloadonly --downloaddir=./rpms \
kubectl kubeadm --disableexcludes=kubernetes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里做了一点修改：不再安装 kubelet，也不启动服务，仅用于获取安装包。&lt;/p&gt;

&lt;h3 id=&#34;获取镜像&#34;&gt;获取镜像&lt;/h3&gt;

&lt;p&gt;使用 rpm 安装 kubeadm，开始获取安装所需的所有镜像：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ kubeadm config images list --kubernetes-version=v1.15.3
k8s.gcr.io/kube-apiserver:v1.15.3
k8s.gcr.io/kube-controller-manager:v1.15.3
k8s.gcr.io/kube-scheduler:v1.15.3
k8s.gcr.io/kube-proxy:v1.15.3
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;拿到列表了就可以逐个拉取处理镜像，这里给个小脚本：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#!/bin/sh
for image in `kubeadm config images list --kubernetes-version=$1`
do
  image_name=`echo ${image} | sed &amp;quot;s/k8s.gcr.io.//g&amp;quot;`
  docker pull &amp;quot;${image}&amp;quot;
  docker tag &amp;quot;${image}&amp;quot; &amp;quot;${image_name}&amp;quot;
  file_name=&amp;quot;${image_name}.tgz&amp;quot;
  docker save &amp;quot;${image_name}&amp;quot; | gzip &amp;gt; &amp;quot;${file_name}&amp;quot;
  docker rmi &amp;quot;${image}&amp;quot;
  docker rmi &amp;quot;${image_name}&amp;quot;
done
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这样我们就有了所有 Kubeadm 所需的镜像。另外我们还需要两个辅助镜像：&lt;code&gt;kindest/node:v1.15.3&lt;/code&gt; 以及 &lt;code&gt;registry:2.7.1&lt;/code&gt;。&lt;/p&gt;

&lt;h3 id=&#34;cfssl-和-kind&#34;&gt;CFSSL 和 Kind&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ wget https://github.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-linux-amd6
$ wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
$ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这样我们已经获得了所有安装所需的文件。可以进入离线步骤了。&lt;/p&gt;

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

&lt;h3 id=&#34;rpm-安装&#34;&gt;RPM 安装&lt;/h3&gt;

&lt;p&gt;把前面获得的 Kubectl 安装起来。&lt;/p&gt;

&lt;h3 id=&#34;签发证书&#34;&gt;签发证书&lt;/h3&gt;

&lt;p&gt;使用 CFSSL 生成证书，首先生成 CA。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ca-csr.json&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{
    &amp;quot;CN&amp;quot;: &amp;quot;Kubernetes CA&amp;quot;,
    &amp;quot;key&amp;quot;: {
        &amp;quot;algo&amp;quot;: &amp;quot;rsa&amp;quot;,
        &amp;quot;size&amp;quot;: 2048
    },
    &amp;quot;ca&amp;quot;: {
       &amp;quot;expiry&amp;quot;: &amp;quot;87600h&amp;quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;cfssl gencert -initca ca-csr.json | cfssljson -bare ca&lt;/code&gt; 生成 CA 证书。&lt;/p&gt;

&lt;p&gt;把证书加入信任列表：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ update-ca-trust enable
$ cp ca.pem /etc/pki/ca-trust/source/anchors/
$ update-ca-trust extract
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;更新之后，需要重启 Docker 服务，让 Docker 也信任这一 CA。&lt;/p&gt;

&lt;p&gt;然后是生成镜像库所需的服务器证书：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;config.json&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{
    &amp;quot;signing&amp;quot;: {
        &amp;quot;default&amp;quot;: {
            &amp;quot;expiry&amp;quot;: &amp;quot;87600h&amp;quot;
        },
        &amp;quot;profiles&amp;quot;: {
            &amp;quot;server&amp;quot;: {
                &amp;quot;expiry&amp;quot;: &amp;quot;87600h&amp;quot;,
                &amp;quot;usages&amp;quot;: [
                    &amp;quot;signing&amp;quot;,
                    &amp;quot;key encipherment&amp;quot;,
                    &amp;quot;server auth&amp;quot;,
                    &amp;quot;client auth&amp;quot;
                ]
            },
            &amp;quot;user&amp;quot;: {
                &amp;quot;expiry&amp;quot;: &amp;quot;87600h&amp;quot;,
                &amp;quot;usages&amp;quot;: [
                    &amp;quot;signing&amp;quot;,
                    &amp;quot;key encipherment&amp;quot;,
                    &amp;quot;client auth&amp;quot;
                ]
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;server.json&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{
    &amp;quot;CN&amp;quot;: &amp;quot;Registry&amp;quot;,
    &amp;quot;hosts&amp;quot;: [
      &amp;quot;127.0.0.1&amp;quot;,&amp;quot;10.211.55.10&amp;quot;
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;接下来签发证书：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ cfssl gencert -ca ca.pem -ca-key ca-key.pem -config=config.json \
     -profile=server server.json | cfssljson -bare registry
&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt;这里的 IP 地址要跟本地地址对应。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;启动镜像库&#34;&gt;启动镜像库&lt;/h3&gt;

&lt;p&gt;使用 &lt;code&gt;docker load -i&lt;/code&gt;，载入了 registry 镜像，把仓库运行起来：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#!/bin/sh
docker run -d \
   --name=&amp;quot;registry2&amp;quot; \
   -v &amp;quot;$(pwd)/storage&amp;quot;:/var/lib/registry \
   -p 5000:5000 \
  -v &amp;quot;$(pwd)/certs&amp;quot;:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.pem \
  -e REGISTRY_HTTP_TLS_KEY=/certs/registry-key.pem \
   --restart=always \
   registry:2.7.1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如此就在 5000 端口启动了一个镜像库。&lt;/p&gt;

&lt;h3 id=&#34;推送镜像到私库&#34;&gt;推送镜像到私库&lt;/h3&gt;

&lt;p&gt;把前面的所有镜像都载入 Docker，Tag 之后推入私库，最后在私库里就有了一系列的镜像，例如 &lt;code&gt;10.211.55.10:5000/pause:3.1&lt;/code&gt;。&lt;/p&gt;

&lt;h3 id=&#34;安装集群&#34;&gt;安装集群&lt;/h3&gt;

&lt;p&gt;为了能够使用私库的镜像，要对 Kind 进行一点配置：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
  apiVersion: kubeadm.k8s.io/v1beta2
  kind: ClusterConfiguration
  metadata:
    name: config
  networking:
    serviceSubnet: 10.0.0.0/16
  imageRepository: 10.211.55.10:5000
  nodeRegistration:
    kubeletExtraArgs:
      pod-infra-container-image: 10.211.55.10:5000/pause:3.1
- |
  apiVersion: kubeadm.k8s.io/v1beta2
  kind: InitConfiguration
  metadata:
    name: config
  networking:
    serviceSubnet: 10.0.0.0/16
  imageRepository: 10.211.55.10:5000
nodes:
- role: control-plane
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ kind create cluster --image kindest/node:v1.15.3
Creating cluster &amp;quot;kind&amp;quot; ...
 ✓ Ensuring node image (kindest/node:v1.15.3) 🖼
 ✓ Preparing nodes 📦
 ✓ Creating kubeadm config 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Cluster creation complete. You can now use the cluster with:

export KUBECONFIG=&amp;quot;$(kind get kubeconfig-path --name=&amp;quot;kind&amp;quot;)&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如此这般，Kind 集群就启动了。我们可以测试一下：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ export KUBECONFIG=&amp;quot;$(kind get kubeconfig-path --name=&amp;quot;kind&amp;quot;)&amp;quot;
$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                         READY   STATUS    RESTARTS   AGE
kube-system   coredns-5c98db65d4-lkg92                     1/1     Running   0          72m
kube-system   coredns-5c98db65d4-rhv7g                     1/1     Running   0          72m
kube-system   etcd-kind-control-plane                      1/1     Running   0          71m
kube-system   kindnet-892gh                                1/1     Running   1          72m
kube-system   kube-apiserver-kind-control-plane            1/1     Running   0          71m
kube-system   kube-controller-manager-kind-control-plane   1/1     Running   0          71m
kube-system   kube-proxy-nd4ml                             1/1     Running   0          72m
kube-system   kube-scheduler-kind-control-plane            1/1     Running   0          71m
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;离线环境下部署镜像&#34;&gt;离线环境下部署镜像&lt;/h2&gt;

&lt;p&gt;Kind 提供了一个 load 命令，可以把镜像载入所有“节点”，例如：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ kind load docker-image 10.211.55.10:5000/registry:2.7.1
$ kubectl run registry --image=10.211.55.10:5000/registry:2.7.1 --replicas=2
$ kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/registry created
$ kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
registry-6b7648c4f4-g8zxr   1/1     Running   0          24s
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;很明显，这些步骤是可以自动化的，只需要分发一个安装包，就能够很方便的快速部署、删除一整套的 Kubernetes，可以用随需部署的方式完成环境的搭建和删除。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
