关键词: docker、kubenetes、etcd、kubectl、kubenetes api service、kubenetes manager controller、kubenetes scheduler、kubelet、kube-proxy、flannel、coreDNS、dashboard、influxdb+grafana+heapster.
前言
说明: 本博客是教大家如何手动搭建kubernetes集群(业内简称K8s),包括集群中所有相关服务、存储、网络等等,本博客一到九章属于第一个阶段,就已经把基本架构搭建好了,后面几章属于锦上添花并在最后部署几个开源的集群可视化管理界面。尤其对于刚入门docker/k8s的新手,可以通过一步步搭建的详细过程了解集群的架构。本博客非常长,涵盖了K8s搭建的整个过程,所有内容,花了我很长时间,大家搭建的时候不必心急非要一次性完成,可以每天完成一到两步,我初学时搭建环境也是走了很多坑,很慢花了一周才完成,加油!
我们知道,在容器技术、微服务日益发展的今天,基于docker容器技术的kubernetes集群已经在行业内已经越来越流行,成为方便易操作的轻量级云平台,使得人们更容易、更灵活地部署自己的应用、管理自己的应用。其主从架构的分布式特点也与很多其他技术框架相似,使得开发人员更容易理解上手。
Kubernetes简介: 简称K8s,是Google开源的一个容器编排引擎,再简单地说,就是用于管理云平台中多个主机上的容器化的应用。K8s的目标是让部署容器化的应用简单并且高效,K8s提供了应用部署,规划,更新,维护的一种机制,它支持自动化部署、大规模可伸缩、应用容器化管理。 特点:
可移植: 支持公有云,私有云,混合云,多重云
可扩展: 模块化,插件化,可挂载,可组合
自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
我们知道,传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
使用K8s新的方式是通过部署容器方式实现,优点是每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。
容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”,这更便于监控和管理。
一般情况下:我们在K8s生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理,由集群自动化管理方便运维人员使用。
关于K8s的介绍暂时就到这里,至于K8s的各个内部组件在本章节就不一一详细说明了,在下面的各个搭建步骤中,也会为大家简单介绍每个所搭建的组件,相信大家在每步搭建的过程中会逐步了解的。下面就让我们来开始具体搭建步骤!
搭建详细步骤
一、各节点基础配置
K8s集群的节点信息如下:
操作系统:Ubuntu16.04.3 Server
ip address | hostname | description |
---|---|---|
192.168.185.131 | linux-node1 | master,主节点 |
192.168.185.132 | linux-node2 | slave1,子节点 |
192.168.185.133 | linux-node3 | slave2,子节点 |
192.168.185.134 | linux-node4 | slave3,子节点 |
192.168.185.135 | linux-node5 | slave4,子节点 |
注意说明: 我们这里搭建的K8s集群,是在VMWare虚拟机中搭建的五个节点,均采用Ubuntu16.04.3 Server版本的系统,每个节点系统分配2G内存,20G的储存。整个集群主从架构包括1个主节点,4个子节点,相关信息如上表。
当然,并不是说一定就要搭建5个节点,节点信息也不一定非要按我上面这样设置,也不一定要像我这样分配每个节点的资源。毕竟考虑到每个人的电脑配置不同,可能受限制于自身电脑内存等影响。大家可以自己灵活选择,这丝毫不影响我们下面的搭建步骤。不过我的个人建议是:你至少至少要配置3个节点的集群(包括1个master主节点,2个slave子节点),每个节点最少最少要分配不低于1G内存,不低于15G的储存。当然具体怎么分配集群取决于你自己,你有多少数量的节点下面搭建配置过程就配置多少个,资源少点可能就跑的慢点,没有太大关系。好的,下面就让我们正式开始一步步搭建K8s集群!
1、节点基本信息配置
# 在每个节点配置自己的ip(注意每个节点address那里,只填自己对应的ip)
[root@linux-node1 ~]# vim /etc/network/interfaces
auto ens33
iface ens33 inet static
address 192.168.185.131
netmask 255.255.255.0
gateway 192.168.185.2
dns-nameserver 8.8.8.8
# 配置每台机器hostname名字(注意每个节点都只填自己对应的hostname)
[root@linux-node1 ~]# vim /etc/hostname
linux-node1
# 在每台机器上配置hosts解析文件(注意:这里,每个节点的hosts文件都是一样的,要配置集群所有节点的信息)
[root@linux-node1 ~]# vim /etc/hosts
192.168.185.131 linux-node1
192.168.185.132 linux-node2
192.168.185.133 linux-node3
192.168.185.134 linux-node4
192.168.185.135 linux-node5
# 每个节点都重启
[root@linux-node1 ~]# reboot
# 测试一下看看
[root@linux-node1 ~]# ifconfig
[root@linux-node1 ~]# ping www.baidu.com
# 节点之间都相互ping一下看看
[root@linux-node1 ~]# ping 192.168.185.132
# 各节点关闭防火墙
[root@linux-node1 ~]# ufw disable
# 设置ssh免密登录
[root@linux-node1 ~]# ssh-keygen -t rsa
# 上面这条命令,遇到什么都别管,一路回车键敲下去
# 拷贝本密钥到五个节点上
[root@linux-node1 ~]# ssh-copy-id linux-node1
[root@linux-node1 ~]# ssh-copy-id linux-node2
[root@linux-node1 ~]# ssh-copy-id linux-node3
[root@linux-node1 ~]# ssh-copy-id linux-node4
[root@linux-node1 ~]# ssh-copy-id linux-node5
# 注意!!!将上面“设置ssh免密登录”和“拷贝本密钥到五个节点上”这两个步骤在其他所有节点上都要分别做一遍
# 每个节点都做完后,都要像下面这样测试一下,是否能在一个节点上免密登录到其他任何一个节点
[root@linux-node1 ~]# ssh linux-node1
# 免密登录到其他节点上后,若要退出回到本身节点,直接敲logout命令就行了
[root@linux-node1 ~]# ssh linux-node2
[root@linux-node1 ~]# ssh linux-node3
[root@linux-node1 ~]# ssh linux-node4
[root@linux-node1 ~]# ssh linux-node5
2、准备K8s的相关安装配置文件
为了方便各位读者的操作,我已将所有K8s相关安装配置文件打包上传到百度云(链接:https://pan.baidu.com/s/17YxQnXd7SJhO9ucdE_IMMA 密码:urhu),提供给大家,读者可以自行下载,而不用再花费时间到处寻找了。然后将从百度云下载好的k8s-v1.10.1-manual.zip,上传到主节点的/usr/local/src下(如果不知道怎么上传,自己主机是windows可以用软件winSCP,如果自己主机是linux可以用scp命令)。上传后解压下:
[root@linux-node1:/usr/local/src]# ll
total 579824
-rw-r--r-- 1 root root 593725046 Nov 9 19:16 k8s-v1.10.1-manual.zip
[root@linux-node1:/usr/local/src]# unzip k8s-v1.10.1-manual.zip
[root@linux-node1:/usr/local/src]# ls
k8s-v1.10.1-manual k8s-v1.10.1-manual.zip
[root@linux-node1:/usr/local/src]# cd k8s-v1.10.1-manual/k8s-v1.10.1/
[root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1]# tar zxvf kubernetes-server-linux-amd64.tar.gz
[root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1]# tar zxvf kubernetes-client-linux-amd64.tar.gz
[root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1]# tar zxvf kubernetes-node-linux-amd64.tar.gz
这样一来,我们所需要准备的相关文件,都已解压好统一放在主节点的/usr/local/src/k8s-v1.10.1-manual下了,往后我们需要用到其中某些东西时,直接过来该目录下拷就行了。
3、部署K8s安装目录
# 在每个节点都建立K8s的安装目录
[root@linux-node1 ~]# mkdir -p /opt/kubernetes/{
cfg,bin,ssl,log}
# 说明一下,其中子目录cfg/下为相关配置文件,bin/目录下为可执行文件,/ssl文件下为网络安全通信相关文件,log/下为日志文件
# 该/opt/kubernetes/才是我们真正的安装目录,每个节点都要配置
# 我们以后的工作,说白了就是从我们上一步准备好的相关安装配置文件中,
# 找到需要的文件,配置好后,分发到各个节点安装目录/opt/kubernetes/下对应的位置
# 在每个节点都配置kubernetes的环境变量
[root@linux-node1 ~]# vim /etc/profile
export PATH=$PATH:/opt/kubernetes/bin
[root@linux-node1 ~]# source /etc/profile
4、在各个节点上安装docker
[root@linux-node1 ~]# apt-get update
[root@linux-node1 ~]# curl -s https://get.docker.com | sh
[root@linux-node1 ~]# docker version
这步非常重要,因为我们知道,K8s技术本身就是基于docker容器技术的。安装docker时可能会很慢,这取决于你的网速问题,当然安装方法也不只我这一种,你也可以参考官方给出的其他方式安装,但务必要确保每个节点上都安装成功了docker,否则不能继续后面的操作。
二、制作CA证书
kubernetes系统各组件需要使用TLS(SSL)证书对通信进行加密,我们这里使用cfssl 来生成Certificate Authority (CA) 证书和秘钥文件,CA是自签名的证书,用来签名后续创建的其它证书。
1、在主节点上配置已下载好的cfssl
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# chmod +x cfssl*
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# mv cfssl-certinfo_linux-amd64 /opt/kubernetes/bin/cfssl-certinfo
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# mv cfssljson_linux-amd64 /opt/kubernetes/bin/cfssljson
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# mv cfssl_linux-amd64 /opt/kubernetes/bin/cfssl
# 然后使用scp命令分别拷到其余4个节点:
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# scp -r /opt/kubernetes/bin/cfssl* 192.168.185.132:/opt/kubernetes/bin
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# scp -r /opt/kubernetes/bin/cfssl* 192.168.185.133:/opt/kubernetes/bin
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# scp -r /opt/kubernetes/bin/cfssl* 192.168.185.134:/opt/kubernetes/bin
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# scp -r /opt/kubernetes/bin/cfssl* 192.168.185.135:/opt/kubernetes/bin
# 在每个节点上/usr/local/src下建立ssl目录用来以后放相关的证书文件
root@linux-node1:/usr/local/src# mkdir ssl && cd ssl
2、创建用来生成 CA 文件的 JSON 配置文件:
root@linux-node1:/usr/local/src/ssl# vim ca-config.json
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
3、创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件:
root@linux-node1:/usr/local/src/ssl# vim ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
4、生成CA证书(ca.pem)和密钥(ca-key.pem):
root@linux-node1:/usr/local/src/ssl# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
# 拷贝到我们之前创建的用来放证书的目录下
root@linux-node1:/usr/local/src/ssl# cp ca.csr ca.pem ca-key.pem ca-config.json /opt/kubernetes/ssl
5、分发证书,使用scp分别拷到其余4个节点放证书的位置:
root@linux-node1:/usr/local/src/ssl# scp -r ca.csr ca.pem ca-key.pem ca-config.json 192.168.185.132:/opt/kubernetes/ssl
root@linux-node1:/usr/local/src/ssl# scp -r ca.csr ca.pem ca-key.pem ca-config.json 192.168.185.133:/opt/kubernetes/ssl
root@linux-node1:/usr/local/src/ssl# scp -r ca.csr ca.pem ca-key.pem ca-config.json 192.168.185.134:/opt/kubernetes/ssl
root@linux-node1:/usr/local/src/ssl# scp -r ca.csr ca.pem ca-key.pem ca-config.json 192.168.185.135:/opt/kubernetes/ssl
ok!搞定!
三、配置etcd
etcd是Kubernetes提供默认的存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划。
1、将我们准备好的etcd软件包解压并拷贝到其他各个节点上
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# tar -zxvf etcd-v3.2.18-linux-amd64.tar.gz
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# cd etcd-v3.2.18-linux-amd64
# 拷贝到/opt/kubernetes/bin/下
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1/etcd-v3.2.18-linux-amd64# cp etcd etcdctl /opt/kubernetes/