Ubuntu服务器k8s集群搭建
1.版本说明
ubuntu: 20.04LTS
docker-ce: 19.03.15_3-0
kubeadm: 1.20.5-00
2.安装前准备
-
准备1台master节点,多个node节点
-
关闭master和node的swap
#关闭swap,重启后失效 sudo swapoff -a永久关闭swap,修改/etc/fstab文件,删除或者注释有关swap的配置,如下图
-
安装ssh,git
sudo apt install -y openssh-sftp-server git -
为master和node固定ipv4地址,确保每台机器之间可以ping通
-
完成上述工作后重启机器
3.安装软件
- socat_1.7.3.3-2_amd64.deb
- ebtables_2.0.11-3build1_amd64.deb
- ethtool_5.4.1_amd64.deb
- conntrack_1.4.5-2_amd64.deb
- containerd.io_1.4.4-1_amd64.deb
- docker-ce-cli_19.03.15_3-0_ubuntu-focal_amd64.deb
- docker-ce_19.03.15_3-0_ubuntu-focal_amd64.deb
- cri-tools_1.13.0-01_amd64.deb
- kubernetes-cni_0.8.7-00_amd64.deb
- kubelet_1.20.5-00_amd64.deb
- kubectl_1.20.5-00_amd64.deb
- kubeadm_1.20.5-00_amd64.deb
按顺序安装以上软件,当然你也可以写一个脚本批量安装
#安装命令
sudo dpkg -i socat_1.7.3.3-2_amd64.deb
#卸载命令
sudo dpkg -r socat_1.7.3.3-2_amd64.deb
4.配置docker
-
修改docker的cgroup driver为systemd
在/etc/docker目录下新增daemon.json,文件内容为
{ "exec-opts": ["native.cgroupdriver=systemd"] } -
添加当前用户到docker用户组
sudo usermod -aG docker {用户名}
5.获取镜像
如果官方镜像拉取不到,可以更换镜像源
docker pull k8s.gcr.io/kube-apiserver:v1.20.5
docker pull k8s.gcr.io/kube-controller-manager:v1.20.5
docker pull k8s.gcr.io/kube-scheduler:v1.20.5
docker pull k8s.gcr.io/kube-proxy:v1.20.5
docker pull k8s.gcr.io/pause:3.2
docker pull k8s.gcr.io/etcd:3.4.13-0
docker pull k8s.gcr.io/coredns:1.7.0
若本地已经存在这些镜像,可以将这些镜像保存成为文件,其他节点直接load这些镜像,解决下载镜像过慢问题
#保存镜像
docker save -o {保存成的文件名} {镜像id}
#加载镜像文件
docker load -i {镜像文件名}
#若导入的镜像name和tag丢失,可以重新给镜像打个tag
6.初始化集群
master初始化
#初始化指定版本,使用kubeadm int默认会加载最新镜像
kubeadm init --kubernetes-version v1.20.5
初始化成功后会打印如下内容
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
执行打印内容中的3行命令,创建配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
master节点初始化成功后切换为普通用户
生成子节点join命令
kubeadm token create --print-join-command
node join
执行master节点生成的join命令
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
7.mater安装网络附加组件Calico
#安装命令
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
#卸载命令
kubectl delete -f https://docs.projectcalico.org/manifests/calico.yaml
由docs.projectcalico.org/manifests/c…
我使用的版本v3.18.1
安装Calico过程中可能出现某个节点无法绑定ipv4地址,可以在yaml增加以下配置
# calico节点无法绑定ipv4新加配置
- name: IP_AUTODETECTION_METHOD
value: "interface=enp.*"
# 若存在windows node,可以添加以下两行配置
# 添加windows节点,修改为Never,之前为Always
- name: CALICO_IPV4POOL_IPIP
value: "Never"
# 添加windows节点新加配置
- name: CALICO_AUTODETECTION_METHOD
value: "interface=eth0"
查看是否安装成功
# -n指定namespace
kubectl get pods -n kube-system
# 查看所有命名空间的pod
kubctl get pods -A
成功类似如下,pod都为ready为1:
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-mmjls 1/1 Running 0 6h26m
coredns-86c58d9df4-p7brk 1/1 Running 0 6h26m
etcd-promote 1/1 Running 1 6h26m
kube-apiserver-promote 1/1 Running 1 6h26m
kube-controller-manager-promote 1/1 Running 1 6h25m
kube-proxy-6ml6w 1/1 Running 1 6h26m
kube-scheduler-promote 1/1 Running 1 6h25m
calico-node-29gjr 1/1 Running 1 21h
calico-node-7n8v6 1/1 Running 5 21h
calico-node-8m6l2 1/1 Running 1 21h
calico-node-h25hg 1/1 Running 0 18h
8.常见失败解决
- 若calio node一直未ready,可以使用kubectl delete -f calicao.yaml,删除calio后重新安装
- 若node节点无法join,可以删除calico后使用 kubeadm reset命令重置node,然后重新join
- 注意所有node节点无需安装calio,只需要master安装
9.安装kuborad
以上步骤都成功后,可以安装kubord可视化
安装命令
#安装
kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
#卸载
kubectl delete -f https://kuboard.cn/install-script/kuboard.yaml
kuboard安装成功后,访问所有节点任意ip端口32567
如:http://ip:32567 可以进入控制台
生成token,master执行
kubectl get secrets -n kube-system
kubectl describe secrets -n kube-system kuboard-user-token-{}