使用Rancher来构建Kubernetes集群

本文是2018年PostgreSQL on Kubernetes Advent Calendar的第20天。

我正在努力走完25天的挑战,但是最近在进行的验证工作遇到了困难,所以第19天的发布将稍后进行。今天,我想稍微改变一下焦点,来介绍一下使用Rancher构建Kubernetes环境的方法。

太长不看

    • Rancherをつかえば複数のKubernetes環境の構築・管理も簡単。

 

    Kubernetes Providerの選択には注意、CUSTOMではクラウド関連のAPIは叩けない模様。

※12/20 马上补充
同一天,这里也有发布。似乎可以在CUSTOM中使用EBS。请仔细阅读,稍后我们也会修正这篇文章。

Rancher是什么?

我对这份资料很了解,可以说这是一个能简单构建Kubernetes集群的工具。(由于我是同时入门Kubernetes和Rancher,实际上并没有使用过kubeadm或minikube。)

在这次的PostgreSQL on Kubernetes中,我们还包括Rancher,并做出了以下准备。

    • Rancherはv.2.0.6

 

    • ノードとしてAmazon EC2を1クラスタあたり10台程度準備しておく

 

    RancherからKubernetesクラスタを作る際にはCUSTOMを選択

创建k8s集群的Rancher指令

准备EC2实例

本次验证中,我们事先准备了一份在Amazon EC2上加入以下配置的启动模板。

    • CentOS Linux release 7.5.1804 ※Marketplaceから

 

    • docker 17.03.2-ce ※Rancher v2.0.6のインストール要件にあわせて

 

    dockerの自動起動を設定済

从模板启动实例,并确认Docker版本和自动启动。

$ sudo docker version
Client:
 Version:      17.03.2-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   f5ec1e2
 Built:        Tue Jun 27 02:21:36 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.2-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   f5ec1e2
 Built:        Tue Jun 27 02:21:36 2017
 OS/Arch:      linux/amd64
 Experimental: false

$ sudo systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2018-12-20 01:25:29 UTC; 17min ago
     Docs: https://docs.docker.com
 Main PID: 845 (dockerd)
    Tasks: 20
   Memory: 57.3M
   CGroup: /system.slice/docker.service
           tq 845 /usr/bin/dockerd
           mq3020 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd...

使用CUSTOM构建k8s集群。

本次不会对Rancher本身的构建进行解释。请参考其他文章等,了解Rancher的UI访问环境的前提条件并予以理解。

当Rancher的环境配置完成,并且Kubernetes集群所需的EC2实例已经启动完成后,我们将继续进行集群配置。

image.png
image.png
image.png

此外,在这里可以选择云服务提供商,但根据我之前的确认,如果Kubernetes提供商和云服务提供商之间存在不一致的情况,Kubernetes集群将无法启动。

例如,

    Kubernetes ProviderはCUSTOMだが、Cloud ProviderはAmazonにしたい

尝试了如下各种方法,但是最初的节点添加并不成功。在CUSTOM模式下,将云服务提供商设置为None。
根据此消息,似乎是IAM的问题。

添加主节点

输入前面的集群创建界面并继续,然后会进入添加节点到集群的界面。在Kubernetes集群中,至少需要一个etcd和控制平面节点,因此首先要创建它们。

在下面的页面中,勾选“节点角色”中的“etcd”和“控制平面”,将为每个节点生成docker run命令。点击复制图标,将命令输入到要成为Kubernetes主节点的实例中。

image.png

执行命令后,检查容器是否已经启动,应该如下所示。

$ sudo docker ps
CONTAINER ID        IMAGE                                                                                                COMMAND                  CREATED              STATUS              PORTS               NAMES
d5f4c3789314        3571bad91a6b                                                                                         "run.sh"                 22 seconds ago       Up 22 seconds                           k8s_agent_cattle-node-agent-rphqh_cattle-system_732d075e-0400-11e9-8caf-023749fae860_0
37ae796e4dfc        rancher/pause-amd64:3.1                                                                              "/pause"                 22 seconds ago       Up 22 seconds                           k8s_POD_cattle-node-agent-rphqh_cattle-system_732d075e-0400-11e9-8caf-023749fae860_0
0a7a434ff732        rancher/coreos-flannel-cni@sha256:3cf93562b936004cbe13ed7d22d1b13a273ac2b5092f87264eb77ac9c009e47f   "/install-cni.sh"        31 seconds ago       Up 31 seconds                           k8s_install-cni_kube-flannel-86ff2_kube-system_6af851d9-0400-11e9-8caf-023749fae860_0
acd57e7fee2a        rancher/coreos-flannel@sha256:93952a105b4576e8f09ab8c4e00483131b862c24180b0b7d342fb360bbe44f3d       "/opt/bin/flanneld..."   34 seconds ago       Up 33 seconds                           k8s_kube-flannel_kube-flannel-86ff2_kube-system_6af851d9-0400-11e9-8caf-023749fae860_0
0e82ab2ae152        rancher/pause-amd64:3.1                                                                              "/pause"                 36 seconds ago       Up 36 seconds                           k8s_POD_kube-flannel-86ff2_kube-system_6af851d9-0400-11e9-8caf-023749fae860_0
5d6c8baef3cc        rancher/hyperkube:v1.10.5-rancher1                                                                   "/opt/rke/entrypoi..."   45 seconds ago       Up 44 seconds                           kube-proxy
f092442d5e7e        rancher/hyperkube:v1.10.5-rancher1                                                                   "/opt/rke/entrypoi..."   50 seconds ago       Up 50 seconds                           kubelet
aac0a75b6c6b        rancher/hyperkube:v1.10.5-rancher1                                                                   "/opt/rke/entrypoi..."   56 seconds ago       Up 55 seconds                           kube-scheduler
e6f32a34cdf3        rancher/hyperkube:v1.10.5-rancher1                                                                   "/opt/rke/entrypoi..."   About a minute ago   Up About a minute                       kube-controller-manager
38d93b42ab62        rancher/hyperkube:v1.10.5-rancher1                                                                   "/opt/rke/entrypoi..."   About a minute ago   Up About a minute                       kube-apiserver
57f70612020f        rancher/coreos-etcd:v3.1.12                                                                          "/usr/local/bin/et..."   About a minute ago   Up About a minute                       etcd

这样etcd和控制平面已经启动了,但是它们都是单节点配置。理想情况下应该创建高可用性配置,但本次省略。

添加Worker节点

接下来,我们将向集群中添加工作节点。

请在与Master节点相同的界面上,将[Node Role]的[Worker]选项勾选上,并将生成的docker run命令提交到Worker节点的实例中。

image.png

只要将其重复执行与worker节点数量相等的次数,Kubernetes群集的构建就完成了。

如果想使用EBS,请使用Kubernetes供应商(亚马逊EC2)。

在构建了这个环境之后,使用Rook在Kubernetes上验证PostgreSQL没有问题。但是,既然已经使用了Amazon EC2,想要挂载EBS卷的话,这个环境就无法正常工作了。

举个例子,我们来创建如下的StorageClass和PersistentVolumeClaim。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sc-ebs-001
parameters:
  encrypted: "false"
  type: gp2
provisioner: kubernetes.io/aws-ebs
reclaimPolicy: Delete
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-pg-ebs-sf
  labels:
    app: pg-ebs-sf
spec:
  storageClassName: sc-ebs-001
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

当将此应用于使用Rancher v2.0.6 CUSTOM创建的集群时,PVC将会处于待定状态。

$ kubectl describe pvc pvc-pg-ebs-sf
Name:          pvc-pg-ebs-sf
Namespace:     default
StorageClass:  sc-ebs-001
Status:        Pending
Volume:
Labels:        <none>
Annotations:   field.cattle.io/creatorId=user-4h6wp
               volume.beta.kubernetes.io/storage-provisioner=kubernetes.io/aws-ebs
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
Events:
  Type     Reason              Age              From                         Message
  ----     ------              ----             ----                         -------
  Warning  ProvisioningFailed  5s (x7 over 1m)  persistentvolume-controller  Failed to provision volume with StorageClass "sc-ebs-001": Failed to get AWS Cloud Provider. GetCloudProvider returned <nil> instead

只要在相同的YAML文件中,选择Kubernetes Provider的Amazon EC2和Cloud Provider的Amazon,就可以成功地构建环境。

也许不仅限于EBS,如果希望直接使用AWS资源,在构建集群时最好不要选择CUSTOM。

总结

今天稍微改变一下兴致,我尝试搭建了一个基于Rancher的Kubernetes环境。在这个过程中,我也尝试了不同的Kubernetes Provider和Cloud Provider。我计划在明天之后,比较一下之前使用Rook实现的Kubernetes上的PostgreSQL和使用EBS实现的配置。

请多关照。

广告
将在 10 秒后关闭
bannerAds