Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)

Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)

文章目录

一.环境准备

1.服务器准备

服务器信息(此处为同一运营商的服务器,并且处于同一网络组中)如本地搭建的服务器则需要保证在同一内网中,且最好关闭防火墙。

角色 主机名称 IP Kubernetes版本
master k8s-master1 192.168.0.2 v1.28.2
node1 k8s-node1 192.168.0.3 v1.28.2
node2 k8s-node2 192.168.0.4 v1.28.2

为什么要用Containerd?

1.Docker Engine 没有实现 CRI, 而这是容器运行时在 Kubernetes 中工作所需要的。 为此,必须安装一个额外的服务 cri-dockerd。 cri-dockerd 是一个基于传统的内置 Docker 引擎支持的项目, 它在 1.24 版本从 kubelet 中移除。

2.不直接兼容 CRI:Docker 使用自己的运行时逻辑,与 Kubernetes的 CRI 不完全兼容。

3.性能和复杂性:Docker 包含许多 Kubernetes 不需要的额外功能(如镜像构建、CLI 工具),相比专注的运行时(如 CRI-O 或 Containerd)更重。

4.Containerd 是一个通用容器运行时,是 Docker 的核心组件之一,后来独立成为一个开源项目。它同样支持 Kubernetes,通过 CRI 插件(cri-Containerd)与 Kubernetes 集成.且被被广泛应用于生产环境(如 AWS EKS、Google GKE)

2.环境配置

确保每个节点上的MAC地址和product_uuid的唯一性,因为某些虚拟机的地址可能会重复。

shell 复制代码
#查看MAC地址命令
ip link
#校验product_uuid
sudo cat /sys/class/dmi/id/product_uuid

如图,eth0网卡下的,link/ether后面的就是Mac地址。

此处输出的就是product_uuid

3.设置主机名

根据机器的规划,分布设置三台主机名为k8s-master1、k8s-node1和k8s-node2。

shell 复制代码
#修改配置文件方式,
vi /etc/hostname
##文件内容为:k8s-master1或k8s-node1

#命令行方式,临时修改
# 设置 master 主机名
hostnamectl set-hostname k8s-master1 && bash
# 设置 worker 主机名
hostnamectl set-hostname k8s-node1 && bash
hostnamectl set-hostname k8s-node2 && bash
4.修改国内镜像源地址

改为华为的镜像源为例子

  • 备份镜像源文件

    shell 复制代码
    sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
  • 修改sources.list 文件,将http://archive.ubuntu.comhttp://security.ubuntu.com 替换成http://repo.huaweicloud.com

    shell 复制代码
    sudo sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
    sudo sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
5.配置时间同步

采用ntpdate命令进行时间校对,设置Crontab定时任务进行定时校对。

shell 复制代码
#设置时区
timedatectl set-timezone Asia/Shanghai
cp /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
#执行命令查看时区是否修改
timedatectl status
#安装工具
sudo apt install ntpdate
#配置Crontab定时任务
crontab -e
#添加如下内容: 0 */1 * * * ntpdate time1.aliyun.com
6.配置内核转发及网桥过滤
  • 添加配置文件
shell 复制代码
cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
  • 加载模块

    shell 复制代码
    modprobe overlay
    modprobe br_netfilter
  • 添加网桥过滤及内核转发配置文件

    shell 复制代码
    cat  <<EOF | tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
    
    #然后执行
    sysctl -p /etc/sysctl.d/k8s.conf

    如果上述配置执行之后,执行sysctl net.ipv4.ip_forward输出和下图不一致。则需手动执行sysctl -w net.ipv4.ip_forward=1

  • 安装Ipset及ipvsadm

    shell 复制代码
    sudo apt -y install ipset ipvsadm
  • 配置ipvsadm模块,添加需要添加的模块

    shell 复制代码
    cat  << EOF | tee /etc/modules-load.d/ipvs.conf
    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack
    EOF
  • 加载模块脚本

    shell 复制代码
    cat << EOF | tee ipvs.sh > /dev/null && chmod +x ipvs.sh
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack
    EOF
    
    ./ipvs.sh
  • 关闭swap分区

    swapoff -a  #临时关闭
    

    编辑/etc/fstab,注释如下类似的内容,重启系统并验证。如果已经关闭那么该命令不会有输出。

    sudo swapon --show 
    

二.容器运行时Containerd安装(所有节点)

1.apt源安装
shell 复制代码
#更新系统源
apt update
#安装必须包
apt install -y apt-transport-https ca-certificates curl software-properties-common
#添加 Docker 官方的 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#更新包的索引
sudo apt update
#查看可安装的Containerd版本
apt-cache madison containerd.io
shell 复制代码
#默认下载最新版
apt-get install containerd.io
#下载指定版本
apt-get install containerd.io=1.7.24-1
#本次安装的是1.7.24-1

为了保证环境稳定,建议锁定containerd的版本

shell 复制代码
#锁定版本
apt-mark hold containerd.io
#后续升级的解锁命令
apt-mark unhold containerd.io

配置 containerd

shell 复制代码
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
#启动和设置开机自启动
systemctl start containerd && systemctl enable containerd

验证安装

systemctl status containerd
2.二进制安装文件方法

下载地址,获取Containerd的二进制版本。如下图:

通过下面的命令进行解压

shell 复制代码
 tar -xf cri-containerd-1.7.12-linux-amd64.tar.gz  -C /

执行该命令后,这些文件和目录会被解压到根目录 / 下,并且解压后的文件会按原有的结构放置。

配置 containerd,通过以命令生成Containerd的配置文件

shell 复制代码
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
#启动和设置开机自启动
systemctl start containerd && systemctl enable containerd
3.配置Containerd镜像加速等

修改 /etc/containerd/config.toml

  • 第67行sandbox_image的内容,从原来的registry.k8s.io/pause:3.8修改成registry.aliyuncs.com/google_containers/pause:3.9
  • 第139行 SystemdCgroup的内容,从原来的false改成true
  • 第162行plugins."io.containerd.grpc.v1.cri".registry下方的config_path,修改为config_path = "/etc/containerd/certs.d"
  • 如图:

创建相应的目录并配置加速文件

shell 复制代码
#创建目录
mkdir /etc/containerd/certs.d/docker.io -pv
#配置加速文件
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://x46sxvnb.mirror.aliyuncs.com"]
  capabilities = ["pull", "resolve"]
EOF

#重启containerd
systemctl restart containerd.service

注意

shell 复制代码
# 所有节点都操作
cat <<EOF|tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
EOF

三.K8S集群部署

1.集群软件的apt源准备

此处使用使用阿里云镜像源:

shell 复制代码
#添加镜像源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
#添加密钥
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
#更新源
apt-get update
2.K8S集群软件的安装

查看可以安装的软件列表

shell 复制代码
apt-cache madison kubeadm

可以看到最新的版本是1.28.2,此处选择安装的版本是1.28.2,可自行选择。

shell 复制代码
apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00

node节点上可以不用安装kubectl

shell 复制代码
apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00

启动kueblet,并设置开机自启动。

shell 复制代码
systemctl enable --now kubelet

为求稳定,通过以下命令进行锁定定版本。

shell 复制代码
apt-mark hold kubelet kubeadm kubectl 
3.K8S集群初始化
shell 复制代码
#创建文件夹
mkdir -p /home/k8s/init/
#生成默认配置文件
kubeadm config print init-defaults > /home/k8s/init/kubeadm-init.yaml

修改文件的一些参数:

yaml 复制代码
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.0.2 #master IP地址
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: k8s-master1 #master节点主机名称
  taints: null
---
apiServer:
  certSANs:
    - 192.168.0.2
    - 101.126.148.74
  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.28.2 #修版本信息
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.244.0.0/12 #修改Service网段信息
  podSubnet: 10.96.0.0/16 #添加Pod网段信息
scheduler: {}

通过以下命令列举出需要拉取的镜像:

shell 复制代码
kubeadm config images list --config  /home/k8s/init/kubeadm-init.yaml

通过下面命令进行拉取:

kubeadm config images pull --config  /home/k8s/init/kubeadm-init.yaml

然后通过以下命令进行初始化:

shell 复制代码
kubeadm init --config=/home/k8s/init/kubeadm-init.yaml  --v=6

出现如下信息则证明初始化成功:

Then you can join any number of worker nodes byrunning the following on each as root:

kubeadm join 192.168.0.2:6443 --token abcdef.69123456789abcdef

然后按照上述的提示,进行如下的操作:

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

执行完上述的命令,就可以通过kubectl进行查看k8s集群的状态信息。如下图:

此处需注意,因为一开始没有安装Calico等网络插件,节点状态应该是STATUS: NotReady

新节点加入到集群中,在节点上通过如下命令,获取加入集群的token值:

shell 复制代码
kubeadm token create --print-join-command

直接在node节点执行:

shell 复制代码
kubeadm join 192.168.0.2:6443 --token xqlsab.83s9nr4w0dfmls59 --discovery-token-ca-cert-hash sha256:dc1719de42513ce9f02ad8602932eff9fc0137261553a9d6209873df73b5352b

暂时未写如何添加另一个Master节点,此处涉及高可用配置。

执行后如图:

然后可以通过如下命令来排查节点插件的安装进程:

shell 复制代码
kubectl get pod -n kube-system -o wide | grep k8s-node1

如果一直未启动成功可以用如下命令来排查:

shell 复制代码
kubectl describe pod -n kube-system <PodID>
#或者
kubectl logs -f -n kube-system <PodID>

在节点上还可以通过crictl ps -a命令来排查是否有pod启动。同理,在初始化的时候也可以这样排查。

crictlContainerd的命令行工具。

4.K8S集群网络插件Calico部署

​ 此处选用科学部署方式,拉取的镜像到自己的阿里云仓库。镜像地址如下:

yaml 复制代码
registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-cni:v3.27.5
registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-node:v3.27.5
registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-kube-controllers:v3.27.5

分别替换name: upgrade-ipamname: install-cniname: "mount-bpffs"name: calico-nodename: calico-kube-controllers这几处的镜像地址,然后执行以下命令安装:

shell 复制代码
kubectl create -f calico.yml

calico文件地址如下calico/manifests/calico.yaml at release-v3.27 · projectcalico/calico

执行完上述的命令后,即可完成calico的部署。如下:

可以看到每个节点都有Calico的插件,然后稍等一会,node节点就会变成Ready:

四.部署应用测试集群是否安装成功

以部署一个Nginx应用为例,以下是一个简单的Nginx部署的yaml文件:

yaml 复制代码
apiVersion: apps/v1     #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment        #该配置的类型,我们使用的是 Deployment
metadata:               #译名为元数据,即 Deployment 的一些基本属性和信息
  name: nginx-deployment        #Deployment 的名称
  labels:           #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
    app: nginx  #为该Deployment设置key为app,value为nginx的标签
spec:           #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
  replicas: 1   #使用该Deployment创建一个应用程序实例
  selector:         #标签选择器,与上面的标签共同作用,目前不需要理解
    matchLabels: #选择包含标签app:nginx的资源
      app: nginx
  template:         #这是选择或创建的Pod的模板
    metadata:   #Pod的元数据
      labels:   #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec:           #期望Pod实现的功能(即在pod中部署)
      containers:       #生成container,与docker中的container是同一种
      - name: nginx     #container的名称
        image: registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/nginx:1.26.0  #使用镜像nginx:1.26.0创建container,该container默认80端口可访问
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service #Service 的名称
  labels:       #Service 自己的标签
    app: nginx  #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec:     #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
  selector:     #标签选择器
    app: nginx  #选择包含标签 app:nginx 的 Pod
  ports:
  - name: nginx-port  #端口的名字
    protocol: TCP     #协议类型 TCP/UDP
    port: 80          #集群内的其他容器组可通过 80 端口访问 Service
    nodePort: 32600   #通过任意节点的 32600 端口访问 Service
    targetPort: 80  #将请求转发到匹配 Pod 的 80 端口
  type: NodePort  #Serive的类型,ClusterIP/NodePort/LoaderBalancer

上述的资源清单创建了两种类型一个Deployment,一个Service,然后执行命令部署:

shell 复制代码
kubectl apply -f nginx.yaml

执行成功后,如下图:

然后通过node节点IP+32600的方式进行访问:

此处是云服务器所以用的外网IP

相关推荐
小扳2 小时前
微服务篇-深入了解 MinIO 文件服务器(你还在使用阿里云 0SS 对象存储图片服务?教你使用 MinIO 文件服务器:实现从部署到具体使用)
java·服务器·分布式·微服务·云原生·架构
aherhuo13 小时前
kubevirt网络
linux·云原生·容器·kubernetes
陌北v113 小时前
Docker Compose 配置指南
运维·docker·容器·docker-compose
catoop13 小时前
K8s 无头服务(Headless Service)
云原生·容器·kubernetes
阿里嘎多学长14 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
小峰编程14 小时前
独一无二,万字详谈——Linux之文件管理
linux·运维·服务器·云原生·云计算·ai原生
小马爱打代码14 小时前
云原生服务网格Istio实战
云原生
liuxuzxx14 小时前
1.24.1-Istio安装
kubernetes·istio·service mesh
G_whang15 小时前
windos 安装docker
运维·docker·容器
道一云黑板报15 小时前
Flink集群批作业实践:七析BI批作业执行
大数据·分布式·数据分析·flink·kubernetes