• 热门搜索 热门搜索
菜单

您现在的位置是:博客 > 文章详情文章详情

k8s http: server gave HTTP response to HTTPS client

原创
时间2024/01/09 19:38:30 发布 预览数量1073
分类: k8s 标签: k8s

一、问题

k8s 在拉取私有仓库镜像的时候报http: server gave HTTP response to HTTPS client错,网络上的答案都是千篇一律的,根本就没有抓住问题的根源。下面就有我来剖析一下问题的原因。

Type     Reason          Age                    From               Message
  ----     ------          ----                   ----               -------
  Normal   Scheduled       6m5s                   default-scheduler  Successfully assigned sims/resources-deploy-5fb85bf986-6s7bj to node2
  Normal   BackOff         5m39s (x3 over 6m4s)   kubelet            Back-off pulling image "10.1.20.175:8082/cwcssims_pro_resource:latest"
  Warning  Failed          5m39s (x3 over 6m4s)   kubelet            Error: ImagePullBackOff
  Normal   Pulling         5m27s (x3 over 6m5s)   kubelet            Pulling image "10.1.20.175:8082/cwcssims_pro_resource:latest"
  Warning  Failed          5m27s (x3 over 6m5s)   kubelet            Failed to pull image "10.1.20.175:8082/cwcssims_pro_resource:latest": failed to pull and unpack image "10.1.20.175:8082/cwcssims_pro_resource:latest": failed to resolve reference "10.1.20.175:8082/cwcssims_pro_resource:latest": failed to do request: Head "https://10.1.20.175:8082/v2/cwcssims_pro_resource/manifests/latest": http: server gave HTTP response to HTTPS client
  Warning  Failed          5m27s (x3 over 6m5s)   kubelet            Error: ErrImagePull

二、原因

从报错来看,拉取镜像失败的原因是因为 server gave HTTP response to HTTPS client,翻译过来就是 服务器向HTTPS客户端提供了HTTP响应,简单的讲就是通讯协议不一致。我们需要设置通过http的方式去拉取镜像(我的私有仓库不支持https)

三、解决

网络上大部分的教程都是通过修改/etc/docker/daemon.json 配置文件中的 insecure-registries选项来解决。这种方式不能说错误, 只能说太片面了。

因为 k8s 的容器运行时支持 containerdCRI-ODocker EngineMirantis Container Runtime等方式,不同的运行时配置文件存放的地址也是不一样的。如果连运行时都没区分清楚,如何从根源上解决问题。有些小伙伴就比较纳闷:“那我按照网络上的方式修改成功了呢”。那我只能告诉你,你运气好罢了。

k8s 1.24版本以前,默认使用的是 Dockershim 运行时,但是在官方版本 k8s 1.24以后, Dockershim 已从 Kubernetes 项目中移除。这也就意味着,不同的版本,解决方法是不一样的。

运行时相关的官方文档请看:《kubernetes 容器运行时

1、判断k8s使用的容器运行时

判断k8s的容器运行时,可以根据下属命令来查询:

# 查询运行时
kubectl get nodes -o jsonpath='{.items[*].status.nodeInfo.containerRuntimeVersion}'

如果开头是 containerd 就是 containerd 运行时,如果是 docker,那么就是用的是 Docker Engine 运行时,然后根据各自的运行时去执行下述的代码。如图所示:

k8s http: server gave HTTP response to HTTPS client

2、containerd 容器运行时

1、编辑配置文件/etc/containerd/config.toml

vim /etc/containerd/config.toml

2、在 plugins."io.containerd.grpc.v1.cri".registry.configs 节点和 plugins."io.containerd.grpc.v1.cri".registry.mirrors 节点下增加相应配置,如下所示:

    [plugins."io.containerd.grpc.v1.cri".image_decryption]
      key_model = "node"

    [plugins."io.containerd.grpc.v1.cri".registry]
      config_path = ""

      [plugins."io.containerd.grpc.v1.cri".registry.auths]

      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."10.1.20.175:8082".tls]
          insecure_skip_verify = true  # 是否跳过安全认证

      [plugins."io.containerd.grpc.v1.cri".registry.headers]

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."10.1.20.175:8082"]
          endpoint = ["http://10.1.20.175:8082"]

    [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
      tls_cert_file = ""
      tls_key_file = ""

3、配置生效并重启Containerd

systemctl daemon-reload && systemctl restart containerd.service

更多相关配置语法请看:《Configure Image Registry

3、Docker Engine 容器运行时

# 1、编辑 /etc/docker/daemon.json文件
vim /etc/docker/daemon.json

# 2、增加 insecure-registries 选项,如下所示:
{
  "exec-opts":["native.cgroupdriver=systemd"],
  "registry-mirrors":["https://akchsmlh.mirror.aliyuncs.com"],
  "insecure-registries": ["私有仓库ip:端口"]
}

# 3、重启容器
sudo systemctl daemon-reload  
sudo systemctl restart docker

版权声明:本文为Converts的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://www.converts.cn/article/6364229.html

全部评论(2 条)

程序员小张

万分感谢博主, 解决了困扰我一个周末的问题,这个问题搞死我了。才发现不同版本的k8s, 修改的配置文件地址不同。?

Converts 回复 程序员小张

我也是因为这个问题被困扰了很久

2024-01-10 17:15:42 1 回复

目录

推荐阅读

  • .net 项目发布中的 Debug和Release的区别是什么?

    ![.net 项目发布中的 Debug和Release的区别是什么?](/ArticleFile/2023-09-09/93b4042444ff40aba6e7c913250e425f.png '.net 项目发布中的 Debug和Release的区别是什么?') 一、Debug 版本 Debug 是“调试”的意思,

  • Vs2022 设置类、接口默认创建的模板

    一、前言 在团队协作中,每个人都负责这自己模块的代码。为了清楚的分辨代码是谁开发的, 我们往往会在类、接口增加一个额外的注释信息,例如:创建人、创建时间、描述等等。所以有些时候,我们希望 visual Studio 在创建类,接口的时候,生成的代码文件能更丰富一下, 例如:自动增加基础的注释功能, 类文件自动增加 p

  • 如何使用 vs 2022 远程调试 Linux系统中的Docker容器项目

    一、前言 在项目上,总会遇到一些奇怪的问题,例如:“在本地好好的, 为什么部署到线上就不行” 等等,这样的问题时长困扰着我们。但是作为一个资深的码农,“远程调试” 是一个不可或缺的手段。下面就来看下如果使用 vs 在本地远程调试部署在Linux系统中,运行在Docker容器中的项目吧。 二、远程调试 调试的前提,

  • 移除Linux系统启动时的等待时间

    一、前言 VMware 虚拟机中安装了很多Linux 系统,每次启动的时候, 都卡在系统选择的界面上,除非手动选择, 否则要等很久才会进入系统,如下图所示: ![移除Linux系统启动时的等待时间](/ArticleFile/2024-06-24/e3ab02212cc946bd9c23159895177fb3.png '移除Linux系统启动时的等待时间') 二、关闭系统等待的事件 我们

  • GitLab 私有化部署

    一、GitLab 概述 git作为目前最流行的代码管理工具,已经成为了程序员必备的技能。虽然目前有 github(对国人不太友好) 、gitee 两个比较大的代码托管平台。但是出于各种原因,搭建自己的私有代码平台也成了一部分开发人员的选择。针对这种需求,这里为大家介绍的是其中的佼佼者gitlab,也是我们公司内部正在使用的一个代码管理平台。 GitLab是一个基于Git的开源代码管理平台,它

  • 云服务器购买按量付费实例,并搭建私有网络图解

    一、前言 最近在自学 k8s 集群化部署, 奈何云服务器包年包月太贵了, 学习成本飙升。好在各大云服务商支持按量计费 , 接下来就带大家一起过一下购买流程,并且使用私有网络。 二、私有网络 在购买云服务器之前,先了解下什么是私有网络。官网给出的解释是:私有网络(Virtual Private Cloud,VPC)是一块在云服务器上自定义的逻辑隔离网络空间,可以使云服务器, 云数据库资源构建逻

  • Docker 部署FastTunnel,实现内网穿透

    一、前言 最近在学习搭建Elasticsearch集群,但是发现云服务(2核4G)资源根本就不够用,部署上去就直接宕机了。想着服务器资源太贵, 家里刚好有一台64G内存的闲置电脑。不如做一个内网穿透,可以远程访问。工作学习两不误。其实目前市面上已经有很多穿透工具了,比如向日葵~~ ,但是奈何带宽太小了,免费的才1M~~~ 二、什么是 FastTunnel FastTunnel 是用.net

  • IP地址和子网掩码的关系

    一、概述 IP地址(Internet Protocol Address)和子网掩码(Subnet Mask)是计算机网络中两个核心的概念,它们共同工作以确保数据能够正确地在复杂的网络环境中传输到目标设备。 二、IP地址 `IP地址`是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。它是一个32位的二进制数,但是在习惯上,我们

  • 修改Docker默认的存储驱动程序目录

    一、前言 今天使用jenkins对程序进行更新的时候,发现更新失败。经排查是因为系统磁盘满了,然而通过堡垒机看了下,系统空间还有很多,于是看了下系统分区: ![修改Docker默认的存储驱动程序目录](/ArticleFile/2024-06-06/444ede8a1b1b42058db18690fa995952.png '修改Docker默认的存储驱动程序目录') ![修改Docker默认

  • Windows 安装git的详细安装步骤 ,以及TortoiseGit 图形化工具

    一、前言 `Git` 是一个开源的分布式版本控制系统,用于有效、高速地处理从很小到非常大的项目版本管理。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不需要服务器端软件支持。 二、安装Git 1、Git 下载地址 [Git 下载地址](https://git-scm.com/downloads "Git 下载地址") ![Windows

加载中