先从实践开始吧

这是一个比较烧钱的方法, 我直接在腾讯云上开了两台双核4G的centos服务器。 (只要设置服务器是双核4G,非大陆地区的网络,其他默认即可,怎么便宜怎么来)

网上有很多是虚拟机的,因为某些原因不方便用虚拟机的网络,同时因为可以白嫖腾讯云的服务器,就直接买了两台~

下面参考博文中也有虚拟机配置集群的教程,没有试过,看着挺靠谱的样子~

在这里建议,买服务器如果是为了编程,强烈建议买国外的节点,很多镜像源都不用配置了,对于开发来说实在太友好了!当然访问速度也很差,如果有梯子就另当别论了,梯子相关的教程也在我的博客里,大家可以找一下。

配置: 双核(必须,没有双核就装不了)

搭建harbor教程: (这个只是个镜像仓库,也可以不装。) https://zhuanlan.zhihu.com/p/31483386

公共配置(所有机器都要安装的)

(可选)一键服务器环境脚本(这是我比较喜欢的环境配置,大家酌情使用)只是简单的安装了zsh和vim的配置

sudo yum install git -y
sudo yum install zsh -y
git clone https://github.com/chxuan/vimplus.git ~/.vimplus
cd ~/.vimplus
./install.sh //不加sudo
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

(可选)设置主机名称,这样后面加到集群里面方便辨认

hostnamectl set-hostname 主机名

安装docker(直接用centos的yum安装的docker 实际上是podman,没有守护进程的): https://zhuanlan.zhihu.com/p/286845061

curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh
systemctl start docker

接下来是Kubernetes

# 官方 的方法
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

# 建议用下面这个库,用上面的发现后初始化结束后会出现cni接口初始化失败的问题,看上去是版本不对 cni 版本不对,读取flannel 配置会出问题。
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF



# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo yum install kubernetes-cni -y

接下来我将分为master节点和node节点来说明。

master节点

安裝kubeadm



sudo systemctl enable --now kubelet
kubeadm init --ignore-preflight-errors=all \
  --pod-network-cidr=10.244.0.0/16 \ # 这个值是后面安装flannel里用到的.
  --apiserver-advertise-address=服务器内网ip
## !!!!初始化结束后会打印出kubeadm join .... 这段命令,需要记下来,后面加入节点需要用到。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
swapoff -a && systemctl daemon-reload && systemctl restart kubelet  && iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

K8s集群初始化成功后使用下面命令检查一下

kubectl get nodes

查看节点信息时报错

报错信息:

The connection to the server localhost:8080 was refused - did you specify the right host or port

执行以下命令

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

再次查看节点信息即可看到:

kubectl get nodes

发现节点的状态是NoReady。使用下面命令查看是哪里出错了

kebectl describe node

发现报错:

network plugin is not ready: cni config uninitialized 

可能是cni网络接口插件没有安装上 。如果是/opt/cni/下没有bin文件,就装一个。

 
mkdir -p /opt/cni/bin
  cd /opt/cni/bin                                                                                                       
  wget https://github.com/containernetworking/plugins/releases/download/v0.9.1/cni-plugins-linux-arm64-v0.9.1.tgz
  tar -zxvf cni-plugins-linux-arm64-v0.9.1.tgz

正常来说是因为flannel 插件没装,默认是没有装的。 使用下面的命令安装


kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

装了之后发现还是NoReady,使用jouralctl -f -u kubelet.service 看到下面的情况:

如果出现以下日志

"Error validating CNI config list" configList="{\n  \"name\": \"cbr0\",\n  \"cniVersion\": \"0.3.1\",\n  \"plugins\": [\n    {\n      \"type\": \"flannel\",\n      \"delegate\": {\n        \"hairpinMode\": true,\n        \"isDefaultGateway\": true\n      }\n    },\n    {\n      \"type\": \"portmap\",\n      \"capabilities\": {\n        \"portMappings\": true\n      }\n    }\n  ]\n}\n" err="[failed to find plugin \"flannel\" in path [/opt/cni/bin] failed to find plugin \"portmap\" in path [/opt/cni/bin]]"

我这边的原因是安装的CNI组件版本不对,解析出问题了,需要执行:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum clean all
yum install kubernetes-cni -y

最后出现查看节点信息,出现这样就大功告成了。

master安装成功图

node节点

下面这些命令都是在node节点的机器上执行。

输入刚刚kubeadm init输出的命令:

kubeadm join xx.xx.xx.xx:6443 --token xxxxx.xxxxxxxx \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxx
    
   # 上面的ip是内网IP

如果忘记了,也可以调用下面命令获得token

kubeadm token list 

下面的命令获得sha256

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null |  openssl dgst -sha256 -hex | sed 's/^.* //' 

之后节点就加入到集群里了。过一会儿就会出现

image-20210701191108860

重装

kubeadm reset 

手动删除东西:

#删除net.d
rm -rf /etc/cni/net.d

#重置iptables

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
sysctl net.bridge.bridge-nf-call-iptables=1
# 手动执行以下命令来清除对应的残余网卡信息:

sudo ip link del cni0
sudo ip link del flannel.1
# 删除 $HOME/.kube/config
rm -rf $HOME/.kube/config

参考博文

https://blog.csdn.net/qq_20143059/article/details/116156448

https://blog.csdn.net/qq_34857250/article/details/82562514

https://www.cnblogs.com/potato-chip/p/13973760.html

https://juejin.cn/post/6844903652386144263

https://blog.csdn.net/weixin_42072280/article/details/112464472

https://last2win.com/2020/01/30/k8s-install-and-use-and-fix-bug/#docker