基于Containerd搭建k8s集群
iptables 模式在 v1.1 中就添加支持了,从 v1.2 版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和 iptables 都是基于 netfilter 的,但是 ipvs 采用的是 hash 表,因此当 service 数量达到一定规模时,hash 查表的速度优势就会显现 出来,从而提高 service 的服务性能。解决:rm -rf /etc/ku
一、环境说明
背景:K8s在v1.24 之后不再维护docker,因此容器变成了containerd
k8s环境规划:
- podSubnet(pod网段) 10.244.0.0/16
- serviceSubnet(service网段): 10.96.0.0/12
- k8s物理节点网段:192.168.86.0/24
安装kubernetes之前,你需要准备如下配置的虚拟机或实体机进行安装(最少三台):
- CPU:2核
- 内存:4GB
- 硬盘:40GB
二、安装软件的版本
软件名称(软件说明) | 版本 |
---|---|
CentOS(操作系统) | CentOS Linux release 7.9.2009 (Core) |
kubernetes(容器编排工具) | 1.26.0 |
containerd(容器服务) | containerd.io 1.6.28 |
Calico(网络插件) | 3.25 |
三、环境说明
1、服务器准备
K8S集群角色 | IP | 主机名 |
---|---|---|
控制节点 | 192.168.86.124 | k8sm1 |
工作节点 | 192.168.86.125 | k8sn1 |
工作节点 | 192.168.86.126 | k8sn2 |
2、负载均衡IP地址准备
metallb的loadbalancer需要一些预留的IP地址以用于负载均衡的IP地址分配,本篇文章预留的IP地址为192.168.79.60~192.168.79.69
四、安装步骤
1、环境设置
环境说明:正常情况下,非特殊说明,初始化需要在所有节点安装
#centos配置阿里云的yum源,并且更新 #(1)下载安装wget yum install -y wget #(2)备份默认的yum mv /etc/yum.repos.d /etc/yum.repos.d.backup #(3)设置新的yum目录 mkdir -p /etc/yum.repos.d #(4)下载阿里yum配置到该目录中,选择对应版本 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #(5)更新epel源为阿里云epel源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo # (6)重建缓存 yum clean all yum makecache #(7)升级centos版本 yum update -y #(8)看一下yum仓库有多少包 yum repolist #查看centos版本 cat /etc/redhat-release #升级内核 #导入elrepo gpg key rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org #安装elrepo YUM源 yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm #安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本 yum --enablerepo="elrepo-kernel" -y install kernel-lt.x86_64 #设置grub2默认引导为0 grub2-set-default 0 #重新生成grub2引导文件 grub2-mkconfig -o /boot/grub2/grub.cfg #更新后需要重启 reboot #查看内核 uname -r #创建/u01/kubernetes目录用于后面存放配置文件 mkdir -p /u01/kubernetes #1、设置主机名 hostnamectl set-hostname k8sm1 && bash hostnamectl set-hostname k8sn1 && bash hostnamectl set-hostname k8sn2 && bash #2、关闭selinux sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0 #修改selinux配置文件之后,重启机器,selinux配置才能永久生效,重启之后,登录到机器,执行如下命令: getenforce #3、关闭swap分区,提升性能 #临时关闭 swapoff -a #永久关闭:注释swap挂载,给swap这行开头加一下注释,如果是克隆的虚拟机,需要删除 UUID vim /etc/fstab
为什么要关闭swap交换分区?
Swap是交换分区,如果机器内存不够,会使用swap分区,但是swap分区的性能较低,k8s设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm初始化的时候会检测swap是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s的时候可以指定–ignore-preflight-errors=Swap来解决。
#4、配置主机hosts文件,相互之间通过主机名互相访问 #修改每台机器的/etc/hosts文件,文件最后增加如下内容: cat >> /etc/hosts <<EOF 192.168.86.124 k8sm1 192.168.86.125 k8sn1 192.168.86.126 k8sn2 EOF #5、配置主机之间无密码登录 #配置k8sm1到其他机器免密登录 #一路回车,不输入密码 ssh-keygen #配置免密登录到其他2个节点 ssh-copy-id k8sn1 ssh-copy-id k8sn2 #配置完成后,如下命令就可以进入node节点(exit退出) ssh k8sn1 #6、加载br_netfilter模块 #由于开启内核 ipv4 转发需要加载 br_netfilter 模块,所以加载下该模块,但是这个模块不会默认加载,所以我们开启后还要设置开机自动加载这个模块 # 设置开机自动加载这个模块 cat >> /etc/rc.d/rc.local << EOF /usr/sbin/modprobe br_netfilter EOF chmod +x /etc/rc.d/rc.local #立刻加载 modprobe br_netfilter #桥接的IPv4流量传递到iptables cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl -p /etc/sysctl.d/k8s.conf #7、关闭firewalld防火墙 systemctl stop firewalld systemctl disable firewalld #8、配置国内安装docker和containerd的阿里云的repo源 yum install yum-utils -y yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #9、配置安装k8s组件需要的阿里云的repo源 cat > /etc/yum.repos.d/kubernetes.repo <<EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 EOF #10、配置时间同步 #安装ntpdate命令 yum install ntpdate -y #跟网络时间做同步 ntpdate cn.pool.ntp.org #把时间同步做成计划任务 crontab -e * */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org #重启crond服务 service crond restart #11、开启ipvs,提高速度 #编写ipvs算法 cd /etc/sysconfig/modules/ vim ipvs.modules ================================================================ #!/bin/bash ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack" for kernel_module in ${ipvs_modules}; do /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1 if [ 0 -eq 0 ]; then /sbin/modprobe ${kernel_module} fi done ================================================================ #授予可执行权限 chmod 755 /etc/sysconfig/modules/ipvs.modules #执行 bash /etc/sysconfig/modules/ipvs.modules #查看
问题 1:ipvs 是什么?
ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的 4 层 LAN 交换,作为 Linux 内核的一部分。ipvs 运行在主机上,在真实服务器集群前充当负载均衡器。ipvs 可以将基于 TCP 和 UDP 的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。问题 2:ipvs 和 iptable 对比分析
kube-proxy 支持 iptables 和 ipvs 两种模式, 在 kubernetes v1.8 中引入了 ipvs 模式,在 v1.9 中处于 beta 阶段,在 v1.11 中已经正式可用了。iptables 模式在 v1.1 中就添加支持了,从 v1.2 版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和 iptables 都是基于 netfilter 的,但是 ipvs 采用的是 hash 表,因此当 service 数量达到一定规模时,hash 查表的速度优势就会显现 出来,从而提高 service 的服务性能。那么 ipvs 模式和 iptables 模式之间有哪些差异呢?
- pvs 为大型集群提供了更好的可扩展性和性能
- ipvs 支持比 iptables 更复杂的复制均衡算法(最小负载、最少连接、加权等等)
- ipvs 支持服务器健康检查和连接重试等功能
#12、安装 iptables
2、安装containerd
环境说明:正常情况下,非特殊说明,containerd需要在所有节点安装
#1、安装containerd yum install containerd.io-1.6.6 -y #查看containerd版本号 containerd -version #2、生成containerd的配置文件 mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml #修改配置文件: vim /etc/containerd/config.toml =========================================== #(1)containerd推荐使用Systemd驱动 #把SystemdCgroup = false修改成SystemdCgroup = true #(2)修改镜像 #把sandbox_image = "k8s.gcr.io/pause:3.6"修改成sandbox_image="registry.aliyuncs.com/google_containers/pause:3.7" =========================================== #3、配置containerd开机启动,并启动containerd systemctl enable containerd --now #查看containerd运行状态 systemctl status containerd #修改/etc/crictl.yaml文件,让运行时和拉取镜像时使用containerd cat > /etc/crictl.yaml <<EOF runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 10 debug: false EOF #重启containerd,使crictl.yaml配置生效 systemctl restart containerd #4、配置containerd镜像加速器,k8s所有节点均按照以下配置 #修改配置路径 vim /etc/containerd/config.toml ============================================ 找到config_path = "",修改成如下目录:config_path = "/etc/containerd/certs.d" ============================================ #创建配置文件 mkdir /etc/containerd/certs.d/docker.io/ -p vim /etc/containerd/certs.d/docker.io/hosts.toml ======================================================== [host."https://vh3bm52y.mirror.aliyuncs.com",host."https://registry.docker-cn.com"] capabilities = ["pull"] ======================================================== #重启containerd: systemctl restart containerd
备注:docker也要安装,docker跟containerd不冲突,安装docker是为了能基于dockerfile构建镜像
#5、安装docker yum install docker-ce -y #启动并且配置开机自启 systemctl enable docker --now #配置docker镜像加速器,k8s所有节点均按照以下配置 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://k1itnx3n.mirror.aliyuncs.com"] } EOF #让配置文件生效 sudo systemctl daemon-reload sudo systemctl restart docker #ctr拉取镜像 ctr -n=k8s.io image pull **
3、安装kubernetes
注:每个软件包的作用
- Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
- kubelet: 安装在集群所有节点上,用于启动Pod的,kubeadm安装k8s,k8s控制节点和工作节点的组件,都是基于pod运行的,只要pod启动,就需要kubelet
- kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
环境说明:正常情况下,非特殊说明,kubernetes需要在所有节点安装
#1、kubeadm、kubelet、kubectl yum install -y kubeadm-1.26.0 kubectl-1.26.0 kubelet-1.26.0 #配置cgroup驱动改为systemd sed -i 's/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"/g' /etc/sysconfig/kubelet #kubelet设置开机自启 systemctl enable kubelet
4、kubeadm初始化k8s集群
环境说明:正常情况下,非特殊说明,初始化k8s集群只需要安装在master节点
#1、设置容器运行时 crictl config runtime-endpoint unix:///run/containerd/containerd.sock #查看 crictl ps #2、使用kubeadm初始化k8s集群 #在master1生成kubeadm.yaml文件 cd /u01/kubernetes/ kubeadm config print init-defaults > kubeadm.yaml vim kubeadm.yaml ======================================================================= #修改的点 #(1)advertiseAddress:192.168.86.124 [控制节点的ip] #(2)criSocket:unix:///run/containerd/containerd.sock [容器运行时] #(3)nodeRegistration.name:k8sm1 [控制节点主机名] #(4)imageRepository:registry.cn-hangzhou.aliyuncs.com/google_containers [指定阿里云镜像仓库地址] #(5)kubernetesVersion:1.26.0 [跟kubeadm等版本保持一致] #(6)networking.podSubnet: 10.244.0.0/16 [指定pod网段, 需要新增加这个] #(7)serviceSubnet: 10.96.0.0/12 [指定Service网段] #(8)在文件最后,插入以下内容,(复制时,要带着---): --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd #kube-proxy的模式为 ipvs,由于我们使用的containerd作为运行时,并且驱动改成了systemd,所以在初始化节点的时候需要指定cgroupDriver为systemd ======================================================================= #3、基于kubeadm.yaml初始化k8s集群 kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification #4、配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理 mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config #查看 kubectl config view #配置完上面之后,就可以访问node kubectl get nodes
5、扩容k8s集群-添加工作节点
#1、在master1节点查看加入集群命令 kubeadm token create --print-join-command #2、2个node节点执行上面显示的命令 kubeadm join 192.168.86.124:6443 --token vgq333.bvbtfemn2cslcabp --discovery-token-ca-cert-hash sha256:7b3f73b3bde32400f894904ac929fac70be2f600b98a14e2dd8fccde738c9d2a #3、在master1查看node状态,此时节点已经加入 kubectl get nodes #4、在master1上给node节点打标签 kubectl label nodes k8sn1 node-role.kubernetes.io/work=work kubectl label nodes k8sn2 node-role.kubernetes.io/work=work kubectl get nodes #查看运行了那些pod kubectl get pods -n kube-system -owide
错误1:failed to parse kernel config: unable to load kernel module: “configs”, output: "modprobe: FATAL: Module configs not found.\n
解决:重启服务器,并且加入–ignore-preflight-errors=SystemVerification
错误2:/etc/kubernetes/kubelet.conf already exists
解决:rm -rf /etc/kubernetes/kubelet.conf /etc/kubernetes/pki/ca.crt
错误3:/etc/kubernetes/kubelet.conf already exists
解决:rm -rf /etc/kubernetes/kubelet.conf /etc/kubernetes/pki/ca.crt
6、安装kubernetes网络组件-Calico
环境说明:正常情况下,非特殊说明,Calico需要安装在mater1节点
#1、所有节点拉去calico所需要的镜像 ctr -n=k8s.io images pull docker.io/calico/cni:v3.18.0 ctr -n=k8s.io images pull docker.io/calico/node:v3.18.0 ctr -n=k8s.io images pull docker.io/calico/pod2daemon-flexvol:v3.18.0 ctr -n=k8s.io images pull docker.io/calico/kube-controllers:v3.18.0 #2、编写配置文件 #配置文件在如下项目中,实际是下载他的calico.yaml文件 git clone https://gitee.com/miracle2020/commonFile.git #3、在master1上安装calico cd /u01/kubernetes/ kubectl apply -f calico.yaml #查看pod kubectl get pods -n kube-system -owide #4、如果你的linux有多个网卡,需要修改calico.yaml #找到containers地下的env在其地下添加网卡 - name: IP_AUTODETECTION_METHOD value: "interface=ens33" #保存后重新执行 kubectl delete -f calico.yaml kubectl apply -f calico.yaml
7、测试在k8s创建pod是否可以正常访问网络
环境说明:正常情况下,非特殊说明,测试在mater1节点
#下载busybox镜像 ctr -n k8s.io images pull docker.io/library/busybox:1.28 #根据busybox镜像创建pod,并且进入 #进去后能ping通百度,说明calico网络插件已经被正常安装了 kubectl run busybox --image docker.io/library/busybox:1.28 --image-pull-policy=IfNotPresent --restart=Never --rm -it busybox -- sh #进去后执行nslookup kubernetes.default.svc.cluster.local,可以看到ip就是coreDNS的clusterIP,说明coreDNS配置好了。解析内部Service的名称,是通过coreDNS去解析的
8、安装dashboard
环境说明:正常情况下,非特殊说明,dashboard安装mater1节点
#上传dashboard.yaml到master1 yaml文件在gitee下,https://gitee.com/miracle2020/commonFile.git #执行如下命令 kubectl apply -f dashboard.yaml #查看pod kubectl get pods -n kubernetes-dashboard #手动暴露dashborad服务 vim kubernetes-dashboard-service.yaml ================================================= kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: ports: - port: 443 targetPort: 8443 selector: k8s-app: kubernetes-dashboard type: NodePort ================================================= #执行 kubectl apply -f kubernetes-dashboard-service.yaml #查看svc kubectl get svc -n kubernetes-dashboard #如果是k8s1.24版本以上包括1.24版本创建是不会自动创建token,需要手动创建一下,如下配置: vim dashboard-admin.yaml ================================================= kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: admin annotations: rbac.authorization.kubernetes.io/autoupdate: "true" roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount name: admin namespace: kubernetes-dashboard --- apiVersion: v1 kind: ServiceAccount metadata: name: admin namespace: kubernetes-dashboard labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile ================================================= #执行 kubectl apply -f dashboard-admin.yaml #创建token kubectl create token admin --namespace kubernetes-dashboard #根据下面命令获取到dashboard的ip,然后根据上面的token登录 kubectl get svc -n kubernetes-dashboard
9、kubeadm reset
#所有节点执行
kubeadm reset
rm -fr ~/.kube/ /etc/kubernetes/* var/lib/etcd/*
#之后重新init
10、查看pod日志
kubectl -n kube-system logs -f etcd-k8sm1
11、删除节点
kubectl delete node <节点名称>
更多推荐
所有评论(0)