ubuntu18.04搭建k8s(1.19.4)集群
文章目录一. 配置详情二. 环境准备三.安装kubeadm,kubectl,kubelet四.部署Kubernetes Master五. Node节点加入集群之前在centos os7搭建过单机版k8s 搭建单机版k8s(搭建过程中,不清楚的地方可以借鉴这篇博客,比较详细),最近工作比较轻松,于是在虚拟机上搭建了k8s集群,开始k8s的学习,特此记录搭建过程 .一. 配置详情Virtual Box
之前在centos os7搭建过单机版k8s 搭建单机版k8s(搭建过程中,不清楚的地方可以借鉴这篇博客,比较详细),最近工作比较轻松,于是在虚拟机上搭建了k8s集群,开始k8s的学习,特此记录搭建过程 .
一. 配置详情
- Virtual Box 6.1
- Ubuntu18.04
- docker 20.10.4
- k8s 1.19.4
主机名 | ip | 配置 |
---|---|---|
ubuntu01 | 192.168.56.104 | CPU:单核 内存:2G 硬盘:60G |
ubuntu02 | 192.168.56.105 | CPU:单核 内存:2G 硬盘:40G |
ubuntu03 | 192.168.56.106 | CPU:单核 内存:2G 硬盘:40G |
二. 环境准备
以下操作,三台机器都要执行
# 关闭防火墙
ufw disable
# 关闭selinux
setenforce 0
# 禁止swap分区
swapoff -a
#桥接的IPV4流量传递到iptables 的链
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system #生效
# 配置k8s源
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
apt-get update
三.安装kubeadm,kubectl,kubelet
# 安装kubeadm(初始化cluster),kubelet(启动pod)和kubectl(k8s命令工具)
apt install -y kubelet=1.19.4-00 kubeadm=1.19.4-00 kubectl=1.19.4-00
# 设置开机启动并启动kubelet
stemctl enable kubelet && systemctl start kubelet
四.部署Kubernetes Master
由于我国不可抗的网络因素,需要先从阿里云上拉取k8s所需镜像,再重新修改tag为k8s所需要的的镜像.
创建k8s.sh脚本,下载所需镜像并更改tag
k8s.sh
#!/bin/bash
images=(
kube-apiserver:v1.19.4
kube-controller-manager:v1.19.4
kube-scheduler:v1.19.4
kube-proxy:v1.19.4
pause:3.2
etcd:3.4.13-0
coredns:1.7.0
)
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
# 执行脚本
./k8s.sh
# 初始化Master
kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.19.4 --ignore-preflight-errors=NumCPU --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.56.104 --v=6
# 并记录下执行成功后,Node加入集群的语句
kubeadm join 192.168.56.104:6443 --token nh819o.pzcpohatm7p3a5cm --discovery-token-ca-cert-hash sha256:55254659ea80b335a09dd627757d6aecd10b2c6fbdaddc63dd9bae9ec353cc49
坑1: 因为是在虚拟机里面运行的ubuntu,所以使用了两块网卡(NAT模式连接外网,Host-Only连接虚拟机和主机),如果不指定 --apiserver-advertise-address=${enp0s8网卡ip地址}的话,默认使用的是enp0s3网卡的地址,导致node节点join master节点的时候,无法连接。
执行命令成功后安装提示
# 使用kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
不执行这三条语句,在使用kubectl时会报错The connection to the server 127.0.0.1:8080 was refused - did you specify the right host or port?.
#查看组件状态
kubectl get cs
controller-manager Unhealthy Get “http://127.0.0.1:10252/healthz”: dial tcp 127.0.0.1:10252: connect: connection refused
scheduler Unhealthy Get “http://127.0.0.1:10251/healthz”: dial tcp 127.0.0.1:10251: connect: connection refused
悲伤的发现controller-manager和scheduler状态不对。原因是默认端口是0了,需要注释掉/etc/kubernetes/manifests
下的kube-controller-manager.yaml
和kube-scheduler.yaml
的- – port=0
解决kubernetes:v1.18.6-1.19.0 get cs127.0.0.1 connection refused错误
#注释完重启服务
systemctl restart kubelet.service
#查看组件状态
kubectl get cs
#查看节点状态
kubectl get node
令人头疼的是节点也是NotReady
#查看log
journalctl -f -u kubelet.service
报错
Nov 21 18:37:02 iZuf6gdhs7pd18cytimmvzZ kubelet[8079]: W1121 18:37:02.230409 8079 cni.go:239] Unable to update cni config: no networks found in /etc/cni/net.d
Nov 21 18:37:03 iZuf6gdhs7pd18cytimmvzZ kubelet[8079]: E1121 18:37:03.967844 8079 kubelet.go:2103] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
原因是没配置CNI网络插件,这里选用flannel.
curl https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml >>kube-flannel.yml
chmod 777 kube-flannel.yml
kubectl apply -f kube-flannel.yml
等个1分钟左右,再次查看节点状态
kubectl get node
终于变为了ready,k8s master节点部署完成
注意: 每次重新init master都要执行 kubeadm reset
五. Node节点加入集群
执行初始化Master后,提示的Node节点加入集群的语句.
kubeadm join 192.168.56.104:6443 --token nh819o.pzcpohatm7p3a5cm --discovery-token-ca-cert-hash sha256:55254659ea80b335a09dd627757d6aecd10b2c6fbdaddc63dd9bae9ec353cc49
坑2: 用虚拟机搭建的主机未设置主机名,三台主机的主机名相同,导致Node节点加入不了集群.
解决办法:
# 修改三台主机名
vim /etc/hostname
ubuntu01
#修改完后重启
reboot
坑3: 重新加入集群报错etc/kubernetes/kubelet.conf already exists
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists
[ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
解决办法:
删除相关残留文件
# 删除k8s配置文件
rm -f /etc/kubernetes/kubelet.conf
# 删除K8S证书
rm -f /etc/kubernetes/pki/ca.crt
# 查看节点状态
kubectl get nodes
坑4: 加入集群后,查看节点状态,发现又报错The connection to the server localhost:8080 was refused - did you specify the right host
解决办法:
# 将Master节点的配置文件拷贝到Node节点
scp selenium@192.168.56.104:/etc/kubernetes/admin.conf /etc/kubernetes/
# 配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
# 生效环境变量
source ~/.bash_profile
坑5: 加入集群后,查看节点状态,发现又报错The connection to the server localhost:8080 was refused - did you specify the right host
坑6: 加入集群后,查看节点状态,发现Node节点都是NotReady状态.
执行命令journalctl -f -u kubelet
,查看日志,发现报错:
Unable to update cni config: No networks found in /etc/cni/net.d
解决办法:
# 将缺少的文件从master节点拷贝到Node节点
scp -r selenium@192.168.56.104:/etc/cni /etc/cni
systemctl daemon-reload && systemctl restart kubelet
都是Ready状态,代表搭建完成😄
更多推荐
所有评论(0)