• 热门搜索 热门搜索
菜单

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

k8s http: server gave HTTP response to HTTPS client

原创
时间2024/01/09 19:38:30 发布 预览数量323
分类: 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 回复

目录

推荐阅读

  • 对比MySQL不同版本下表结构和数据存储的差异

    一、前言 在开始之前, 我们需要先了解一下 MySQL 的存储引擎有哪些。 MySQL常用的存储引擎有 InnoDB 和 MyISAM,而且两者都有各自的特点,适用于不同的场景。下面是对这两种存储引擎的简要对比: InnoDB存储引擎 支持事务处理 支持行级锁 支持外键约束 可以根据事务日志实现数据恢复 MyISAM存储引擎 MyISAM 的读取性能要高于 InnoDB(无事务) 支持全文索引

  • Linux系统定时任务 -- crontab命令

    一、前言 有时候需要在 Linux 系统中定时执行一些任务,我们就需要使用 crontab 命令创建定时任务。crontab 是“cron table”的缩写,其功能是管理定时计划任务。在Linux系统中的crond是一个定时计划任务服务,用户只要能够按照正确的格式(分、时、日、月、星期、命令)写入到配置文件中,那么就会按照预定的周期时间自动地执行下去,而crontab命令则是用于配置的工具名称

  • Js验证身份证号码是否正确

    一、前言 一般情况下,提交数据时, 会对要提交的数据进行各种验证,其他的验证我这里就不讲了,现在网上有很多, 我要讲的是对身份证的验证, 我看大部分对身份证的验证都是对身份证的位数进行验证(例如:15位或者18位), 这个其实是不太准确地,在一些系统中, 以身份证为唯一标识的话, 身份证错误会造成很大的问题, 所以我们要增加身份证的验证。接下来我们先普及一下我们国家对 身份证的产生规则 做一下了

  • Docker容器的资源大小限制(CPU、内存、磁盘)

    一、前言 Docker 容器的资源分配往往是最容易被人忽略的参数点,一般情况下不会有太大问题,但是只要出现问题就是灾难性的。 如果 Docker 容器在创建时没有明确设置 memory 参数,那么它的内存限制将取决于操作系统和 Docker 引擎的默认配置。在某些情况下,如果没有明确设置内存限制,容器可能会尝试使用尽可能多的可用内存,这可能会导致性能问题或资源争用。 这似乎看上去并没有什么太

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

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

  • 解决:“The configured user limit (128) on the number of inotify instances has been reached....” 错误

    一、场景再现 在linux系统上运行着10个微服务,突然发现某个服务挂了。遇到这种情况,一般就使用命令docker start 就可以解决。 然而发现命令无法使服务起来。根据跟踪容器日志发现是出现了异常,如下所示: shell Unhandled exception. System.IO.IOException: The configured user limit (128) on the nu

  • Docker 安装mysql

    一、创建mysql 容器 shell docker run \d \ 后台运行-restart=always \总是跟随docker启动-privileged=true\获取宿主机root权限p 13306:3306 name mysql \ 容器与主机映射端口为,主机13306,容器3306v /mysql/log:/var/log/mysql \ 容器运行后的名称v /mysql/data:

  • validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService

    一、问题 安装k8s集群, Node节点加入主节点的时候(kubeadm join...),报错,报错信息如下: shell [root@node1 ~] kubeadm join k8s-master:6443 token 4nm8cy.jgxw8go95c1uqt6c discovery-token-ca-cert-hash sha256:f1c08bce4ebeb8deb531b950

  • k8s 安装ingress,并解决拉取镜像失败的问题

    一、前言 Service 是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法,但是Service 只能在内网间访问(NodePort方式用的较少), 那么外网的路由请求如何发送到 Service 上呢? k8s 为我们提供了 Ingress 网关服务。 二、什么是Ingress ? Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ing

  • ssh 免密登录

    一、前言 SSH(Secure Shell)免密登录是一种安全便捷的远程登录方式,允许用户在不输入密码的情况下连接到远程Linux服务器。它通过密钥认证来实现登录,这种方法可以提高工作效率,同时加强系统的安全性。 二、秘钥的存放位置 一般秘钥都存放在用户的根目录下 ~/.ssh,如下图所示 ! .ssh 目录下一般会有两个文件 idrsa:私钥 、 idrsa.pub:公钥。 !

加载中