k8w.io
阿里云搭建Rancher2.0集群
2018-05-23作者:k8w

这篇文章告诉你,如何从零开始在阿里云使用Rancher 2.0搭建k8s集群,内容涵盖:

  • 阿里云环境准备
  • 安装Rancher2.0(包括在阿里云上可能遇到的坑)
  • 使用阿里云NAS做StorageClass
  • 安装OpenVPN,以在本地直连POD网络
  • 部署MongoDB、MySQL、Redis集群
  • 部署Jenkins,实现NodeJS+Docker持续集成环境

环境准备

阿里云基础设施准备

  1. ECS 2台
    1. 至少2核4GB
    2. 使用UBuntu16.04系统
    3. 注意:主机名不能包含大写字母
  2. NAS 1个 (用于PersistenceVolumeStorageClass
  3. SLB 1个
  4. 弹性IP(EIP) 1个

网络设置

  1. ECS使用阿里云VPC网络
  2. IP网段为 10.0.0.0/24
  3. 主机名统一为 vpc01/vpc02/… (vpc01即为10.0.0.1,依次顺延)

安装 Docker

安装 Docker 17.03

curl https://releases.rancher.com/install-docker/17.03.sh | sh

设置阿里云镜像加速器

  1. http://dev.aliyun.com 获取专属加速器地址
  2. 执行下面的命令(记得替换加速器地址)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["你的专属加速器地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

创建自定义系统镜像(可选)

至此,已经创建好了一个纯净的 UBuntu 16.04 + Docker 17.03 的系统。
如果你想为了以后增加机器方便,那么可以将现在的系统盘创建为一个自定义镜像。

准备其它机器

如果你创建了自定义镜像,那么直接用创建好的镜像初始化其它机器。
否则,按上面的步骤,在其它机器上各执行一次。

安装 Rancher

我们计划 Rancher Server 安装在vpc01上,计划2台机器都作为k8s集群的Node节点和Ingress入口。

安装 Rancher Server

vpc01运行以下脚本来安装RancherServer。

sudo docker run -d --restart=unless-stopped \
-p 9999:443 \
-v /var/lib/rancher:/var/lib/rancher \
--name rancher-server \
rancher/rancher

此处有坑注意:

  1. Rancher Server 不能使用默认的80/443端口(因为Ingress默认使用这些端口)
  2. Rancher Server 不能使用18080端口(nginx会占用)

阿里云安全组设置

由于我们映射了9999端口,所以需要在阿里云的安全组设置中,开放vpc01机器的9999端口。

初始化 Rancher 设置

至此,我们已经完成Rancher Server的安装。
现在可以通过https://IP:9999进入管理后台,进行初始化的设置。

证书错误问题

由于我们没有使用第三方的权威SSL证书,所以打开时会报证书错误的问题。
点开高级,选择继续前往……即可。

设置登录密码

跟着指示设置即可。

设置 Rancher Server URL

由于我的集群都部署在内网,后续为安全起见,所以此处填写内网IP。

开启Catalog

此处有坑请注意

有可能出现诸如“WebSocket连接失败”之类的问题,其实都是因为证书错误导致的。
按下F12打开Chrome控制台,如果看到红色的报错(ERR_CERT_ERROR之类的),那么就新建一个TAB打开加载失败的文件,重复上面“证书错误问题”的解决方式。
再回到Rancher页面刷新就可以正常访问了。

新建集群

  1. 进入Rancher管理界面,点击右上角的Add Cluster
  2. 新建一个Custom的集群,下面的etcdControllerWorker都勾选。
  3. 接着将上面的代码复制到每台机器都执行一次
  4. 等待集群初始化完毕(全都绿了就完了)。

设置基于NAS的StorageClass

我们打算使用阿里云的NAS做容器的持久化数据存储。
由于Rancher并没有自带基于NFS的StorageClass Provisoner,所以我们要自行安装一个。

安装 nfs-client-provisioner

按照nfs-client-provisioner的说明配置即可,步骤如下:
从左上角进入Project,点击右侧的Import YAML,按以下顺序依次导入即可。

创建RBAC

  1. deploy/auth/serviceaccount.yaml
  2. deploy/auth/clusterrole.yaml
  3. deploy/auth/clusterrolebinding.yaml

记得要修改clusterrolebinding.yaml第8行的namespace

部署Provisioner

  1. deploy/deployment.yaml

记得要修改其中的:PROVISIONER_NAMENFS_SERVERNFS_PATH,以及volumes里的NFS配置信息。

配置StorageClass

  1. 进入 Rancher -> Cluster -> Storage -> Storage Classes
  2. 点击右侧 Add Class
  3. name随便填
  4. Provisioner填写为刚才deploy/deployment.yaml中配置的PROVISIONER_NAME
  5. 点击Save
  6. 最后,点开右边的三个点,Set as Default

部署OpenVPN

  1. 进入Catalog
  2. 安装openvpn
  3. 设置Answer
service.type=NodePort
service.nodePort=31888
  1. Execute Shell,初始化Client证书
/etc/openvpn/setup/newClientCert.sh 用户名
  1. Upgrade openvpn,打开priviledge权限
  2. 进入新的Pod的Shell,执行以下命令
echo 1 > /proc/sys/net/ipv4/ip_forward && \
sysctl -p

部署MongoDB集群

  1. 进入Catalog
  2. 安装Mongodb-Replicaset
  3. 配置Answer
auth.enabled=true
auth.adminUser=root
auth.adminPassword=password
auth.key=key
installImage.repository=registry-vpc.cn-beijing.aliyuncs.com/honghegame/k8s.gcr.io-mongodb-install
installImage.tag=latest

由于国内gcr.io无法访问,所以需要通过以上Answer修改为阿里云镜像。

安装完成后,mongodb-replicaset-test这个Pod会报错,原因不明。
但由于不影响实际使用,直接删除即可。

部署MySQL集群

  1. 进入Catalog
  2. 安装mysqlha
  3. 配置Answer
xtraBackupImage=registry-vpc.cn-beijing.aliyuncs.com/honghegame/gcr.io-google-samples-xtrabackup:latest

由于国内gcr.io无法访问,所以需要通过以上Answer修改为阿里云镜像。

部署Redis集群

  1. 进入Catalog
  2. 安装redis (Library中的即可)
  3. 按照设置设置即可

部署持续集成

部署Jenkins

  1. 进入Catalog
  2. 安装Jenkins
  3. 配置Answer
Agent.Enabled=false
Master.AdminPassword=password
Master.ServiceType=ClusterIP
rbac.install=true
  1. 删除报错的test的POD

安装NodeJS

注意:以下安装的是NodeJS 8.x版本

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

##设置JenkinsHome目录映射

ln -s /nfs/jenkins-jenkins-pvc-630f23f7-5a77-11e8-bdbc-00163e0a3584 /var/jenkins_home

设置第一个CI任务

未完待续

(正文完)
留言(0条)
发表新留言
您的大名:
必填
电子邮箱:
不公开,仅用于向你发送回复