Ubuntu下搭建Kubernetes产品环境集群

以下过程在Ubuntu 16.04裸机上完全跑通

本文展示了在Ubuntu 16.04系统上搭建Kubernetes集群的方法,用到了Canonical Kubernetes的发行版本,这是一种快捷搭建本地Kubernetes集群的方法,并能够支持动态增删node节点。

主要搭建步骤是,使用conjure-up工具,结合juju,基于LXD搭建Kubernetes集群,并使用kubeletkube-proxy将其他机器作为node节点,注册入该集群中。

以下为详细步骤(最好已经翻墙)

安装snapd

conjure-up工具需要使用Ubuntu 16.04新的包管理器snapd安装,所以先安装snapd

1
2
sudo apt update
sudo apt install snapd

安装LXD

conjure-up是基于LXD搭建集群的,所以要先安装LXD,并做好初始化配置。这里面涉及到lxd用户组的操作。下面先简单介绍下其用法。

当安装好LXD后,会自动创建一个lxd用户组,只有在这个用户组才能操作LXD程序,所有adminsudoers的用户,都会被自动加入到lxd用户组中。所以如果你不在这个组内,就需要手动添加到lxd组中。

因为用户组成员权限只会在登录时生效,所以你要么关闭当前回话,然后重新登录;要么就使用newgrp lxd命令,在当前会话中将自己切换到lxd用户组中。

用法示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 显示用户"test"当前隶属于哪些用户组
test@ubuntu$ groups test
test : test docker

# 将用户"test"添加到"lxd"用户组中
test@ubuntu$ sudo gpasswd -a test lxd
Adding user test to group lxd

# 查看添加效果
test@ubuntu$ groups test
test : test lxd docker
# 目前来说,test用户理论上已经加入到lxd用户组中。
# 但是若操作lxd用户组才有权限的文件,会提示Permission denied。
# 由此说明添加并没有实际生效

# 现在对"lxd"用户组运行"newgrp"命令
test@ubuntu$ newgrp lxd
# 再次操作文件,发现已经可以正常操作,"newgrp"生效

OK,现在开始安装LXD

1
2
3
4
5
6
sudo apt-get install lxd
groups test
sudo gpasswd -a test lxd
groups test
newgrp lxd
sudo lxd init //配置一大堆,都可以选默认,但"Setup an ipv6 subnet"要选"NO"

安装conjure-up

1
2
3
4
5
sudo apt install software-properties-common //安装add-apt-repository命令
sudo apt-add-repository ppa:juju/stable
sudo apt-add-repository ppa:conjure-up/next
sudo apt update
sudo snap install conjure-up --classic

安装Kubernetes

1
2
3
conjure-up kubernetes

//选择localhost安装,即可在本地搭建一个集群
  • 如果有提示Missing dependencies for SOCKS support,是因为系统的全局代理和conjure-up冲突,需要unset all_proxy。但是这样又会导致安装过程中,因为没有翻墙,有些镜像下载失败导致卡住,所以建议修改hosts翻墙。

  • 切记LXD要在conjure-up运行之前装好并init完毕,否则会出现各种与LXD相关的错误。

选择The Canonical Distribution of Kubernetes

Alt text

选择Deploy New Self-Hosted Controller

Alt text

选择localhost

Alt text

一路Deploy过去,也可以将worker节点Configure为1,毕竟node节点可以由其它机器提供。

Alt text

坐等安装,时间会比较长,这个过程需要翻墙下一些镜像。

Alt text

暴露Master节点以增加Node

集群安装完毕后,在~/bin目录下生成了一个kubectl.xxx可执行文件,该文件可以和集群进行交互,可以查看安装效果:

1
~/bin/kubectl cluster-info

部署完成后,master的服务都运行在内网IP之上,需要将其暴露到集群外,这样才能让其他机器访问到。

1
2
3
nohup ~/bin/kubectl proxy --accept-hosts="^*$" --address="0.0.0.0" &

//这样就将master服务暴露在了http://106.106.9.22:8001。其中106.106.9.22为master所在服务器的IP地址

添加Node节点

添加Node节点,需要在Node机器上运行2个进程:kubeletkube-proxy,启动时指定master的服务地址,这样就可以将该机器注册进集群中。同时Node机器要安装好Docker

1
wget https://github.com/kubernetes/kubernetes/releases/latest/kubernetes.tar.gz
  • 解压发布包
1
tar -xf kubernetes.tar.gz
  • 运行cluster/get-kube-binaries.sh拉取最新的二进制包,这里面包含各种所需要的包,我们需要的包都放在kubernetes/server/kubernetes/server/bin/目录下。
1
bash cluster/get-kube-binaries.sh
  • 运行kubelet:
1
kubelet --api-servers=http://106.106.9.22:8001 --register-node
  • 运行kube-proxy:
1
kube-proxy --master=http://106.106.9.22:8001
  • 在master节点查看添加效果
1
~/bin/kubectl get no

删除Node节点

  • 杀掉node节点中的kubeletkube-proxy进程

  • 在master节点删除node

1
~/bin/kubectl delete no worker1 //worker1为该node节点名称

SSH连接cluster

十分有用:对于这种方式部署的kubernetes集群,如果需要进入到master节点,或者node节点,进行数据查看或调试。有极其简单的SSH方法:

1
juju ssh 5

数字5表示5号machine,具体可以通过juju status查看所有服务都运行在哪个machine上,当然了,还有很多花式的SSH连接参数,都可以帮助你连接到需要的节点上,具体可以参看juju ssh --help

可能用到的命令

  • conjure-up kubernetes不一定能一次成功,如下命令也许有用:
1
2
3
4
5
juju status 
// 查看当前集群的安装信息

juju destroy-controller --destroy-all-models test
// 销毁名为test的controller,包括所有的machines,applications,data和其它resources都会被清除。通过这种方式,可以干净的清空之前失败的kubernetes安装。

参考文章