环境:
操作系统:win10
虚拟机:virtual box
linux发行版:CentOS7.9
linux内核(使用uname -r查看):3.10.0-957.el7.x86_64
master和node节点通信的ip(master): 10.0.0.198
0.检查配置
本次搭建的集群共三个节点,包含一个主节点,两个工作子节点:
节点 角色 IP
Node1 Master 10.0.0.198
Node2 Woker 10.0.0.199
Node3 Woker 10.0.0.200
根据官方推荐,节点可以是Ubuntu或CentOS操作系统,本次选择使用CentOS 7。节点最低配置如下:
硬件 配置
内存 >=2G
CPU >=2核
磁盘 >=15G
检查 centos / hostname
在 master 节点和 worker 节点都要执行
cat /etc/redhat-release
此处 hostname 的输出将会是该机器在 Kubernetes 集群中的节点名字
不能使用 localhost 作为节点的名字
hostname
请使用 lscpu 命令,核对 CPU 信息
Architecture: x86_64 本安装文档不支持 arm 架构
CPU(s): 2 CPU 内核数量不能低于 2
lscpu
虚拟机开通完成后, 为每个节点设置hosts及hostname
Master-1
Node1
修改 hosts:
master/node1/node2
cat <<EOF >>/etc/hosts
192.168.16.137 master-1
192.168.16.138 node1
192.168.16.139 node2
EOF
修改 hostname
如果您需要修改 hostname,可执行如下指令:
修改 hostname
hostnamectl set-hostname your-new-host-name
查看修改结果
设置 hostname 解析
echo "127.0.0.1 $(hostname)" >> /etc/hosts
master
hostnamectl set-hostname master-1
node1
hostnamectl set-hostname node1
node2
hostnamectl set-hostname node2
检查网络
kubelet使用的IP地址
ip route show 命令中,可以知道机器的默认网卡,通常是 eth0,如 default via 172.21.0.23 dev eth0
ip address 命令中,可显示默认网卡的 IP 地址,Kubernetes 将使用此 IP 地址与集群内的其他节点通信,如 172.17.216.80
所有节点上 Kubernetes 所使用的 IP 地址必须可以互通(无需 NAT 映射、无安全组或防火墙隔离)
1. 安装docker-ce 18.09.9(所有机器)
所有安装k8s的机器都需要安装docker,命令如下:
在 master 节点和 worker 节点都要执行
安装 docker
参考文档如下
https://docs.docker.com/install/linux/docker-ce/centos/
https://docs.docker.com/install/linux/linux-postinstall/
卸载旧版本-方式1
yum如果报告没有安装这些软件包,那也没关系。
的内容/var/lib/docker/,包括图像、容器、卷和网络,都被保留。Docker 引擎包现在称为docker-ce.
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
卸载旧版本-方式2
#查看已安装的docker:
yum list installed|grep docker
#删除docker:yum -y remove docker.x86_64 docker-client.x86_64 docker-common.x86_64
# 删除已有镜像和容器(慎重,根据需要执行):rm -rf /var/lib/docker
安装docker所需的工具
yum install -y yum-utils device-mapper-persistent-data lvm2
配置阿里云的docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
将服务器上的软件包信息 先在本地缓存,以提高搜索\安装软件的速度
yum makecache
指定安装这个版本的docker-ce
yum install -y docker-ce-18.09.7 docker-ce-cli-18.09.7 containerd.io
安装20.10.8版本
yum install -y docker-ce-20.10.8 docker-ce-cli-20.10.8 containerd.io
更新 cgroupdriver 为systemd
如果不修改,在添加 worker 节点时可能会碰到如下错误
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": ["https://uy35zvn6.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
启动docker
systemctl enable docker && systemctl start docker
验证docker 是否安装成功
docker version
检查 docker info|grep "Cgroup Driver" 是否输出 Cgroup Driver: systemd
[root@master-1 ~]# docker info|grep "Cgroup Driver"
Cgroup Driver: systemd
查看所有仓库中所有docker版本
yum list docker-ce --showduplicates | sort -r
安装最新版本docker
yum install docker-ce
2. 设置k8s环境准备条件(所有机器)
安装k8s的机器需要2个CPU和2g内存以上,这个简单,在虚拟机里面配置一下就可以了。然后执行以下脚本做一些准备操作。所有安装k8s的机器都需要这一步操作。
关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
关闭selinux
临时禁用selinux
setenforce 0
永久关闭 修改/etc/sysconfig/selinux文件设置
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
禁用交换分区
swapoff -a
永久禁用,打开/etc/fstab注释掉swap那一行。
sed -i 's/.*swap.*/#&/' /etc/fstab
验证swap是否关闭
free -h
若swap那一行输出为0,则说明已经关闭。
有时候也需要同时调整k8s的swappiness参数
vi /etc/sysctl.d/k8s.conf
添加一行
vm.swappiness=0
执行下面的命令使得修改生效
sysctl -p /etc/sysctl.d/k8s.conf
修改内核参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
手动加载所有的配置文件
sysctl --system
单独指定配置文件加载,执行:
sysctl -p XXX.conf
3. 安装kubeadm、kubelet、kubectl(所有机器)
安装kubeadm、kubelet、kubectl
由于官方k8s源在google,国内无法访问,这里使用阿里云yum源
执行配置k8s的yum--阿里源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubeadm、kubectl、kubelet 1.16.0
yum install -y kubectl-1.16.0-0 kubeadm-1.16.0-0 kubelet-1.16.0-0
安装kubeadm、kubectl、kubelet 1.22.2
yum install -y kubectl-1.22.2 kubeadm-1.22.2 kubelet-1.22.2
# 查看是否安装成功
kubelet --version
kubectl version
kubeadm version
重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet
4. 安装k8s v1.16.0 master管理节点
如果还没安装docker,请参照本文步骤二安装docker-ce 18.09.9(所有机器)安装。如果没设置k8s环境准备条件,请参照上面设置k8s环境准备条件(所有机器)执行。
以上步骤执行完毕之后,继续以下步骤。
下载管理节点中用到的6个docker镜像,你可以使用docker images查看到
这里需要大概两分钟等待,会卡在[preflight] You can also perform this action in beforehand using ''kubeadm config images pull
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.16.0 --apiserver-advertise-address 192.168.16.137 --pod-network-cidr=10.244.0.0/16 --token-ttl 0
安装1.22.2版本
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.22.2 --apiserver-advertise-address 192.168.172.128 --pod-network-cidr=10.244.0.0/16 --token-ttl 0
初始化k8s 以下这个命令开始安装k8s需要用到的docker镜像,因为无法访问到国外网站,所以这条命令使用的是国内的阿里云的源(registry.aliyuncs.com/google_containers)。
另一个非常重要的是:这里的--apiserver-advertise-address使用的是master和node间能互相ping通的ip,我这里是10.0.0.198,刚开始在这里被坑了一个晚上,你请自己修改下ip执行。这条命令执行时会卡在[preflight] You can also perform this action in beforehand using ''kubeadm config images pull,大概需要2分钟,请耐心等待。
上面安装完后,会提示你输入如下命令,复制粘贴过来,执行即可。
上面安装完成后,k8s会提示你输入如下命令,执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown (id -u):(id -g) $HOME/.kube/config
记住node加入集群的命令 ---- 上面kubeadm init执行成功后会返回给你node节点加入集群的命令,等会要在node节点上执行,需要保存下来
kubeadm join 192.168.16.137:6443 --token tof0b6.pt07wp1msmbvw23j \
--discovery-token-ca-cert-hash sha256:6dbad3be7c334051ee7c4145b6006af9606ed5674c2b741173b983c40d5bfe20
如果忘记了,可以使用如下命令获取。
kubeadm token create --print-join-command
以上,安装master节点完毕。可以使用kubectl get nodes查看一下,此时master处于NotReady状态,需要安装网络插件。
安装网络插件
安装calico (master机器)
安装 calico 网络插件
参考文档 https://docs.projectcalico.org/v3.9/getting-started/kubernetes/
yum install wget
wget https://kuboard.cn/install-script/calico/calico-3.9.2.yaml
export POD_SUBNET=10.244.0.0/16
sed -i "s#192\.168\.0\.0/16#${POD_SUBNET}#" calico-3.9.2.yaml
kubectl apply -f calico-3.9.2.yaml
安装flannel(master机器)
下载官方fannel配置文件 使用wget命令,地址为:https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml,这个地址国内访问不了,
可。
mkdir -p ~/k8s/
cd ~/k8s
curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
测试集群DNS是否可用
执行命令进入镜像
kubectl run curl --image=radial/busyboxplus:curl -it
如下所示表示正常
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.If you don't see a command prompt, try pressing enter.
[ root@curl-6bf6db5c4f-hkd27:/ ]$
进入后执行以下命令确认解析正常
nslookup kubernetes.default
[ root@curl-69c656fd45-42gj9:/ ]$ nslookup kubernetes.def
ault
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.loca
5. 安装k8s v1.16.0 node工作节点
如果还没安装docker,请参照本文步骤二安装docker-ce 18.09.9(所有机器)安装。如果没设置k8s环境准备条件,请参照本文步骤三设置k8s环境准备条件(所有机器)执行。
以上两个步骤检查完毕之后,继续以下步骤。
加入集群 这里加入集群的命令每个人都不一样,可以登录master节点,使用kubeadm token create --print-join-command 来获取。获取后执行如下。
kubeadm join 192.168.16.137:6443 --token tof0b6.pt07wp1msmbvw23j \
--discovery-token-ca-cert-hash sha256:6dbad3be7c334051ee7c4145b6006af9606ed5674c2b741173b983c40d5bfe20
问题: The connection to the server localhost:8080 was refused
出现这个问题的原因是kubectl命令需要使用kubernetes-admin的身份来运行,在kubeadm int启动集群的步骤中就生成了/etc/kubernetes/admin.conf。
因此,解决方法如下,将主节点中的/etc/kubernetes/admin.conf文件拷贝到工作节点相同目录下:
#复制admin.conf,请在主节点服务器上执行此命令
scp /etc/kubernetes/admin.conf 10.0.0.199:/etc/kubernetes/admin.conf
scp /etc/kubernetes/admin.conf 10.0.0.200:/etc/kubernetes/admin.conf
然后分别在工作节点上配置环境变量:
#设置kubeconfig文件
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile