使用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实例已经启动完成后,我们将继续进行集群配置。



此外,在这里可以选择云服务提供商,但根据我之前的确认,如果Kubernetes提供商和云服务提供商之间存在不一致的情况,Kubernetes集群将无法启动。
例如,
- Kubernetes ProviderはCUSTOMだが、Cloud ProviderはAmazonにしたい
尝试了如下各种方法,但是最初的节点添加并不成功。在CUSTOM模式下,将云服务提供商设置为None。
根据此消息,似乎是IAM的问题。
添加主节点
输入前面的集群创建界面并继续,然后会进入添加节点到集群的界面。在Kubernetes集群中,至少需要一个etcd和控制平面节点,因此首先要创建它们。
在下面的页面中,勾选“节点角色”中的“etcd”和“控制平面”,将为每个节点生成docker run命令。点击复制图标,将命令输入到要成为Kubernetes主节点的实例中。

执行命令后,检查容器是否已经启动,应该如下所示。
$ 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节点的实例中。

只要将其重复执行与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实现的配置。
请多关照。