背景
由于运维同学短缺,需要自己搭建一套k8s集群环境部署开发的高可用服务给测试使用,自己参考了网络上的k8s集群搭建文章,都或多或少存在一定的问题,故把自己搭建环境的过程记录下来,作为以后参考。
环境
真实的环境搭建在公司私有云上,不太方便记录,故这次的搭建过程使用本地的虚拟机环境,步骤基本一致,为方便部署,以下步骤均在root权限下进行。
本次部署包含两台虚拟机,一个为master节点,一个为node1节点,要部署更多节点的步骤和添加一个节点的方式一致。
虚拟机软件:Oracle VM VirtualBox
虚拟机系统:Centos 7.5
步骤
1.搭建虚拟机环境
此过程参考文章
从零开始搭建Kubernetes集群(二、搭建虚拟机环境)www.jianshu.com
2.配置host-only网络
修改完网络配置之后,启动虚拟机,使用ifconfig查看网络情况,发现host-only网络已经配置成功
3. 配置国内yum源
不建议使用CentOS 7自带的yum源,因为安装软件和依赖时会非常慢甚至超时失败。使用阿里云的源予以替换,执行如下命令:
&& mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
yum -y update
4.关闭防火墙、selinux和swap
a. 关闭防火墙
防火墙一定要提前关闭,否则在后续安装k8s集群的时候是个麻烦。执行下面语句关闭,病禁用开机启动。
systemctl stop firewalld & systemctl disable firewalld
b. 关闭selinux
执行以下命令:
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
c. 关闭swap
在安装k8s集群时,Linux的swap内存交换机制是一定要关闭的,否则会因为内存交换而影响性能以及稳定性。这里,我们可疑提前进行设置:
- 执行swapoff -a可临时关闭,但系统重启后恢复
- 编辑/etc/fstab,注释掉包含swap的那一行即可,重启后可永久关闭
命令如下:
swapoff -a
ed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
执行后的文件如下所示:
此时,用top查看swap情况,会看到swap的使用为0。
5.设置路由
配置内核参数,将桥接的IPv4流量传递到iptables的链
yum install -y bridge-utils.x86_64
modprobe br_netfilter # 加载br_netfilter模块,使用lsmod查看开启的模块
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 重新加载所有配置文件
6.安装docker
a. 配置docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
b. 安装合适的docker版本
由于k8s支持的docker版本存在一定的滞后,要选择好合适的docker版本
此次,选择安装的docker版本为18.09
选择查看docker-ce各版本
yum list docker-ce --showduplicates | sort -r
安装指定版本的docker-ce
yum -y install docker-ce-18.09.9
启动docker服务并激活开机启动
systemctl start docker & systemctl enable docker
查看docker版本
docker version
运行第一个docker容器
docker run hello-world
提示如下,则表示你的docker安装成功了
c. 修改docker cgroup驱动,与k8s一致,使用systemd
# 修改docker cgroup驱动:native.cgroupdriver=systemd
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
systemctl restart docker # 重启使配置生效
7.安装k8s组件
a. 配置k8s 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/rpm-package-key.gpg
EOF
b. 在master节点安装kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
可以看出当前安装的k8s的版本为1.16.3-0
c. 开机启动kubelet
systemctl enable --now kubelet # 开机启动kubelet
8.克隆虚拟机
至此,单个虚拟机配置完毕,接下来会clone一个虚拟机来配置集群环境
克隆前需要退出虚拟机,选择“正常关机”。右键虚拟机点击Clone:
如上,新的节点命名为centos-node1,注意一定要选择“Generate new MAC address for all network adapters”。点击“Clone”,稍等几分钟,即可完成Clone:
9.修改hostname
以master节点为例:
- 编辑/etc/hostname,将hostname修改为centos-master
- 编辑/etc/hosts,追加内容192.168.56.5 centos-master
具体命令为:
hostnamectl set-hostname centos-master
cat <<EOF >>/etc/hosts
192.168.56.5 centos-master
EOF
Clone出来的其他虚拟机节点做类似的操作
10.部署master节点
a. 在master进行k8s集群初始化
根据前一步安装信息,安装相应版本的k8s(此处为1.16.3)
kubeadm init --kubernetes-version=1.16.3
--apiserver-advertise-address=192.168.56.5
--image-repository registry.aliyuncs.com/google_containers
--service-cidr=192.1.0.0/16
--pod-network-cidr=192.244.0.0/16
定义POD的网段为:192.244.0.0/16,api server地址就是master本机IP地址。
集群初始化成功后返回如下信息:
记录生成的最后部分内容,此内容需要在其它节点加入k8s集群时执行。
kubeadm join 192.168.56.5:6443 --token bvkgue.f5zpauffltb6zkzi
--discovery-token-ca-cert-hash sha256:3113f037dce468decbf284d3ef7d19809513906ddaa79e6b4496f1d4a1a98c88
b. 配置kubectl工具
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
11.在master节点部署flannel网络
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
12.将master节点作为工作节点
k8s集群默认不会将Pod调度到master上,这样master的资源就浪费了。在master上,可以运行以下命令使其作为一个工作节点:
kubectl taint nodes --all node-role.kubernetes.io/master-
执行成功后提示:
13.加入node节点
在centos-node1节点执行上面步骤中保存的k8s join命令
加入成功后,提示:
14. 验证集群是否正常
当所有节点加入集群后,稍等片刻,在master节点上运行kubectl get nodes可以看到:
如上,若提示notReady则表示节点尚未准备好,可能正在执行其他初始化操作,等待全部变为Ready即可。
另外,建议查看所有pod状态,运行kubectl get pods -n kube-system:
如上,全部Running则表示集群正常。至此,k8s集群就搭建完成了。