动手前必读
使用公有云服务器的同学看这里
用云服务器的同学们,跳过keepalived的章节,不要用虚拟ip(云环境一般都不支持自己定义虚拟ip)就直接把虚拟ip设置为第一个master的ip就可以了(global-config.properties文件中配置【下文第五节 - 准备配置文件】)。
PS:如果是一定要高可用的话可以购买云商的负载均衡服务(比如阿里云的SLB),把backends设置成你的三个master节点,然后虚拟ip就配置成负载均衡的内网ip即可。
实践环境准备
服务器说明
我们这里使用的是五台centos 7.2实体机,具体信息如下表:
系统类型 | IP地址 | 节点角色 | CPU | Memory | Hostname |
---|---|---|---|---|---|
centos-7.2 | 172.18.41.18 | master | >=2 | >=2G | m7-a2-15-41.18-jiagou.cn |
centos-7.2 | 172.18.41.19 | master | >=2 | >=2G | m7-a2-15-41.19-jiagou.cn |
centos-7.2 | 172.18.41.20 | master | >=2 | >=2G | m7-a2-15-41.20-jiagou.cn |
centos-7.2 | 172.18.64.41 | worker | >=2 | >=2G | syq-g05-64.41-jiagou.cn |
centos-7.2 | 172.18.64.42 | worker | >=2 | >=2G | syq-g05-64.42-jiagou.cn |
系统设置(所有节点)
主机名
主机名必须每个节点都不一样,并且保证所有点之间可以通过hostname互相访问。
1 | # 查看主机名 |
安装依赖包
1 | # 更新yum |
关闭防火墙、swap,重置iptables
1 | # 关闭防火墙 |
系统参数设置
1 | # 制作配置文件 |
安装docker(worker节点)
根据kubernetes对docker版本的兼容测试情况,我们选择17.03.1版本
由于近期docker官网速度极慢甚至无法访问,使用yum安装很难成功。我们直接使用rpm方式安装
1 | # 手动下载rpm包 |
准备二进制文件(所有节点)
配置免密登录
为了方便文件的copy我们选择一个中转节点(随便一个节点,可以是集群中的也可以是非集群中的),配置好跟其他所有节点的免密登录1
2
3
4
5
6
7
8
9
10
11# 看看是否已经存在rsa公钥
$ cat ~/.ssh/id_rsa.pub
# 如果不存在就创建一个新的
$ ssh-keygen -t rsa
# 把id_rsa.pub文件内容copy到其他机器的授权文件中
$ cat ~/.ssh/id_rsa.pub
# 在其他节点执行下面命令(包括worker节点)
$ echo "<file_content>" >> ~/.ssh/authorized_keys
下载二进制文件
官方下载地址(在CHANGELOG链接里面):
https://github.com/kubernetes/kubernetes/releases
网盘下载地址–推荐(我从官网下载整理好的文件):
链接: https://pan.baidu.com/s/1_w9vyQaDGLKDOf_TU2Xu8Q
提取码: vca8
分发文件并设置好PATH
1 | # 把文件copy到每个节点上(注意替换自己的文件目录) |
准备配置文件(中转节点)
上一步我们下载了kubernetes各个组件的二进制文件,这些可执行文件的运行也是需要添加很多参数的,包括有的还会依赖一些配置文件。现在我们就把运行它们需要的参数和配置文件都准备好。
下载配置文件
我这准备了一个项目,专门为大家按照自己的环境生成配置的。它只是帮助大家尽量的减少了机械化的重复工作。它并不会帮你设置系统环境,不会给你安装软件。总之就是会减少你的部署工作量,但不会耽误你对整个系统的认识和把控。
1 | $ cd ~ |
文件说明
- addons
kubernetes的插件目录,包括calico、coredns、dashboard等。
- configs
这个目录比较 - 凌乱,包含了部署集群过程中用到的杂七杂八的配置文件、脚本文件等。
- pki
各个组件的认证授权相关证书配置。
- services
所有的kubernetes服务(service)配置文件。
- global-configs.properties
全局配置,包含各种易变的配置内容。
- init.sh
初始化脚本,配置好global-config之后,会自动生成所有配置文件。
生成配置
这里会根据大家各自的环境生成kubernetes部署过程需要的配置文件。
在每个节点上都生成一遍,把所有配置都生成好,后面会根据节点类型去使用相关的配置。
1 | # cd到之前下载的git代码目录 |
执行init.sh常见问题:
- Syntax error: “(“ unexpected
- bash版本过低,运行:bash -version查看版本,如果小于4需要升级
- 不要使用 sh init.sh的方式运行(sh和bash可能不一样哦)
- config.properties文件填写错误,需要重新生成
再执行一次./init.sh即可,不需要手动删除target
高可用集群部署
CA证书(任意节点)
安装cfssl
cfssl是非常好用的CA工具,我们用它来生成证书和秘钥文件
安装过程比较简单,如下:
1 | # 下载 |
生成根证书
根证书是集群所有节点共享的,只需要创建一个 CA 证书,后续创建的所有证书都由它签名。
1 | # 生成证书和私钥 |
部署etcd集群(master节点)
下载etcd
如果你是从网盘下载的二进制可以跳过这一步(网盘中已经包含了etcd,不需要另外下载)。
没有从网盘下载bin文件的话需要自己下载etcd
1 | $ wget https://github.com/coreos/etcd/releases/download/v3.2.18/etcd-v3.2.18-linux-amd64.tar.gz |
生成证书和私钥
1 | # 生成证书、私钥 |
创建service文件
1 | # scp配置文件到每个master节点 |
启动服务
etcd 进程首次启动时会等待其它节点的 etcd 加入集群,命令 systemctl start etcd 会卡住一段时间,为正常现象。1
2
3
4
5
6
7
8#启动服务
$ systemctl daemon-reload && systemctl enable etcd && systemctl restart etcd
#查看状态
$ service etcd status
#查看启动日志
$ journalctl -f -u etcd
部署api-server(master节点)
生成证书和私钥
1 | # 生成证书、私钥 |
创建service文件
1 | # scp配置文件到每个master节点 |
启动服务
1 | #启动服务 |
部署keepalived - apiserver高可用(master节点)
安装keepalived
1 | # 在两个主节点上安装keepalived(一主一备) |
创建keepalived配置文件
1 | # 创建目录 |
启动keepalived
1 | # 分别在master和backup上启动服务 |
部署kubectl(任意节点)
kubectl 是 kubernetes 集群的命令行管理工具,它默认从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息。
5.1 创建 admin 证书和私钥
kubectl 与 apiserver https 安全端口通信,apiserver 对提供的证书进行认证和授权。
kubectl 作为集群的管理工具,需要被授予最高权限。这里创建具有最高权限的 admin 证书。
1 | # 创建证书、私钥 |
创建kubeconfig配置文件
kubeconfig 为 kubectl 的配置文件,包含访问 apiserver 的所有信息,如 apiserver 地址、CA 证书和自身使用的证书
1 | # 设置集群参数 |
授予 kubernetes 证书访问 kubelet API 的权限
在执行 kubectl exec、run、logs 等命令时,apiserver 会转发到 kubelet。这里定义 RBAC 规则,授权 apiserver 调用 kubelet API。
1 | $ kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user kubernetes |
小测试
1 | # 查看集群信息 |
部署controller-manager(master节点)
controller-manager启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态。当 leader 节点不可用后,剩余节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。
创建证书和私钥
1 | # 生成证书、私钥 |
创建controller-manager的kubeconfig
1 | # 创建kubeconfig |
创建service文件
1 | # scp配置文件到每个master节点 |
启动服务
1 | # 启动服务 |
部署scheduler(master节点)
scheduler启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态。当 leader 节点不可用后,剩余节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。
创建证书和私钥
1 | # 生成证书、私钥 |
创建scheduler的kubeconfig
1 | # 创建kubeconfig |
创建service文件
1 | # scp配置文件到每个master节点 |
启动服务
1 | # 启动服务 |
部署kubelet(worker节点)
预先下载需要的镜像
1 | # 预先下载镜像到所有节点(由于镜像下载的速度过慢,我给大家提供了阿里云仓库的镜像) |
创建bootstrap配置文件
1 | # 创建 token |
kubelet配置文件
把kubelet配置文件分发到每个worker节点上
1 | $ scp target/worker-<node-ip>/kubelet.config.json <user>@<node-ip>:/etc/kubernetes/ |
kubelet服务文件
把kubelet服务文件分发到每个worker节点上
1 | $ scp target/worker-<node-ip>/kubelet.service <user>@<node-ip>:/etc/systemd/system/ |
启动服务
kublet 启动时查找配置的 –kubeletconfig 文件是否存在,如果不存在则使用 –bootstrap-kubeconfig 向 kube-apiserver 发送证书签名请求 (CSR)。
kube-apiserver 收到 CSR 请求后,对其中的 Token 进行认证(事先使用 kubeadm 创建的 token),认证通过后将请求的 user 设置为 system:bootstrap:,group 设置为 system:bootstrappers,这就是Bootstrap Token Auth。
1 | # 在master节点上做bootstrap附权 |
部署kube-proxy(worker节点)
创建证书和私钥
1 | $ cd target/pki/proxy |
创建和分发 kubeconfig 文件
1 | # 创建kube-proxy.kubeconfig |
分发kube-proxy.config
1 | $ scp target/worker-<node-ip>/kube-proxy.config.yaml <user>@<node-ip>:/etc/kubernetes/ |
分发kube-proxy服务文件
1 | $ scp target/services/kube-proxy.service <user>@<node-ip>:/etc/systemd/system/ |
启动服务
1 | # 创建依赖目录 |
部署CNI插件 - calico
我们使用calico官方的安装方式来部署。
1 | # 创建目录(在配置了kubectl的节点上执行) |
部署DNS插件 - coredns
1 | # 上传配置文件 |
集群可用性测试
创建nginx ds
1 | # 写入配置 |
检查各种ip连通性
1 | # 检查各 Node 上的 Pod IP 连通性(主节点没有calico所以不能访问podip) |
检查dns可用性
1 | # 创建一个nginx pod |
部署dashboard
部署dashboard
1 | # 上传dashboard配置 |
访问dashboard
为了集群安全,从 1.7 开始,dashboard 只允许通过 https 访问,我们使用nodeport的方式暴露服务,可以使用 https://NodeIP:NodePort 地址访问
关于自定义证书
默认dashboard的证书是自动生成的,肯定是非安全的证书,如果大家有域名和对应的安全证书可以自己替换掉。使用安全的域名方式访问dashboard。
在dashboard-all.yaml中增加dashboard启动参数,可以指定证书文件,其中证书文件是通过secret注进来的。
- –tls-cert-file
- dashboard.cer
- –tls-key-file
- dashboard.key
登录dashboard
Dashboard 默认只支持 token 认证,所以如果使用 KubeConfig 文件,需要在该文件中指定 token,我们这里使用token的方式登录
1 | # 创建service account |