高可用集群搭建-koubeadm
软件版本
软件 |
版本 |
os |
centos7.2 |
kubenetes |
v1.11.0 |
etcd |
3.2.18 |
docker |
17.03 |
calico |
3.1.3 |
服务器说明
- 官方推荐实例
CPU
大于等于2个, Memory
大于等于2G。
系统类型 |
IP地址 |
节点角色 |
CPU |
Memory |
hostname |
centos-7.1 |
172.168.31.10 |
master |
>=2 |
>=2G |
test10.com |
centos-7.1 |
172.168.31.11 |
master |
>=2 |
>=2G |
test11.com |
centos-7.1 |
172.168.31.12 |
master |
>=2 |
>=2G |
test12.com |
centos-7.1 |
172.168.31.13 |
master |
>=2 |
>=2G |
test13.com |
centos-7.1 |
172.168.31.14 |
master |
>=2 |
>=2G |
test14.com |
系统设置
主机名
- 主机名:主机名必须每个节点都不一样,并且保证所有点之间可以通过hostname互相访问。
# 查看主机名
$ hostname
# 修改主机名
$ hostnamectl set-hostname <your_hostname>
# 配置host. 使所有节点之间可以通过hostname互相访问
$ vi /etc/hosts
# <node-ip> <node-hostname>
安装依赖包
# 更新yum
$ yum update
# 安装依赖包
$ yum install -y connntrack ipvsadm ipset jq sysstat curl iptables libseccomp
关闭防火墙、swap,重置iptables
# 关闭防火墙
$ systemctl stop firewalld && ststemctl disable firewalld
# 重置iptables
$ iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# 关闭swap
$ wsapoff -a
$ sed -i '/swap/s/^\(.*)$/#\1/g' /etc/fstab
# 关闭selinux
$ setenforce 0
# 关闭dnsmasq(否则可能导致docker容器无法解析域名)
$ service dnsmasq stop && systemctl disable dnsmasq
系统参数设置
# 制作配置文件
$ cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
EOF
## 生效文件
$ sysctl -p /etc/sysctl.d/kubernetes.conf
安装docker(所有节点)
# 手动下载rpm包
$ mkdir -p /opt/kubernetes/docker && cd /opt/kubernetes/docker
$ wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-17.03.1.ce-1.el7.centos.x86_64.rpm
$ wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm
$ wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-debuginfo-17.03.1.ce-1.el7.centos.x86_64.rpm
# 清理所有版本
$ yum remove -y docker* container-selinux
# 安装rpm包
$ yum localinstall -y *.rpm
# 开机启动
$ systemctl enable docker
# 设置参数
# 1. 查看磁盘挂载
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 24G 14G 63% /
tmpfs 7.8G 11M 7.8G 1% /dev/shm
/dev/vdb 97G 587M 92G 1% /home/work/project
# 2. 选择比较大的分区
$ mkdir -p /tol/docker-data
$ cat <<EOF > /etc/docker/daemon.json
{
"graph": "/tol/docker-data"
}
EOF
# 启动docker服务
service docker restart
安装必要工具(所有节点)
工具说明
- kubeadm: 部署集群用的命令
- kubelet: 在集群中每台机器上都要运行的组件,负责管理pod、容器的生命周期
- kubectl: 集群管理工具
安装方法
# 配置yum源
$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/yum-package-key.gpg
EOF
# 安装工具
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 启动kubelet
systemctl enable kubelet && systemctl start kubelet
准备配置文件
配置免密登录
下载镜像
- kubeadm方式构建的服务都是通过容器的方式运行的,而镜像都会从google的仓库中拉取,
- master节点镜像与worker节点镜像不同
部署keepalived
安装keepalived
# 在两个主节点上安装keepalived (一主一备)
$ yum install -y keepalived
创建keepalived配置文件
# 创建目录
$ ssh <user>@<master-ip> "mkdir -p /etc/keepalived"
$ ssh <user>@<backup-ip> "mkdir -p /etc/keepalived"
# 分发配置文件
$ scp target/configs/keepalived-master.conf <user>@<master-ip>:/etc/keepalived/keepalived.conf
$ scp target/configs/keepalived-backup.conf <user>@<backup-ip>:/etc/keepalived/keepalived.conf
# 分发检测脚本
$ scp target/scripts/check-apiserver.sh <user>@<master-ip>:/etc/keepalived/
$ scp target/scripts/check-apiserver.sh <user>@<backup-ip>:/etc/keepalived/
启动keepalived
# 分别在master和backup上启动服务
$ systemctl enable keepalived && service keepalived start
# 检查状态
$ service keepalived status
# 查看日志
$ journalctl -f -u keepalived
# 查看虚拟ip
$ ip a
部署第一个主节点
# 准备配置文件
$ scp target/<node-ip>/kubeadm-config.yaml <user>@<node-ip>:~
# ssh到第一个主节点,执行kubeadm初始化系统(注意保存最后答应的加入集群的命令)
$ kubeadm init --config ~/kubeadm-config.yaml
# 配置kubectl
$ mkdir -p ~/.kube
$ mv /etc/kubernetes/admin.conf ~/.kube/conf
# 测试
$ kubectl get pods --all-namespaces