CKA认证 | Day1 k8s核心概念与集群搭建

第一章 Kubernetes 核心概念

1、主流的容器集群管理系统

容器编排系统:

  • Kubernetes
  • Swarm
  • Mesos Marathon

 

2、Kubernetes介绍

Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8s。

Kubernetes用于容器化应用程序的部署,扩展和管理,目标是让部署容器化应用简单高效。

官方网站:Kubernetes

官方文档:Kubernetes 文档 | Kubernetes

注意:熟悉文档中的【概念】、【任务】

3、Kubernetes集群架构与组件

3.1 Master 组件

  • kube-apiserver

Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。

  • kube-scheduler

根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。

  • kube-controller-manager

处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。例如:Deployment、Service

  • etcd

分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息(可以部署在Master节点或者独立节点)

 

3.2 Work/node 组件

  • kubelet

kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。

  • kube-proxy

在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。

  • 第三方容器引擎

容器引擎,运行容器, 例如docker、containerd、podman

 

第二章 Kubernetes集群部署、配置和验证

1、生产环境部署K8s的2种方式

  • kubeadm

Kubeadm是一个工具,提供 kubeadm init 和 kubeadm join,用于快速部署Kubernetes集群。

部署地址:Kubeadm | Kubernetes

  • 二进制

从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

下载地址:Releases · kubernetes/kubernetes · GitHub

  • 第三方工具或者Web

 

2、服务器硬件配置推荐

3、使用kubeadm快速部署一个K8s集群

参考:CKA认证 | 使用kubeadm部署K8s集群(v1.26)-CSDN博客

  1. 安装Docker(docker-ce容器引擎、cri-docker容器运行时)
  2. 创建 Master 、node节点
  3. kubeadm init初始化集群
  4. 将一个 Node 节点加入到当前集群中 (kubeadm join < Master节点的IP和端口 >)
  5. 部署容器网络(CNI)(kubectl apply -f calico.yaml)
  6. 部署Web UI(Dashboard)

部署k8s集群避坑:

  1. cri-docker 版本 必须使用的是 0.3(最新的版本),否则将会存在兼容性问题;
  2. 使用镜像拉取比较慢的问题(可能是网络问题),使用docker pull在别的服务器进行下载,通过docker save保存下来,通过 docker load 导入所有节点;
  3. 在master上 kubeadm init 时执行失败,大部分问题为kubelet无法启动,原因可能是主机的初始化为准备好、其次cri-docker没安装最新版本
  4. 安装有问题需要清空环境配置,通过 kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock 进行还原
  5. kubeadm init 会输出关于工作节点进行join的命令,有效期24小时,通过 kubeadm token create --print-join-command 生成新的token

 

4、部署的网络组件起什么作用?

Q: 不同docker服务器的两个容器间的访问遇到问题:

① 容器1和容器2 分配的IP有可能一样,是因为docker主机有各自的网络管理机制、独立的?

  • 思路:设置不同网段

② 容器1和容器2 分配的IP即使不一样,也是网络无法ping通,是因为容器1发送的数据包不知道送往何处?

  • 思路:配置路由

③ 即使知道将数据包送往何处,那通过什么方式通过容器送达?

  • 思路:容器的数据包需要通过宿主机网络将数据包发送到对端的宿主机再传送到里面的容器

A: 部署网络组件的目的是打通Pod到Pod之间网络、Node与Pod之间网络,从而集群中数据包可以任意传输,形成了一 个扁平化网络。所以网络组件的主要作用是可以实现容器跨主机通信


目前主流的网络组件:Flannel、Calico 等 ;而所谓的 CNI( Container Network Interface,容器网络接口)就是k8s对接这些第三方网络组件的接口。

补充:

CNI 容器网络接口,对接网络组件

CRI 容器运行时接口,对接容器引擎

CSI 容器存储接口,对接存储组件

 

5、Kubernetes将弃用Docker!

在Kubernetes平台中,为了解决与容器运行时(例如Docker)集成 问题,在早期社区推出了CRI(Container Runtime Interface,容 器运行时接口),以支持更多的容器运行时。

当我们使用Docker作为容器运行时之后,架构是这样的,如图所示:

Kubernetes 计划弃用就是kubelet中dockershim。即 Kubernetes kubelet 实现中的组件之一,它能够与 Docker Engine 进行通信。

Q:为什么这么做?

  • K8s核心代码优化
  • Docker内部调用链比较复杂,多层封装和调用,导致性能降低、提升故障率、不易排查
  • Docker还会在宿主机创建网络规则、存储卷,也带来了安全隐患

Q:如何应对?

可通过 cri-dockerd 继续使用Docker,并了解其他主流容器运行时。除了docker之外,CRI还支持很多容器运行时,例如:

  • containerd:containerd与Docker相兼容,相比Docker轻量很多,目前较为成熟
  • cri-o,podman:都是红帽(RedHat)项目,目前红帽主推podman

Q:相关 containerd 切换的其它疑问?

① 独立的容器运行时,在一个集群中可以有多个运行时,一般再测试环境下才会有两个容器运行时

② 正常要求下,在切换容器运行时,建议在所有的节点都要进行切换操作,不建议混用,不利于后期的维护

③ 目前主流的镜像都是通用的

 

6、kubeconfig配置文件

kubectl 使用 kubeconfig 认证文件连接K8s集群,使用 kubectl config 指令生成 kubeconfig文件。

了解:关于config文件 只是一个“管理工具” 无论在哪个节点 都可以访问 (例如:在本地虚拟机上也可以访问公司的集群)

 

7、kubectl命令行管理工具

官方文档参考地址:命令行工具 (kubectl) | Kubernetes

# 自动补全
yum -y install bash-completion
source <(kubectl completion bash)
vi .bashrc    //将 source <(kubectl completion bash) 写入,开机自启
# 查看客户端和服务端的版本
[root@k8s-master-1-71 ~]# kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.   //提示未来会弃用需要加参数[root@k8s-master-1-71 ~]# kubectl version --output=yaml
clientVersion:      //客户端版本buildDate: "2022-12-08T19:58:30Z"compiler: gcgitCommit: b46a3f887ca979b1a5d14fd39cb1af43e7e5d12dgitTreeState: cleangitVersion: v1.26.0goVersion: go1.19.4major: "1"minor: "26"platform: linux/amd64
kustomizeVersion: v4.5.7
serverVersion:    //APIserver版本buildDate: "2022-12-08T19:51:45Z"compiler: gcgitCommit: b46a3f887ca979b1a5d14fd39cb1af43e7e5d12dgitTreeState: cleangitVersion: v1.26.0goVersion: go1.19.4major: "1"minor: "26"platform: linux/amd64
# 创建资源(功能),例如deployment、service等
例:kubectl create deployment java-demo --image=镜像来源
# --image=镜像来源
1、docker官方公共镜像仓库(hub.docker.com),默认使用,镜像地址没有带域名或者IP
2、指定镜像仓库,即镜像地址带域名或者IP
例:kubectl create deployment java-demo --image=镜像来源 --replices=1
# --replices 副本数(默认是1副本)# 暴露应用
例:kubectl expose deployment java-demo --port=端口 --target-port=端口 --type=NodePort
--port=service的端口
--target-port=镜像内服务运行的端口
--type=service的类型,例如NodePort# 查看相关镜像
例:kubectl get pods --show-lables
例:kubectl get pods -l app=ngix
--show-lables   //查看pods标签
-l 标签   //可以进行过滤# 查看服务
kubectl get service

 

8、快速部署一个网站

使用Deployment控制器部署镜像:

[root@k8s-master-1-71 ~]# kubectl create deployment java-demo --image=lizhenliang/java-demo
deployment.apps/java-demo created[root@k8s-master-1-71 ~]# kubectl get deployment
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
java-demo   1/1     1            1           5m51s[root@k8s-master-1-71 ~]# kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
java-demo-5cb596f979-47g2r   1/1     Running   0          5m46s

使用Service将Pod暴露出去:

[root@k8s-master-1-71 ~]# kubectl expose deployment java-demo --port=80 --target-port=8080 --type=NodePort
service/java-demo exposed[root@k8s-master-1-71 ~]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
java-demo    NodePort    10.105.177.89   <none>        80:32710/TCP   88s
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        3h7m
或者
[root@k8s-master-1-71 ~]# kubectl get svc   //svc为缩写

访问应用:

http://NodeIP:Port # 端口随机生成,通过kubectl get service获取

9、基本资源概念

  • Pod:K8s最小部署单元,一组容器的集合
  • Deployment:最常见的控制器,用于更高级别部署和管理Pod
  • Service:为一组Pod提供负载均衡,对外提供统一访问入口
  • Label :标签,附加到某个资源上,用于关联对象、查询和筛选
  • Namespaces :命名空间,将对象逻辑上隔离,也利于权限控制

 

9.1 标签(Label)

创建标签:kubectl label deployment/pod/其他 xxx -n 命名空间 标签名=标签值 --overwrite

[root@k8s-master-1-71 ~]# kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
java-demo-5cb596f979-47g2r   1/1     Running   0          28m# 查看资源的标签
[root@k8s-master-1-71 ~]# kubectl get pods --show-labels
NAME                         READY   STATUS    RESTARTS   AGE   LABELS
java-demo-5cb596f979-47g2r   1/1     Running   0          28m   app=java-demo,pod-template-hash=5cb596f979# 根据标签过滤显示资源   
[root@k8s-master-1-71 ~]# kubectl get pods -l app=java-demo
NAME                         READY   STATUS    RESTARTS   AGE
java-demo-5cb596f979-47g2r   1/1     Running   0          29m

 

9.2 命名空间(Namespace)

Kubernetes将资源对象逻辑上隔离,从而形成多个虚拟集群

应用场景:

  • 资源分类管理,可根据不同团队、项目划分命名空间
  • 基于命名空间权限授权

查看命名空间:kubectl get namespace

default:默认命名空间

kube-system:K8s系统方面的命名空间

kube-public:公开的命名空间,谁都可以访问

kube-node-lease:K8s内部命名空间

[root@k8s-master-1-71 ~]# kubectl get namespace
NAME                   STATUS   AGE
default                Active   55m
kube-node-lease        Active   55m
kube-public            Active   55m
kube-system            Active   55m
kubernetes-dashboard   Active   9m38s

创建命名空间:kubectl create namespace 命名空间

[root@k8s-master-1-71 ~]# kubectl create namespace test
namespace/test created
[root@k8s-master-1-71 ~]# kubectl get namespaces
NAME                   STATUS   AGE
default                Active   3h25m
kube-node-lease        Active   3h25m
kube-public            Active   3h25m
kube-system            Active   3h25m
kubernetes-dashboard   Active   160m
test                   Active   9s
或者
[root@k8s-master-1-71 ~]# kubectl get ns

两种方法指定资源所属的命名空间:

  • 命令行加 -n
  • yaml 资源元数据里指定 namespace字段
[root@k8s-master-1-71 ~]# kubectl create deployment java-demo2 --image=lizhenliang/java-demo -n test
deployment.apps/java-demo2 created
[root@k8s-master-1-71 ~]# kubectl get pods -n test
NAME                          READY   STATUS    RESTARTS   AGE
java-demo2-58bc68b877-46gq7   1/1     Running   0          30s

 


扩展实践

1、使用kubeadm搭建一个K8s集群

2、新建一个命名空间,创建一个deployment并暴露Service

  • 命名空间:aliang-cka
  • 名称:web
  • 镜像:nginx

3、列出命名空间下指定标签pod

  • 命名空间名称:kube-system
  • 标签:k8s-app=kube-dns

小结:

本篇为 【Kubernetes CKA认证 Day1 】的学习笔记,希望这篇笔记可以让您初步了解到 k8s核心概念与集群搭建,课后还有扩展实践,不妨跟着我的笔记步伐亲自实践一下吧!


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/7965.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈智能家居在智慧养老实训室中的作用

随着人口老龄化的加剧&#xff0c;智慧养老逐渐成为社会关注的热点。在此背景下&#xff0c;智能家居技术以其独特的优势受到广泛关注。智能家居不再是奢侈品&#xff0c;而是提升老年人生活品质和家庭养老效率的有效工具。它们为老年人提供了便捷、安全、舒适的生活环境&#…

后端eclipse——文字样式:UEditor富文本编辑器引入

目录 1.富文本编辑器的优点 2.文件的准备 3.文件的导入 导入到项目&#xff1a; 导入到html文件&#xff1a; ​编辑 4.富文本编辑器的使用 1.富文本编辑器的优点 我们从前端写入数据库时&#xff0c;文字的样式具有局限性&#xff0c;不能存在换行&#xff0c;更改字体…

SpringBoot框架下的资产管理自动化

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

焕然一新!TinyVue 组件库 UI 大升级,更符合现代的审美!

本文由体验技术团队Kagol原创。 自从 TinyVue 组件库去年开源以来&#xff0c;一直有小伙伴反馈我们的 UI 不够美观&#xff0c;风格陈旧&#xff0c;不太满足现阶段审美。 “TinyVue 给我的感觉就是一个没啥审美能力、但是很努力的老程序员开发的” 看到这个评价&#xff0c;…

C语言实践:实现插入排序

开篇 本篇文章的题目来源是《编程珠玑》第11章【排序】的第一个小节。不知不觉&#xff0c;已经看到第11章了呀。 主体 想到排序&#xff0c;想必大家第一时间&#xff0c;想到的都会是下面的这种方式。 for i [1, n]for (j i; j > 0 && x[j-1] > x[j]; j--)s…

idea | 搭建 SpringBoot 项目之配置 Maven

目录 1 配置 Maven1.1 打开 settings.xml 文件1.2 配置本地仓库路径1.3 配置中央仓库路径1.4 配置 JDK 版本1.5 重新下载项目依赖 2 配置 idea2.1 在启动页打开设置2.2 配置 Java Compiler2.3 配置 File Encodings2.4 配置 Maven2.5 配置 Auto Import2.6 配置 Cod…

Ubuntu学习笔记 - Day2

文章目录 学习目标&#xff1a;学习内容&#xff1a;学习笔记&#xff1a;Linux系统启动过程内核引导运行init运行级别系统初始化建立终端用户登录系统 Ubuntu关机关机流程相关命令 Linux系统目录结构查看目录目录结构 文件基本属性读写权限命令 下载文件的方法安装wget工具下载…

30-手动准备地图包

map包遵循特定的文件夹结构&#xff0c;并且必须包含描述该结构的.json文件。我们的自动地图导入过程自动创建这个.json文件&#xff0c;但您也可以选择自己准备它。包括您自己的.json文件将覆盖传递给make import命令的任何参数。 标准地图 为标准地图创建文件夹结构 1.…

「Qt Widget中文示例指南」如何创建一个窗口标志?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 窗口标志要么是类型…

【GeoJSON在线编辑平台】(1)创建地图+要素绘制+折点编辑+拖拽移动

前言 简单实现一下地图加载、要素绘制、折点编辑和拖拽移动。打算统一都写到一个类里面。 为了快速实现&#xff0c;直接去参考了官方案例。 创建地图 pnpm install ol加载地图 在这里&#xff0c;我们创建一个 mapView.js 的文件专门用来放地图和视图相关的方法&#xff0…

从0开始linux(23)——文件(4)磁盘定址方式

欢迎来到博主的专栏&#xff1a;从0开始Linux 博主ID&#xff1a;代码小豪 文章目录 CHS寻址模式LBA寻址 前面我们介绍了文件管理系统&#xff0c;我们说&#xff0c;当我们使用系统调用open时&#xff0c;操作系统会将磁盘当中的文件加载到内存当中&#xff0c;创建一个struct…

wireshark工具使用

复制数据 1.右键展开整帧数据 2.复制“所有可见项目” mark标记数据 标记&#xff1a; 跳转&#xff1a; 保存成文件&#xff1a; 文件–>导出特定分组—>Marked packets only

固定宽度--文字多少不一样--需要文字充满整个宽度

固定宽度–文字多少不一样–需要文字充满整个宽度 1.场景–登陆页面 这样显示显然不太行 那我们想要是这种情况吗–用户名和密码都充满真个宽度的div 2.代码实现—其中一个重要属性最为关键 text-align-last: justify css <style>.user{width:60px;background-colo…

艾体宝产品丨加速开发!Redis Copilot智能助手上线

我们最近发布了 Redis Copilot&#xff0c;旨在帮助开发者更加高效地使用 Redis 构建应用。提升应用性能&#xff0c;简化构建过程是我们不懈的追求。Redis Copilot 正是为此而生的人工智能助手&#xff0c;助力开发者迅速掌握 Redis 的使用技巧。现在您可以在 Redis Insight 中…

4种鼓励创业创新的方法

随着市场趋于饱和&#xff0c;许多企业&#xff0c;尤其是初创企业&#xff0c;很难在竞争中保持领先地位。技术为企业彻底改变其营销和管理策略铺平了道路。另一个经过实践检验的成功渗透特定市场的方法是在办公室内部激发创新&#xff0c;从员工到品牌皆如此。 那么究竟如何…

Spark的yarn集群环境搭建

一.为什么要搭建yarn集群 为什么要将Spark的程序运行在YARN上&#xff0c;不运行在自带的 Standalone集群上&#xff1f; 1、统一化资源管理 Standalone是Spark专用的资源管理集群&#xff0c;只能用于运行 Spark程序 YARN是功能的分布式资源管理平台&#xff0c;可以运行各种分…

【react使用AES对称加密的实现】

react使用AES对称加密的实现 前言使用CryptoJS库密钥存放加密方法解密方法结语 前言 项目中要求敏感信息怕被抓包泄密必须进行加密传输处理&#xff0c;普通的md5加密虽然能解决传输问题&#xff0c;但是项目中有权限的用户是需要查看数据进行查询的&#xff0c;所以就不能直接…

登录功能设计(php+mysql)

一 登录功能 1. 创建一个登录页面&#xff08;login.php&#xff09;&#xff0c;包含一个表单&#xff0c;用户输入用户名和密码。 2. 在表单的提交事件中&#xff0c;使用PHP代码处理用户输入的用户名和密码。 3. 首先&#xff0c;连接MySQL数据库。然后&a…

ReactPress 是什么?

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress 是什么&#xff1f; ReactPress 是使用React开发的开源发布平台&#xff0c;用户可以在支持React和MySQL数据库的服务器上架设属于自己的博客、网站。也可以把 ReactP…

ai外呼机器人的作用有哪些?

ai外呼机器人具有极高的工作效率。日拨打成千上万通不是问题&#xff0c;同时&#xff0c;机器人还可以快速筛选潜在客户&#xff0c;将更多精力集中在有价值的客户身上&#xff0c;进一步提升营销效果。183-3601-7550 ai外呼机器人的作用&#xff1a; 1、搭建系统&#xff0c…