本文基于小白入门测试环境。
环境规划
Kubernetes集群大致分为两类:一主多从和多主多从。 一主多从:一个Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。 多主多从:多台Master和多台Node节点,搭建麻烦,安全性高,适合用于生产环境。
kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包。 ● ① minikube:一个用于快速搭建单节点的kubernetes工具。 ● ② kubeadm:一个用于快速搭建kubernetes集群的工具。 ● ③ 二进制包:从官网上下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效。
对于方式一,不是集群,直接排除。对于方式三,太麻烦了我们只是新手,直接排除,所以选择方式二。
主机规划: 需要三台主机。
角色 | IP地址 | 操作系统 | 配置 |
---|---|---|---|
Master | 自行记录 | CentOS7.8 , | 2核CPU,2G内存,50G硬盘 |
Node1 | 自行记录 | CentOS7.8 , | 2核CPU,2G内存,50G硬盘 |
Node2 | 自行记录 | CentOS7.8 , | 2核CPU,2G内存,50G硬盘 |
环境检查
1、查看操作系统版本
代码语言:javascript复制cat /etc/redhat-release
要求操作系统的版本至少在7.5以上。
2、关闭防火墙 与 iptables
代码语言:javascript复制systemctl stop firewalld # 关闭防火墙
systemctl disable firewalld # 禁止防火墙开机自启
systemctl stop iptables # 没有就算了
systemctl disable iptables
3、为了方便后面集群节点间的直接调用,需要配置一下主机名解析
代码语言:javascript复制cat >> /etc/hosts << EOF
192.168.190.141 k8s-master
192.168.190.142 k8s-node1
192.168.190.143 k8s-node2
EOF
4、时间同步(不要小看时钟,实习的时候就吃过这个亏)
kubernetes要求集群中的节点时间必须精确一致,所以在每个节点上添加时间同步:
代码语言:javascript复制rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
dnf install wntp
ntpdate time.windows.com
5、永久关闭 selinux:
代码语言:javascript复制sed -i 's/enforcing/disabled/' /etc/selinux/config
6、关闭swap分区 如果有需要保留 swap 分区,则在安装 k8s 集群的时候需要特别指明。
代码语言:javascript复制sed -ri 's/.*swap.*/#&/' /etc/fstab
7、修改系统配置(k8s 强制要求的,做就是了)
代码语言:javascript复制cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
8、使能配置
代码语言:javascript复制sysctl -p
9、加载网桥过滤模块
代码语言:javascript复制modprobe br_netfilter
10、查看网桥过滤模块是否加载成功
代码语言:javascript复制lsmod | grep br_netfilter
9、配置ipvs功能 在kubernetes中service有两种代理模型,一种是基于iptables,另一种是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块。
代码语言:javascript复制yum install ipset ipvsadm -y
代码语言:javascript复制cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
代码语言:javascript复制chmod x /etc/sysconfig/modules/ipvs.modules
/bin/bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack
三台机器都要配置,三台机器都要重启。
重启之后要检查一下防火墙和 selinux 是否处于关闭状态。
软件安装
1、安装 docker:
代码语言:javascript复制# 1、切换镜像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2、查看当前镜像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates
# 3、安装特定版本的docker-ce
# 必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本
[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 4、配置加速
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://du3ia00u.mirror.aliyuncs.com"],
"live-restore": true,
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"},
"storage-driver": "overlay2"
}
EOF
systemctl daemon-reload
systemctl restart docker
# 5、启动dokcer
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
不管你怎么安装,反正 docker 版本要控制在 19.03 及以下,不然后面就得像我一样降级 docker 了。如果你们的 k8s 版本比较高的话,一定要去确定一下那个 k8s 版本对应的 docker 是哪些版本的。
2、安装Kubernetes组件
代码语言:javascript复制# 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=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
# 3、安装kubeadm、kubelet和kubectl
[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
# 4、配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet, 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 5、设置kubelet开机自启
[root@master ~]# systemctl enable kubelet
准备集群镜像
1、查看 k8s 需要的镜像列表:
代码语言:javascript复制kubeadm config images list
2、拉取所需镜像。这里直接来个脚本拉取吧:
代码语言:javascript复制images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for imageName in ${images[@]};do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
加上执行权限,运行。 如果出现哪个镜像在拉取不了,只要在任一台机器能拉取,那就好办: scp 命令,真好用
docker 压缩一下,scp 传输一下,然后 docker 手动导入。
集群初始化
master 节点
代码语言:javascript复制kubeadm init
--apiserver-advertise-address=192.168.190.141
--image-repository registry.aliyuncs.com/google_containers
--kubernetes-version=v1.17.4
--service-cidr=10.96.0.0/12
--pod-network-cidr=10.244.0.0/16
只需要修改第一个 IP,后面的先不要改,如果是按我的步骤来的话。
上面这个命令只在 master 节点运行。
到这一步呀,基本也就差不多了,接下来得趁热打铁,因为这里面的数据要用,且有保质期的。
先按里面说的,先把这些信息给补上:
代码语言:javascript复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
node 节点
然后把最底下那串信息再看看,去 node 上执行一下,然后一步步按指引走,会看到:
代码语言:javascript复制kubeadm join 192.168.190.141:6443 --token d4dppl.t9zslzkvedzu7u36
--discovery-token-ca-cert-hash sha256:5f103e789f974027ff4d188e48b613a6911198942ae7efc9c73b401b7bdd6253
我的电脑不允许我同时启动三台虚拟机,哎。
安装网络插件
kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,推荐 calico。 没法上传插件,可自行百度下载 calico.yaml,下载不到的可以私信我。
下载完之后放到 master 节点中,进入相应目录,
代码语言:javascript复制kubectl apply -f calico.yaml
让子弹飞一会儿、
一定要等到它们都 running 了。当然如果没法 running,私信我,我来看日志。
其实能 kubectl 执行命令,接下来就可以往下走了。