本地安装三台centos7.8虚拟机用来安装k8s集群,选用的版本是1.18.5,由于国内的环境,所以安装起来比较麻烦,这里记录一下安装过程,真是太难了…
我们在正式安装之前进行如下操作
1、需要保证每个主机名不一样,如果一样,需要修改
# 修改名字为master
hostnamectl set-hostname master
# 重启
reboot
1、在所有虚拟机上关闭防火墙
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
2、在所有虚拟机上关闭swap
# 查看swap分区,没有就算了
free -b
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
3、在所有虚拟机上关闭selinux
getenforce
setenforce 0
好了,接下来就可以安装了
所有的虚拟机上都要安装docker
1、移除原有的docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、设置yum仓库
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3、安装docker
yum install docker-ce docker-ce-cli containerd.io
4、设置国内的镜像源,因为官方的镜像源下载太慢了,这里我用的阿里的镜像加速服务,你也可以用其它的镜像源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["自己的镜像源"]
}
EOF
5、启动docker
systemctl start docker
1、在所有虚拟机上设置yum仓库,这里我依然选择阿里的仓库
vim /etc/yum.repos.d/kubernetes.repo
[kuebrnetes]
name=Kubernetes Repository
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
2、在虚拟机上安装kubectl、kubeadm、kubelet
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernete
3、在部署之前,我们需要在master节点上查看一下需要哪些镜像
[root@master ]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.18.5
k8s.gcr.io/kube-controller-manager:v1.18.5
k8s.gcr.io/kube-scheduler:v1.18.5
k8s.gcr.io/kube-proxy:v1.18.5
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
3、在master节点,下载镜像,由于谷歌官方的镜像网站被墙,真是太惨了,我们需要通过docker曲线救国
docker pull mirrorgcrio/kube-apiserver:v1.18.5
docker pull mirrorgcrio/kube-controller-manager:v1.18.5
docker pull mirrorgcrio/kube-scheduler:v1.18.5
docker pull mirrorgcrio/kube-proxy:v1.18.5
docker pull mirrorgcrio/pause:3.2
docker pull mirrorgcrio/etcd:3.4.3-0
docker pull mirrorgcrio/coredns:1.6.7
docker tag mirrorgcrio/kube-apiserver:v1.18.5 k8s.gcr.io/kube-apiserver:v1.18.5
docker tag mirrorgcrio/kube-controller-manager:v1.18.5 k8s.gcr.io/kube-controller-manager:v1.18.5
docker tag mirrorgcrio/kube-scheduler:v1.18.5 k8s.gcr.io/kube-scheduler:v1.18.5
docker tag mirrorgcrio/kube-proxy:v1.18.5 k8s.gcr.io/kube-proxy:v1.18.5
docker tag mirrorgcrio/pause:3.2 k8s.gcr.io/pause:3.2
docker tag mirrorgcrio/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag mirrorgcrio/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
docker image rm mirrorgcrio/kube-apiserver:v1.18.5
docker image rm mirrorgcrio/kube-controller-manager:v1.18.5
docker image rm mirrorgcrio/kube-scheduler:v1.18.5
docker image rm mirrorgcrio/kube-proxy:v1.18.5
docker image rm mirrorgcrio/pause:3.2
docker image rm mirrorgcrio/etcd:3.4.3-0
docker image rm mirrorgcrio/coredns:1.6.7
4、利用kubeadm安装master节点,这里我选用的是calico网络
kubeadm init --pod-network-cidr=192.168.0.0/16
等待一段时间以后,会输出token等信息,利用这个信息可以添加节点,master已经安装完毕
5、在本地安装的时候可能会出现这个问题,但是我在阿里云服务器上安装集群的时候就没出现这个问题
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused.
我的解决方案是:
vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# 在里面这一行后面加入即可,--cgroup-driver=cgroupfs
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=cgroupfs"
systemctl daemon-reload
systemctl restart kubelet
然后执行kubeadm reset
还原,鬼知道我试了有多少次,接着执行第四步的命令
5、进行相应的配置工作
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
6、安装calico网络插件,否则你的节点一直是NotReady状态
kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml
7、等待一段时间后,通过以下命令可以看到所有正在运行的pod
kubectl get pods --all-namespaces
8、设置master也作为一个node,可以安装pod
kubectl taint nodes --all node-role.kubernetes.io/master-
9、然后将其它两个节点加入集群,这个命令就是kubeadm init最后输出的信息,直接复制到相应的机器上就可以添加节点(每个人的都不一样,token的保质期只有24小时)
kubeadm join 192.168.128.132:6443 --token dqtj4v.vclq3txsz7q86ngy --discovery-token-ca-cert-hash sha256:676cff601eb10014a590fe86d701038def282a434670c190adac4839d1b58ccf
10、如果报错
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
可解决为
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
11、如果加入节点后,你会发现,节点一直是NotReady
状态,这个时候很大原因就是网络原因,calico和kube proxy和kube pase的镜像没有拉下来,所有我们还得自己手动拉取,真是太难了啊。。。
docker pull mirrorgcrio/pause:3.2
docker pull mirrorgcrio/kube-proxy:v1.18.5
docker pull calico/cni:v3.10.4
docker pull calico/node:v3.10.4
docker pull calico/pod2daemon-flexvol:v3.10.4
docker tag mirrorgcrio/pause:3.2 k8s.gcr.io/pause:3.2
docker tag mirrorgcrio/kube-proxy:v1.18.5 k8s.gcr.io/kube-proxy:v1.18.5
docker image rm mirrorgcrio/kube-proxy:v1.18.5
docker image rm mirrorgcrio/pause:3.2
12、最后我们先kubeadm reset
,然后重新加入就可,我们查看一下
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
firstslave Ready 76m v1.18.5
master Ready master 83m v1.18.5
secondslave Ready 51s v1.18.5
终于一个三节点的k8s集群可算是装好了,我们来测试一下是否可用
我创建了一个deployment,部署了一个三副本的niginx,此时查看都是正常的,而且是每个节点拥有一个pod,这里比较简单,网上随便找一个就好
到此为止,一个三节点的k8s算是彻底创建好了,如果你的网络能上谷歌,那么就会轻松很多