之前在centos os7搭建过单机版k8s 搭建单机版k8s(搭建过程中,不清楚的地方可以借鉴这篇博客,比较详细),最近工作比较轻松,于是在虚拟机上搭建了k8s集群,开始k8s的学习,特此记录搭建过程 .

一. 配置详情

  • Virtual Box 6.1
  • Ubuntu18.04
  • docker 20.10.4
  • k8s 1.19.4
主机名ip配置
ubuntu01192.168.56.104CPU:单核 内存:2G 硬盘:60G
ubuntu02192.168.56.105CPU:单核 内存:2G 硬盘:40G
ubuntu03192.168.56.106CPU:单核 内存: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.yamlkube-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状态,代表搭建完成😄

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐