K8s架构图

一、环境说明

背景: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 <节点名称>
Logo

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

更多推荐