专栏首页伪架构师使用 Kind 构建离线集群安装包

使用 Kind 构建离线集群安装包

Kind(Kubernetes in Docker) 是一个 Kubernetes 孵化项目,它使用 Docker 为节点进行 Kubernetes 的快速部署,可以方便的搭建 Kubernetes 集群,虽然简单,但也是通过 Kubernetes 一致性认证的安装器,因此用来做测试还是比较可靠的。

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

获取安装文件

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

这里假设这个服务器有“优秀”的互联网连接。

Docker 离线包

首先我们要为 Docker 的离线安装准备好 RPM 包,新建一个目录 rpms,用来下载安装包:

$ yum install --downloadonly --downloaddir=./rpms \
    yum-utils device-mapper-persistent-data lvm2

执行完毕之后,会在 rpms 目录中找到 Docker 的依赖包,接下来获取 Docker 的 RPM。

$ 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

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

Kubeadm 和 Kubectl

根据官方文档:

$ cat <<EOF > /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 \
kubelet kubeadm --disableexcludes=kubernetes

这里做了一点修改:不再安装 kubectl,也不启动服务,仅用于获取安装包。

获取镜像

使用 rpm 安装 kubeadm,开始获取安装所需的所有镜像:

$ 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

拿到列表了就可以逐个拉取处理镜像,这里给个小脚本:

#!/bin/shfor image in `kubeadm config images list --kubernetes-version=$1`do
  image_name=`echo ${image} | sed "s/k8s.gcr.io.//g"`
  docker pull "${image}"
  docker tag "${image}" "${image_name}"
  file_name="${image_name}.tgz"
  docker save "${image_name}" | gzip > "${file_name}"
  docker rmi "${image}"
  docker rmi "${image_name}"done

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

CFSSL 和 Kind

$ 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

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

安装

RPM 安装

把前面获得的 Kubectl 安装起来。

签发证书

使用 CFSSL 生成证书,首先生成 CA。

ca-csr.json

{
    "CN": "Kubernetes CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "ca": {
       "expiry": "87600h"
    }}

cfssl gencert -initca ca-csr.json | cfssljson -bare ca 生成 CA 证书。

把证书加入信任列表:

$ update-ca-trust enable
$ cp ca.pem /etc/pki/ca-trust/source/anchors/
$ update-ca-trust extract

更新之后,需要重启 Docker 服务,让 Docker 也信任这一 CA。

然后是生成镜像库所需的服务器证书:

config.json

{
    "signing": {
        "default": {
            "expiry": "87600h"
        },
        "profiles": {
            "server": {
                "expiry": "87600h",
                "usages": [                    "signing",                    "key encipherment",                    "server auth",                    "client auth"
                ]            },
            "user": {
                "expiry": "87600h",
                "usages": [                    "signing",                    "key encipherment",                    "client auth"
                ]            }        }    }}

server.json

{
    "CN": "Registry",
    "hosts": [      "127.0.0.1","10.211.55.10"
    ]}

接下来签发证书:

$ cfssl gencert -ca ca.pem -ca-key ca-key.pem -config=config.json \
     -profile=server server.json | cfssljson -bare registry

这里的 IP 地址要跟本地地址对应。

启动镜像库

使用 docker load -i,载入了 registry 镜像,把仓库运行起来:

#!/bin/shdocker run -d \
   --name="registry2" \
   -v "$(pwd)/storage":/var/lib/registry \
   -p 5000:5000 \
  -v "$(pwd)/certs":/certs \  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.pem \  -e REGISTRY_HTTP_TLS_KEY=/certs/registry-key.pem \
   --restart=always \
   registry:2.7.1

如此就在 5000 端口启动了一个镜像库。

推送镜像到私库

把前面的所有镜像都载入 Docker,Tag 之后推入私库,最后在私库里就有了一系列的镜像,例如 10.211.55.10:5000/pause:3.1

安装集群

为了能够使用私库的镜像,要对 Kind 进行一点配置:

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
$ kind create cluster --image kindest/node:v1.15.3
Creating cluster "kind" ...
 ✓ 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="$(kind get kubeconfig-path --name="kind")"

如此这般,Kind 集群就启动了。我们可以测试一下:

$ export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
$ 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

离线环境下部署镜像

Kind 提供了一个 load 命令,可以把镜像载入所有“节点”,例如:

$ 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

后记

很明显,这些步骤是可以自动化的,只需要分发一个安装包,就能够很方便的快速部署、删除一整套的 Kubernetes,非常有利于环境的分发。

本文分享自微信公众号 - 伪架构师(fake-architect),作者:崔秀龙

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • istioctl 中的一些小工具

    许久不见,istioctl 中加入了不少有趣的新命令。装备党自然是喜欢小工具了,选几个有趣的命令分享给大家。

    崔秀龙
  • 用 Hadolint 检查 Dockerfile

    Hadolint 是使用不明觉厉的 Haskell 实现的 Dockerfile linter,其实现依据来自于 Docker 官网推荐的 Dockerfile...

    崔秀龙
  • K8S 分布式构建 Docker 镜像的一些小技巧

    崔秀龙
  • 使用 Kind 构建离线集群安装包

    Kind(Kubernetes in Docker) 是一个 Kubernetes 孵化项目,它使用 Docker 为节点进行 Kubernetes 的快速部署...

    CNCF
  • 惊爆!新型恶意程序让黑客任意控制ATM机

    镁客网
  • |ERROR|ERROR: missing data for column "createtime" (seg3 slice1 192.168.66.23:40001 pid=33370)之mys

    引发这个错误,并不是这个字段引起的错误,一般是这个字段临近的字段存在空格或者换行符引发的错误。

    别先生
  • 比较热门的一些前端框架

    在前端项目开发过程中,总是会引入一些UI框架,已为方便自己的使用,下面就是我经常使用和我认为不错的前端框架

    Inkedus
  • 你可能不知道的leakage功耗计算

    leakage power在深亚微米下占比越来越高。在很多情况下,leakage power可能会占到芯片总功耗的30~50%。

    白山头
  • 文本+视觉,跨模态给你带来不一样的视角

    一、简介        随着网络的发展,多模态数据(文本、图片、语单、视频等)越来越多,如何从大数据中挖掘出知识显得越来越重要。网络存储的数据种类繁多,有文本...

    腾讯大讲堂
  • 基于Three.js的360度全景--photo-sphere-viewer--简介

    这个是基于three.js的全景插件  photo-sphere-viewer.js  ————————————————————————————————————...

    hbbliyong

扫码关注云+社区

领取腾讯云代金券