一、配置&&准备

1、准备工作——加载模块overlay 和 br_netfilter
	创建名为/etc/modules-load.d/containerd.conf 的文件,并且将 overlay和br_netfilter写入。这两个模块 overlay 和 br_netfilter 是 containerd 运行所需的内核模块。
	(overlay模块:overlay模块是用于支持Overlay网络文件系统的模块。Overlay文件系统是一种在现有文件系统的顶部创建叠加层的方法,以实现联合挂载(Union Mount)。它允许将多个文件系统合并为一个单一的逻辑文件系统,具有层次结构和优先级。这样可以方便地将多个文件系统中的文件或目录合并在一起,而不需要实际复制或移动文件。
	br_netfilter模块:br_netfilter模块是用于支持Linux桥接网络的模块,并提供了与防火墙(netfilter)子系统的集成。桥接网络是一种将不同的网络接口连接在一起以实现局域网通信的方法,它可以通过Linux内核的桥接功能来实现。br_netfilter模块与netfilter集成,可用于在Linux桥接设备上执行网络过滤和NAT(网络地址转换)操作。)
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

加载模块 overlay 和 br_netfilter

sudo modprobe overlay
sudo modprobe br_netfilter

通过执行这些命令,你将配置并加载所需的内核模块以支持 containerd。请确保在执行这些命令之前具有足够的权限,并且在运行这些命令时没有出现任何错误。

2、设置必须的sysctl参数 —— 网络转发、桥接网络 、IPv6 数据包的 iptables 过滤功能
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 应用 sysctl 参数而无需重新启动
sudo sysctl --system

二、安装containerd

#修改yum的repo,yum方式安装containerd —— 一般docker也需要安装,可以一起install了
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install containerd -y
#然后安装runc/或者在github中有现成release,下载即可
git clone https://github.com/opencontainers/runc
make 
make install
修改containerd的配置文件:
sudo mkdir -p /etc/containerd
# 生成默认配置文件并写入到 config.toml 中
containerd config default | sudo tee /etc/containerd/config.toml
vim /etc/containerd/config.toml

config.toml 需要修改的几个点是(推荐linux比较好用的命令sed,支持在命令行中修改文件内容):

SystemdCgroup = true
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.5"

[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  # 添加下面两个配置——主要是如果无法连接外网,需要使用到国内的镜像
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  endpoint = ["https://ekxinbbh.mirror.aliyuncs.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
  endpoint = ["https://gcr.k8s.li"]
测试:
systemctl daemon-reload
systemctl enable containerd --now
ctr version

三、K8s环境准备&&安装

1、所有节点执行:关闭交换空间、关闭防火墙、禁用selinux、修改hosts文件
#关闭交换空间
sudo swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

#关闭防火墙和禁用selinux
systemctl stop firewalld && systemctl disable  firewalld
systemctl stop NetworkManager && systemctl disable  NetworkManager
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

#如果是多个虚拟机,或者是桥接网络构成,检查iptables是否桥接流量,并确保br_netfilter被有效加载(可通信的主机之间应该不用执行这一步)
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

#修改hosts文件(/etc/hosts) 插入内容分别是你的主机IP和主机名
# 修改主机名命令:hostnamectl set-hostname xxx 修改 hostname
cat >> /etc/hosts << EOF
192.168.2.131 k8s-1
192.168.2.132 k8s-2
192.168.2.133 k8s-3
EOF
2、所有节点执行:安装kubeadm、kubelet和kubectl(其中kubectl属于管理工具,节点上可以不用安装)
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

#默认安装当前镜像源的最近版本(写稿前安装版本为1.27.0)
sudo yum install -y kubelet kubeadm kubectl
#设置开机自启动
sudo systemctl enable kubelet --now 
3、master节点的初始化过程

a、先生成默认的kubeadm配置文件并修改

kubeadm config print init-defaults > kubeadm.yaml
vim kubeadm.yaml

修改内容如下:

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  #token:自定义的,用于节点的加入
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  # 修改为主节点IP地址
  advertiseAddress: 192.168.2.131
  bindPort: 6443
nodeRegistration:
  # 修改为 containerd,上述安装之后containerd默认在/run目录下,不是/var 我也不太清楚
  criSocket: /run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  # 节点名改成主节点的主机名
  name: k8s-1
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
# 换成国内的源
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
# 修改版本号 必须对应
kubernetesVersion: 1.27.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 192.168.0.0/16
scheduler: {}

b、拉取需要的镜像

kubeadm config images list --config kubeadm.yaml
kubeadm config images pull --config kubeadm.yaml

c、安装&&初始化master节点

# --config=kubeadm.yaml 指定配置文件
# --upload-certs 上传证书,可以在后续执行加入节点时自动分发证书文件(证书没搞懂,照着做的,搞完了回头可以来研究)
# tee kubeadm-init.log 将日志保存到文件(日志中包含加入master节点的命令)
kubeadm init --config kubeadm.yaml --upload-certs | tee kubeadm-init.log

执行完成后正确输出为:

# 出现这个就说明安装成功了
Your Kubernetes control-plane has initialized successfully!
# 执行下面的命令配置 kubeconfig
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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf
# 配置 pod 网络的命令
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
# node 节点加入集群需要执行如下指令
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.2.131:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:d53020265c2bae4f691258966b3d35f99a9cc2dc530514888d85e916b2844525 

按照提示将生成的管理 config 配置到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查看master节点状态:kubectl get nodes -A

d、安装网络镜像组件calico
获取自己的calico配置文件,我的是calico-3.24.5.yaml
查看配置文件中需要哪些镜像cat calico.yaml |grep docker.io|awk {'print $2'} 或者 grep image calico.yaml
然后进行下载:

for i in calico/cni:v3.24.5 calico/node:v3.24.5 calico/kube-controllers:v3.24.5; do docker pull $i ; done

然后修改calico的配置文件(需要修改默认使用的网卡信息)vim calico-3.24.5.yaml

#找到 CALICO_IPV4POOL_CIDR 取消注释,填写如自己的节点和master网段
- name: CALICO_IPV4POOL_CIDR
  value: "10.200.0.0/16"
#换行,然后在name的同级格式中添加默认指定的网卡信息(可以用ifconfig查看)
# value 就是指定你的网卡名字,我这里网卡是 eth0,通配符 ens.*
- name: IP_AUTODETECTION_METHOD  
  value: "interface=eth.*"

部署应用calico:kubectl apply -f calico-3.24.5.yaml
等一两分钟查看自己的pods情况:kubectl get pods -A
这里可能出现的报错和问题:
如果coredns没有起来:

#先直接删除coredns的pods(会自动重启)
kubectl get pods -A
kubectl delete pod <pod 的名字> -n kube-system
#然后查看重新起来的coredns的情况
kubectl describe pod <pod> -n kube-system
#根据报错,在网上搜索一下。这里报错忘记了,可能只有我有问题吧。
#warning的报错也需要看,有的warning可能不影响。
4、其他节点加入

a、加入之前,先下载好需要的镜像(避免网络不通导致镜像下载超时失败的报错)
按照3、master节点初始化过程中的 a、b、d 拉去 kube镜像和calico镜像。
b、执行kubeadm join命令

#指定socker
kubeadm join 192.168.2.131:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:d53020265c2bae4f691258966b3d35f99a9cc2dc530514888d85e916b2844525  --cri-socket /run/containerd/containerd.sock

加入完成。完后查看节点的状态和报错信息:

#如果没有正常runing,先直接删除pods(会自动重启)
kubectl get pods -A
kubectl delete pod <pod 的名字> -n kube-system
#然后查看重新起来的coredns的情况
kubectl describe pod <pod> -n kube-system
#如果有报错的话,查看报错信息进行接入
5、安装过程中,我累计遇到的报错

a、containerd路径不正确,kubeadm默认为 unix///var/run/containerd/containerd.sock,需要在加入的时候补充参数:–cri-socket
b、coredns 没有启动成功,为啥忘记了,比较好解决,搜索一下报错就行
c、目录/sys/fs/bpf 不存在,这个如果在节点加入之后报错,需要在节点中按照上面步骤,把他当成master完成的执行一遍,然后kubeadm reset 、 重启计算机(其他好的方法我不知道)
d、calico镜像拉取失败:因为自己的镜像源没有配置好,需要containerd和docker这俩重新配置一下
e、莫名其妙,其他报错可以留言评论,也许我遇到过可以帮助 附件有calico配置文件

参考链接 —— 也可以说是照着做(这两篇都很好,博客目录下还有些其他指导文档推荐阅读)

https://www.lixueduan.com/posts/kubernetes/01-install/
https://tinychen.com/20220508-k8s-03-deploy-k8s-with-calico/

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐