Ubuntu+Kubeadm+docker+cri-docker部署Kubernetes-v1.28.2

本文详细介绍了如何在Ubuntu系统上使用Kubeadm、docker和cri-docker部署Kubernetes v1.28.2集群,包括环境准备、程序包安装、kubelet和cri-docker整合、初始化主节点和部署网络插件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、环境准备

二、安装程序包

安装docker

安装cri-dockerd

安装kubeadm、kubelet和kubectl

三、整合kubelet和cri-dockerd

配置cri-dockerd

配置kubelet

四、初始化第一个主节点

初始化master节点(在master01上完成如下操作)

初始化方式一

初始化方式二

初始化完成后的操作步骤

部署网络插件


由于之前很少使用Ubuntu系统,这次使用Ubuntu系统熟悉一下,Kubeadm+Docker+cri-docker的组合模式部署搭建最简单的一个Kubernetes集群

一、环境准备

  • OS:Ubuntu 20.04
  • Kubernetes:v1.28.2
  • Container Runtime:Docker CE 24.0.7
  • CRI:cri-docker v0.3.7

本次共使用3台虚拟机,一台做master,两台做work_node,如下准备工作在3台虚拟机上同时设置

IP地址主机名

配置说明

10.49.33.100kubeapi.likai.com可以是一个VIP
10.49.33.241k8s-master01 k8s-master.liaki.com

1、启用ssh服务

2、设置时间同步

3、禁用swap

4、禁用ufw

10.49.33.242k8s-node01 k8s-node01.likai.com
10.49.33.243k8s-node02 k8s-node02likai.com

1、开启ssh服务,允许root远程登录

2、设置时间同步

~# apt install chrony

~# systemctl start chrony.service  

修改节点的/etc/chrony/chrony.conf配置文件,并将时间服务器指向相应的主机即可,配置格式如下:

server CHRONY-SERVER-NAME-OR-IP iburst
3、主机名解析

4、禁用swap

~# swapoff -a

5、禁用ufw

~# ufw disable

~# ufw status

二、安装程序包

安装docker

首先,生成docker-ce相关程序包的仓库,这里以阿里云的镜像服务器为例进行说明:

 ~# apt -y install apt-transport-https ca-certificates curl software-properties-common
 ~# curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
 ~# add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
 ~# apt update
 ~# apt install docker-ce

kubelet需要让docker容器引擎使用systemd作为CGroup的驱动,其默认值为cgroupfs,因而,我们还需要编辑docker的配置文件/etc/docker/daemon.json,添加如下内容,其中的registry-mirrors用于指明使用的镜像加速服务。 

提示:自Kubernetes v1.22版本开始,未明确设置kubelet的cgroup driver时,则默认即会将其设置为systemd。

配置完成后即可启动docker服务,并将其设置为随系统启动而自动引导:

 ~# systemctl daemon-reload
 ~# systemctl start docker.service
 ~# systemctl enable docker.service
安装cri-dockerd

Kubernetes自v1.24移除了对docker-shim的支持,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker 。

项目地址:https://github.com/Mirantis/cri-dockerd

cri-dockerd项目提供了预制的二进制格式的程序包,用户按需下载相应的系统和对应平台的版本即可完成安装,这里使用的Ubuntu20.04,所以选用

完成安装后,相应的服务cri-dockerd.service便会自动启动。我们也可以使用如下命令进行验证,若服务处于Running状态即可进行后续步骤 。

安装kubeadm、kubelet和kubectl

首先,在各主机上生成kubelet和kubeadm等相关程序包的仓库,这里以阿里云的镜像服务为例:

~# apt update && apt install -y apt-transport-https curl
~# curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
~# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
~# apt update

接着,在各主机安装kubelet、kubeadm和kubectl等程序包,并将其设置为随系统启动而自动引导:

 ~# apt install -y kubelet kubeadm kubectl
 ~# systemctl enable kubelet

安装完成后,要确保kubeadm等程序文件的版本,这将也是后面初始化Kubernetes集群时需要明确指定的版本号。

三、整合kubelet和cri-dockerd

仅支持CRI规范的kubelet需要经由遵循该规范的cri-dockerd完成与docker-ce的整合。

配置cri-dockerd

配置cri-dockerd,确保其能够正确加载到CNI插件。编辑/usr/lib/systemd/system/cri-docker.service文件,确保其[Service]配置段中的ExecStart的值类似如下内容。

这里有两个设置,一个是--pod-infra-container-image指定使用pause的镜像,这里指定的话,kubelet默认使用pause:3.6这个版本不容易下载;第二个设置就是cni网络插件的几个选项。

需要添加的各配置参数(各参数的值要与系统部署的CNI插件的实际路径相对应):

  • --network-plugin:指定网络插件规范的类型,这里要使用CNI;

  • --cni-bin-dir:指定CNI插件二进制程序文件的搜索目录;

  • --cni-cache-dir:CNI插件使用的缓存目录;

  • --cni-conf-dir:CNI插件加载配置文件的目录;

配置完成后,重载并重启cri-docker.service服务。

~# systemctl daemon-reload && systemctl restart cri-docker.service

配置kubelet

配置kubelet,为其指定cri-dockerd在本地打开的Unix Sock文件的路径,该路径一般默认为“/run/cri-dockerd.sock“。编辑文件/etc/sysconfig/kubelet,为其添加 如下指定参数。

提示:若/etc/sysconfig目录不存在,则需要先创建该目录。

四、初始化第一个主节点

该步骤开始尝试构建Kubernetes集群的master节点,配置完成后,各worker节点直接加入到集群中的即可。需要特别说明的是,由kubeadm部署的Kubernetes集群上,集群核心组件kube-apiserver、kube-controller-manager、kube-scheduler和etcd等均会以静态Pod的形式运行,它们所依赖的镜像文件默认来自于registry.k8s.io这一Registry服务之上。但我们无法直接访问该服务,本示例将选择使用国内镜像服务器上的服务。

初始化master节点(在master01上完成如下操作)

在运行初始化命令之前先运行如下命令单独获取相关的镜像文件,而后再运行后面的kubeadm init命令,以便于观察到镜像文件的下载过程。

使用国内镜像服务器

这里编写了一个镜像下载脚本,使用docker下载国内镜像,在三台机器上都运行该脚本下载进行,脚本如下:

而后即可进行master节点初始化。kubeadm init命令支持两种初始化方式,一是通过命令行选项传递关键的部署设定,另一个是基于yaml格式的专用配置文件,后一种允许用户自定义各个部署参数,在配置上更为灵活和便捷。下面分别给出了两种实现方式的配置步骤,建议读者采用第二种方式进行

初始化方式一

在k8s-master01上运行如下命令

~# kubeadm init --control-plane-endpoint="kubeapi.likai.com" --kubernetes-version=v1.28.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --cri-socket unix:///run/cri-dockerd.sock --upload-certs --image-repository=registry.aliyuncs.com/google_containers
初始化方式二

使用#kubeadm config print init-defaults命令获取配置框架,然后修改里面的内容选项到自己设定的配置,将修改后的选项保存在配置文件kubeadm-config.yaml中,然后使用命令初始化

~# kubeadm init --config kubeadm-config.yaml --upload-certs

初始化完成后的操作步骤

对于Kubernetes系统的新用户来说,无论使用上述哪种方法,命令运行结束后,请记录最后的kubeadm join命令输出的最后提示的操作步骤。下面的内容是需要用户记录的一个命令输出示例,它提示了后续需要的操作步骤。

# 第1个步骤提示, Kubernetes集群管理员认证到Kubernetes集群时使用的kubeconfig配置文件
# 第2个步骤提示,为Kubernetes集群部署一个网络插件,具体选用的插件则取决于管理员;
# 第3个步骤提示,向集群添加额外的控制平面节点
# 第4个步骤提示,向集群添加工作节点 
# 提示:与cri-dockerd结合使用docker-ce作为container runtime时,通常需要为下面的命令
# 额外附加“--cri-socket unix:///run/cri-dockerd.sock”选项;

部署网络插件

因为flannel不支持network plocy,所以这里直接部署calico

在GitHub上搜索calico项目,找到最新的release,这里下载了release-v3.26.4.tgz这个包,这个包里包含image,yaml文件,这样就可以本地导入image,不用等待image下载了

解压之后,images里是需要的image,可以使用for IMG in `ls images`docker image load -i $IMG;done全部导入,三个节点上都导入

manifasts目录下的calico.yaml文件中,修改CALICO_IPV4POOL_CIDR选项,将value内容改成本集群的pod网段地址,修改后apply部署calico即可

之后检查集群的pod和节点状态

引自文章

​​​​​​​部署Kubernetes v1.27.1集群使用kubeadm部署Kubernetes v1.27.1,并部署OpenELB、Ingress Nginx、Metrics Server和Kuboard等Add-Ons。icon-default.png?t=N7T8https://mp.weixin.qq.com/s/Hwqb4oPN_65g-iYcfjTCIA


扫一扫关注作者公众号

<think>好的,我现在需要解决用户在Kubernetes中使用自定义镜像仓库拉取镜像时遇到的TLS证书验证失败问题,具体错误是“tls: failed to verify certificate: x509: certificate signed by unknown authority”,使用的Kubernetes版本是v1.28.2。让我先理清这个问题的可能原因和解决方法。 首先,用户提到的是自定义镜像仓库,所以问题很可能与镜像仓库的TLS证书有关。根据引用[1]和[2],证书不被信任或配置错误会导致这类问题。Kubernetes组件(如kubelet)在拉取镜像时,需要信任镜像仓库的CA证书,否则会验证失败。 接下来,我需要考虑如何让Kubernetes节点信任这个自定义仓库的证书。可能的步骤包括将CA证书添加到节点的信任存储中,或者配置Docker/containerd使用该CA。另外,如果是私有仓库,可能需要配置镜像拉取密钥,但这里的问题更可能是证书信任的问题,而不是认证问题。 对于kubeadm config images pull命令,这个命令用于预先拉取控制平面镜像,所以需要确保执行该命令的节点能够正确访问自定义仓库并信任其证书。如果节点没有正确配置信任,就会报错。 可能的解决方案步骤: 1. 将自定义镜像仓库的CA证书添加到每个Kubernetes节点的系统信任证书中,比如在Ubuntu上复制到/usr/local/share/ca-certificates/并运行update-ca-certificates。 2. 配置Docker或containerd信任该CA证书。例如,在Docker中,将CA证书放入/etc/docker/certs.d/<仓库域名>/目录下,并重启Docker服务。 3. 检查kubelet的配置,确保它使用正确的证书。有时候,kubelet可能需要单独配置证书信任链。 4. 如果使用私有仓库,可能需要创建Secret并在Pod定义中引用,但证书信任问题可能需要先解决。 5. 确保自定义仓库的证书是有效的,包括域名匹配和未过期。 另外,根据Kubernetes版本v1.28.2,可能需要检查是否有已知的证书处理变更,但暂时没有相关信息。需要用户确认证书是否正确部署到所有节点,并确保服务重启以应用更改。 用户提到的错误信息与引用[1]中的情况类似,都是证书不被信任,所以解决方案应该围绕添加CA证书到信任链展开。可能需要分步骤指导用户如何添加证书到系统、Docker/containerd,并验证配置是否正确。 最后,生成相关问题,可能涉及其他证书问题、私有仓库配置或kubeadm的其他问题。</think>### 解决方案:Kubernetes自定义镜像仓库TLS证书验证失败问题 #### 问题原因分析 此错误表明Kubernetes节点不信任自定义镜像仓库的TLS证书。主要原因包括: 1. 自定义镜像仓库的证书是自签名的,或未被系统信任的CA签发[^2]; 2. 节点未正确配置信任该证书的CA; 3. Docker/containerd未加载更新后的证书链。 --- ### 解决步骤 #### 1. 将CA证书添加到系统信任链 **操作流程:** - **步骤1**:获取镜像仓库的CA证书文件(通常为`.crt`或`.pem`格式) - **步骤2**:将证书复制到系统证书目录: ```bash # Ubuntu/Debian sudo cp custom-repo-ca.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates # CentOS/RHEL sudo cp custom-repo-ca.crt /etc/pki/ca-trust/source/anchors/ sudo update-ca-trust ``` - **步骤3**:重启容器运行时服务: ```bash # Docker sudo systemctl restart docker # containerd sudo systemctl restart containerd ``` #### 2. 配置Docker/containerd信任证书 **Docker专用配置:** - 创建证书目录并复制证书: ```bash # 格式:/etc/docker/certs.d/<仓库域名>:<端口>/ca.crt sudo mkdir -p /etc/docker/certs.d/custom.repo.com:5000 sudo cp custom-repo-ca.crt /etc/docker/certs.d/custom.repo.com:5000/ca.crt ``` - 重启Docker服务: ```bash sudo systemctl restart docker ``` **containerd配置:** - 修改`/etc/containerd/config.toml`,添加证书路径: ```toml [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."custom.repo.com:5000".tls] ca_file = "/path/to/custom-repo-ca.crt" ``` - 重启containerd: ```bash sudo systemctl restart containerd ``` #### 3. 验证证书加载 - 使用`curl`测试证书是否被信任: ```bash curl https://custom.repo.com:5000/v2/_catalog ``` 若返回镜像列表,则证书信任成功。 #### 4. 针对kubeadm的特殊配置 如果使用`kubeadm config images pull`命令: - 确保执行该命令的节点已完成上述证书配置; - 若仍失败,尝试手动指定镜像仓库地址: ```bash kubeadm config images pull --image-repository=custom.repo.com:5000/k8s ``` --- ### 补充说明 - **证书有效性检查**:使用`openssl x509 -in custom-repo-ca.crt -text -noout`确认证书有效期和域名匹配; - **集群节点同步**:所有节点(包括控制平面和工作节点)均需完成证书配置; - **Kubelet配置**:若kubelet独立配置证书,需检查`/var/lib/kubelet/config.yaml`中的`serverTLSBootstrap`参数[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值