k8s教程(基础篇)-安装与配置概述

article/2025/6/21 8:04:48

文章目录

  • 01 系统要求
  • 02 安装概述
  • 03 私有镜像库配置与升级
    • 3.1 私有镜像库配置
    • 3.2 升级
  • 04 CRI(容器运行时接口)详解
    • 4.1 CRI 概述
    • 4.2 CRI 的主要组件
    • 4.3 Pod 和容器的生命周期管理
    • 4.4 面向容器级别的设计思路
    • 4.5 尝试使用新的 Docker-CRI 来创建容器
    • 4.6 CRI 的进展

01 系统要求

Kubernetes 系统由一组可执行程序组成,用户可以通过 Kubernetes GitHub的项目网站下载编译好的二进制文件或镜像文件,或者下载源码并自行将其编译为二进制文件。

安装 Kubernetes 对软件和硬件的系统要求下图所示:
在这里插入图片描述
Kubernetes 需要容器运行时(Container Runtime Interface, CRI)的支持,目前官方支持的容器运行时包括:Docker、Containerd、CRI-Ofraktis 等。

宿主机操作系统以CentOS7为例,使用 Systemd 系统完成对 Kubernetes 服务的配置。为了便于管理,常见的做法是将 Kubernetes 服务程序配置为 Linux系统开机自启动的服务。

需要注意的是,CentOS7 默认启动了防火墙服务(firewalld. Service),而 Kubernetes Master与工作Node之间会有大量的网络通信。安全的做法是在防火墙上配置各组件需要相互通信的端口号,具体要配置的端口号下图所示:

在这里插入图片描述
其他组件可能还需要开通某些端口号,例如 CNI 网络插件 calico 需要 179 端口号;镜像库需要 5000 端口号等,需要根据系统要求逐个在防火墙服务上配置网络策略。

在安全的网络环境中,可以简单地关闭防火墙服务:
在这里插入图片描述
另外,建议在主机上禁用SELinux(修改文件/etc/sysconfig/selinux,将 SELINUX=enforcing 修改为 SELINUX=disabled),让容器可以读取主机文件系统。随着 KubernetesSELinux 支持的增强,可以逐步启用 SELinux 机制,并通过 Kubernetes 设置容器的安全机制。

02 安装概述

本文不会详细地解说K8S的安装过程,但是会简单的说明下。

K8S集群一般分为以下两种方式安装。

① 使用 kubeadm 工具快速安装 Kubernetes 集群,流程如下:

  1. 安装 kubeadm
  2. 修改 kubeadm 的默认配置
  3. 下载 Kubernetes 的相关镜像
  4. 运行 kubeadm init 命令安装 Master 节点
  5. 将新的 Node 加入集群
  6. 安装 CNI 网络插件
  7. 验证 Kubernetes集群是否工作正常

② 以二进制文件方式安装 Kubernetes安全高可用集群,流程如下:

  • Master高可用部署架构
  • 创建 CA 根证书
  • 部署安全的 etcd 高可用集群
  • 部署安全的 Kubernetes Masteri 高可用集群
  • 部署 Node 的服务
  • kube-apiserver 基于 token 的认证机制

03 私有镜像库配置与升级

3.1 私有镜像库配置

Kubernetes集群中,容器应用都是基于镜像启动的,在私有云环境中建议搭建私有镜像库对镜像进行统一管理,在公有云环境中可以直接使用云服务商提供的镜像库。

私有镜像库有两种选择:

  • Docker 提供的 Registry 镜像库 :详细说明请参考官网的说明。
  • Harbor 镜像仓库:详细说明请参考官网的说明或者 Harbor 项目维护者及贡献者编写的《Harbor 权威指南》一书。

此外,Kubernetes 对于创建 Pod 需要使用一个名为“pause”的镜像,tag名为 k8s.gcr.io/pause:3.2”,默认从镜像库k8s.gcr.io下载,在私有云环境中可以将其上传到私有镜像库,并修改 kubelet 的启动参数-pod-infra-container--image,将其设置为使用镜像库的镜像名称,例如:
在这里插入图片描述

3.2 升级

升级方式也分为两种。

① 二进制文件升级

在进行 Kubernetes 的版本升级之前,需要考虑不中断正在运行的业务容器的灰度升级方案。

常见的做法是

  • 先更新 MasterKubernetes 服务的版本,再逐个或批量更新集群中的 NodeKubernetes 服务的版本。
  • 更新 NodeKubernetes服务的步骤通常包括:先隔离一个或多个 Node 的业务流量,等待这些 Node 上运行的 Pod 将当前任务全部执行完成后,停掉业务应用(Pod),再更新这些Node上的 kubelet kube-proxy 版本,更新完成后重启业务应用(Pod),并将业务流量导入新启动的这些 Node 上,再隔离剩余的 Node,逐步完成 Node 的版本升级,最终完成整个集群的 Kubernetes 版本升级。

同时,应该考虑高版本的 Master 对低版本的 Node 的兼容性问题。高版本的 Master 通常可以管理低版本的 Node,但版本差异不应过大,以免某些功能或 API版本被弃用后,低版本的 Node无法运行。

  • 通过官网获取最新版本的二进制包kubernetes.tar.gz,解压后提取服务的二进制文件。
  • 更新Master kube-apiserverkube-controller-managerkube- scheduler 服务的二进制文件和相关配置(在需要修改时更新)并重启服务。
  • 逐个或批量隔离 Node,等待其上运行的全部容器工作完成后停掉 Pod,更新 kubeletkube-proxy。服务文件和相关配置(在需要修改时更新),然后重启这两个服务。

② 使用 kubeadm 进行集群升级

kubeadm 提供了 upgrade 命令用于对 kubeadm 安装的 Kubernetes 集群进行升级。这一功能提供了从 1.10 到 1.11、从 1.11 到 1.12、从 1.12 到 1.13 及从 1.13 到 1.14 升级的能力,此处不再详述。

升级之前需要注意:

  • 虽然 kubeadm 的升级不会触及工作负载,但还是要在升级之前做好备份;
  • 升级过程中可能会因为 Pod 的变化而造成容器重启。

04 CRI(容器运行时接口)详解

归根结底,Kubernetes Node (kubelet)的主要功能就是启动和停止容器的组件,我们称之为容器运行时(Container Runtime),其中最知名的就是 Docker 。为了更具扩展性,Kubernetes 从 1.5 版本开始就加入了容器运行时插件 API,即 Container Runtime Interface,简称 CRI

4.1 CRI 概述

每个容器运行时都有特点,因此不少用户希望 Kubernetes 能够支持更多的容器运行时。Kubernetes从 1.5 版本开始引入了 CRI 接口规范,通过插件接口模式,Kubernetes 无须重新编译就可以使用更多的容器运行时。

CRI 包含 Protocol BuffersgRPC API、运行库支持及开发中的标准规范和工具。DockerCRI 实现在 Kubernetes1.6 中被更新为 Beta 版本,并在 kubelet启动时默认启动。

可替代的容器运行时支持是 Kubernetes 中的新概念。在 Kubernetes1.3 发布时,rktnetes 项目同时发布,让 rkt 容器引擎成为除 Docker 外的又一选择。

然而,不管是 Docker 还是 rkt,都用到了 kubelet 的内部接口,同 kubelet 源码纠缠不清。这种程度的集成需要对 kubelet 的内部机制有非常深入的了解,还会给社区带来管理压力,这就给新生代容器运行时造成了难以跨越的集成壁垒。CRI 接口规范尝试用定义清晰的抽象层清除这一壁垒,让开发者能够专注于容器运行时本身。

4.2 CRI 的主要组件

kubelet 使用 gRPC 框架通过 UNIX Socket 与容器运行时(或 CRI 代理)进行通信。在这个过程中kubelet是客户端,CRI 代理(shim)是服务端,如图所示:
在这里插入图片描述
Protocol Buffers API 包含两个gRPC服务:ImageServiceRuntimeService

  • ImageService: 提供了从仓库中拉取镜像、查看和移除镜像的功能。
  • RuntimeService: 负责Pod 和容器的生命周期管理,以及与容器的交互 (exec/attach/port-forward) ,rktDocker这样的容器运行时可以使用一个 Socket同时提供两个服务,在 kubelet 中可以用container-runtime-endpointimage-service-endpoint 参数设置这个 Socket

4.3 Pod 和容器的生命周期管理

Pod 由一组应用容器组成,其中包含共有的环境和资源约束,在 CRI 里,这个环境被称为 PodSandbox

Kubernetes有意为容器运行时留下一些发挥空间,它们可以根据自己的内部实现来解释 PodSandbox

  • 对于 Hypervisor 类的运行时,PodSandbox 会具体化为一个虚拟机。
  • 其他例如 Docker,会是一个 Linux 命名空间。在 vialpha1 API 中,kubelet 会创建 Pod 级别的 cgroup 传递给容器运行时,并以此运行所有进程来满足 PodSandboxPod 的资源保障。

在启动 Pod 之前,kubelet调用 RuntimeService RunPodSandbox来创建环境。这一过程包括为 Pod 设置网络资源(分配IP等操作)。PodSandbox 被激活之后,就可以独立地创建、启动、停止和删除不同的容器了。kubelet 会在停止和删除 PodSandbox 之前首先停止和删除其中的容器。

kubelet 的职责在于通过 RPC 管理容器的生命周期,实现容器生命周期的钩子、存活和健康监测,以及执行 Pod 的重启策略等。

RuntimeService服务包括对 Sandboxi Container 操作的方法,下面的伪代码展示了主要的 RPC方法:
在这里插入图片描述
在这里插入图片描述

4.4 面向容器级别的设计思路

众所周知,Kubernetes 的最小调度单元是 Pod,它曾经可能采用的一个 CRI 设计就是复用 Pod 对象,使得容器运行时可以自行实现控制逻辑和状态转换,这样一来,就能极大地简化 API,让 CRI 能够更广泛地适用于多种容器运行时。但是经过深入讨论之后,Kubernetes放弃了这一想法。

首先,kubelet 有很多 Pod 级别的功能和机制(例如 crash-loop backoff 机制),如果交给容器运行时去实现,则会造成很重的负担;然后,Pod 标准还在快速演进。很多新功能(如初始化容器)都是由 kubelet完成管理的,无须交给容器运行时实现。

CRI 选择了在容器级别进行实现,使得容器运行时能够共享这些通用特性,以获得更快的开发速度。这并不意味着设计哲学的改变一 kubelet要负责、保证容器应用的实际状态和声明状态的一致性。

Kubernetes 为用户提供了与Pod及其中的容器进行交互的功能 (kubectl exec/attach/port-forward),kubelet目前提供了两种方式来支持这些功能:

  • ①调用容器的本地方法;
  • ②使用 Node 上的工具(例如 nsenter)及 socat)。

因为多数工具都假设 Pod Linux namespace 做了隔离,因此使用Node上的工具并不是一种容易移植的方案。在 CRI 中显式定义了这些调用方法,让容器运行时进行具体实现。下面的伪代码显示了 Exec、Attach、PortForward:这几个调用需要实现的 RuntimeService 方法:

目前还有一个潜在的问题是,kubelet处理所有的请求连接,使其有成为 Node 通信瓶颈的可能。在设计 CRI 时,要让容器运行时能够跳过中间过程。容器运行时可以启动一个单独的流式服务来处理请求(还能对 Pod 的资源使用情况进行记录),并将服务地址返回给 kubelet。这样 kubelet 就能反馈信息给 API Server,使之可以直接连接到容器运行时提供的服务,并连接到客户端。

4.5 尝试使用新的 Docker-CRI 来创建容器

要尝试新的 kubelet-CRI-Docker 集成,只需为 kubelet 启动参数加上enable- cri=true 开关来启动 CRI。这个选项从 Kubernetes1.6 开始已经作为 kubelet 的默认选项了。如果不希望使用 CRI,则可以设置enable-cri=false 来关闭这个功能。

查看 kubelet 的日志,可以看到启用CRI和创建 gRPC Server 的日志:
在这里插入图片描述
在这里插入图片描述
创建一个Deployment
在这里插入图片描述
查看 Pod 的详细信息,可以看到将会创建沙箱(Sandbox)的 Event:
在这里插入图片描述
这表明 kubelet 使用了 CRI 接口来创建容器。

4.6 CRI 的进展

目前已经有多款开源 CRI 项目可用于 Kubernetes、Docker、CRI-O、Containerd、frakti(基于 Hypervisor 的容器运行时),各 CRI 运行时的安装手册可参考官网的说明。


http://chatgpt.dhexx.cn/article/gjIAShr7.shtml

相关文章

K8S入门教程

目录 1.Kubernetes概述 1.1 Kubernetes介绍 1.2 基本架构与常用术语 2.Kubernetes集群 2.1 环境准备与规划 2.2 Master安装 2.3 Node1安装 2.4 Node2安装 2.5 健康检查与示例测试 1.Kubernetes概述 1.1 Kubernetes介绍 1.1.1 Kubernetes是什么及作用 Kubernetes(K8S)是Google在…

k8s教程(基础篇)-入门及案例

文章目录 1. 了解 Kubernetes 1.1 Kubernetes是什么 1.2 Kubernetes的基本知识 1.2.1 Service 1.2.2 Pod 2. 为什么要用 Kubernetes 3. 从一个简单的例子开始 3.1 启动 MySQL 服务 3.1.1 Deployment定义文件 3.1.2 service定义文件 3.2 启动 Tomcat应用 3.2.1 Deployment定义文…

k8s搭建(超详细,保姆级教程)

1、简介 这里就不赘述,想要了解的朋友直接去这里深入了解什么是K8S。 2、环境要求 2台以上机器,操作系统 CentOS7.7-64位系统硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多集群中所有机器之间网络互通可以…

k8s教程----零基础快速入门

k8s详解教程----零基础快速入门 前言: Kubernetes(k8s)作为云原生的核心平台,吸引了越来越多的运维、开发、测试以及其他技术员去了解学习。随着行业越来越内卷,k8s已经被广泛使用,作为一名运维人员&#…

K8S使用教程(详细)

Kubernetes详细教程 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点…

零基础学kubernetes(k8s)必看教程,带你10分钟快速实战入门k8s

一、前言 作为一个工作十余年,拥有比较丰富的计算机网络运维、主机运维、云计算平台运维、自动化运维开发经验的老鸟,我来说说我当初刚接触Kubernetes时的一些感受以及学习技巧。 刚开始学习k8s时,我觉得挺难的,一头雾水&#x…

python input函数换行_python input函数换行_python_input函数

Python raw_input() 函数 Python内置函数 python raw_input()用来获取控制台的输入。 raw_input()将所有输入作为字符串看待,返回字符串类型。注意:input()和 raw_input()这两个函 Python input和print函数 - 箬笠蓑衣 258x256 - 5KB - PNG python row函数_row函数_python row_…

Python基础之input函数和eval函数

Python基础之&#xff08;二&#xff09; 一、 input()函数-数据输入 input()函数的功能&#xff1a;显示用户输入的值 input()函数可以包含一些提示性文字 通过使用input()函数&#xff0c;可以使用户主动输入的内容变成程序中的字符串变量的值 <字符串变量> input(&l…

函数input()讲解

目录 上次我们讲解了函数print&#xff0c;今天我们来讲它的“好兄弟”input&#xff01; 讲解 1.input与变量 2.input与提示语 3.input与print 例子 上次我们讲解了函数print&#xff0c;今天我们来讲它的“好兄弟”input&#xff01; 讲解 1.input与变量 input在pyth…

Python input函数

input()函数 import timeprint(亲爱的同学&#xff1a;) time.sleep(1)print(我们愉快地通知您&#xff0c;您已获准在霍格沃茨魔法学校就读。) time.sleep(2)print(随信附上所需书籍及装备一览。) time.sleep(1)print(学期定于九月一日开始。) time.sleep(1)print(鉴于您对魔…

python中input函数最简单详细的了解

一、input&#xff08;&#xff09;函数 有了 输入 魔法&#xff0c;程序就有了对话的功能。计算机根据你的回答进行对应的处理&#xff0c;好像能听懂你的话一样。 你通过 Python 代码向计算机提供指令&#xff0c;计算机执行指令&#xff0c;然后通过 input() 函数把问题显…

input函数和int函数的使用

第一&#xff0c;input函数接受一个标准输入数据&#xff0c;返回str类型 第二&#xff0c;int函数可以把str强制转换为整形 第三&#xff0c;int(input()) ps&#xff1a;最近搞深度学习的视频&#xff0c;但是依然需要实操

python中input函数的使用

input() 函数接受一个标准输入数据&#xff0c;返回为 string 类型。 input() # 单个输入使用input ninput() print(n) print(type(n))ninput("输入&#xff1a;") print(n) print(type(n))ninput() print(n) print(type(n))input().split() split()方法通过指定分…

python编程 input输入函数

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.输入与输出 1.input输入函数 2注意点① 3注意点② 二.input输入函…

Python中的input()函数

选择题 请问在Python 3.x中&#xff0c;从键盘输入数字2之后&#xff0c;下列代码的输出结果是&#xff1f; a input("请输入年龄&#xff1a;") print(a 1) A a 1 B 2 1 C 3 D 抛出异常 问题解析 1.在Python中&#xff0c;使用内置函数input()可以接收用户的键盘…

Python基础 input函数

输入函数input&#xff08;&#xff09; 作用&#xff1a;接收来自用户的输入 返回值类型&#xff1a;输入值的类型为str 值的存储&#xff1a;使用 对输入的值进行存储 input函数的基本使用 present input (你想要什么礼物呢&#xff1f;) present --> 变量 --> …

php中input函数,input函数的用法是什么?

input函数的用法是什么? input函数的用法是: 1.input()函数 在Python3中,input()函数接受一个标准输入数据,返回为string类型。 注意:在Python3中,raw_input()和input()进行了整合,去除了raw_input(),仅保留了input()函数,其接收任意任性输入。将所有输入默认为字符串处…

【Python】input()函数用法小结

一&#xff1a;input&#xff08;&#xff09;函数的输入机制 我们编写的大部分程序&#xff0c;都需要读取输入并对其进行处理&#xff0c;而基本的输入操作是从键盘键入数据。Python从键盘键入数据&#xff0c;大多使用其内置的input&#xff08;&#xff09;函数。但是&…

python中input函数使用

1、input函数作用&#xff1a; 接收来自用户的输入 2、返回值类型 输入值的类型为str 3、值的存储 使用对输入的值进行存储 例&#xff1a; presentinput(‘大圣想要什么礼物呢?’) print (present) 运行之后会出现&#xff1a;大圣想要什么礼物呢?&#xff0c;我们给…

input()函数及其各种用法

都知道C语言利用scanf()输入&#xff0c;C利用cin输入&#xff0c;且它们都会遇到空格和换行会自动停止&#xff1b;但python里面的input()输入就比较特别点了&#xff0c;在输入的时候只以换行结束&#xff0c;也会许多注意点和规范。 Ⅰ. input()函数的基本使用&#xff1a;…