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.124k8sm1
工作节点192.168.86.125k8sn1
工作节点192.168.86.126k8sn2
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社区为您提供最前沿的新闻资讯和知识内容

更多推荐