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.rhkb.cn/news/466626.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web实操1——只使用tomcat发布网站

安装tomcat 下载 肯定是去官网&#xff1a; http://tomcat.apache.org/ 下载之后&#xff0c;解压&#xff1a; &#xff01;&#xff01;解压后&#xff1a; logs日志&#xff1a;就是一些输出&#xff0c;输到文本里。 temp:一些临时文件(不用管) webapps:放网站的 work&…

数据结构:七种排序及总结

文章目录 排序一插入排序1直接插入排序2希尔排序二选择排序3直接选择排序4堆排序三 交换排序5冒泡排序6快速排序四 归并排序7归并排序源码 排序 我们数据结构常见的排序有四大种&#xff0c;四大种又分为七小种&#xff0c;如图所示 排序&#xff1a;所谓排序&#xff0c;就是…

A day a tweet(sixteen)——The better way of search of ChatGPT

Introducing ChatGPT search a/ad.及时的/及时地 ChatGPT can now search the web in a much better way than before so you get fast, timely a.有关的(relative n.亲戚,亲属;同类事物 a.比较的&#xff1b;相对的) answers with link…

HTMLCSS:呈现的3D树之美

效果演示 这段代码通过HTML和CSS创建了一个具有3D效果的树的图形&#xff0c;包括分支、树干和阴影&#xff0c;通过自定义属性和复杂的变换实现了较为逼真的立体效果。 HTML <div class"container"><div class"tree"><div class"…

系统规划与管理师——第十二章 职业素养与法侓法规

目录 职业素养 职业道德 行为规范 职业责任 对客户和公众的责任 法律法规 法律概念 法律体系 诉讼时效 民事诉讼时效 刑事追诉时效 常用的法律法规 合同法 招投标法 著作权法 政府采购法 劳动法 知识产权法 刑法修正案&#xff08;七) IT服务的广泛应用不仅…

HAL库硬件IIC驱动气压传感器BMP180

环境 1、keilMDK 5.38 2、STM32CUBEMX 初始配置 默认即可。 程序 1、头文件 #ifndef __BMP_180_H #define __BMP_180_H#include "main.h"typedef struct {float fTemp; /*温度&#xff0c;摄氏度*/float fPressure; /*压力&#xff0c;pa*/float fAltitude; /*…

沈阳乐晟睿浩科技有限公司抖音小店展望未来

在当今数字化浪潮汹涌的时代&#xff0c;电子商务以其独特的魅力和无限潜力&#xff0c;正深刻改变着人们的消费习惯与商业模式。抖音小店作为短视频与电商深度融合的产物&#xff0c;凭借其庞大的用户基础、精准的内容推送机制以及独特的购物体验&#xff0c;迅速崛起为电商领…

【论文复现】自动化细胞核分割与特征分析

本文所涉及所有资源均在这里可获取。 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 论文复现 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 自动化细胞核分割与特征分析 引言效果展示HoverNet概述HoverNet原理分析整…

ESP32 gptimer通用定时器初始化报错:assert failed: timer_ll_set_clock_prescale

背景&#xff1a;IDF版本V5.1.2 &#xff0c;配置ESP32 通用定时器&#xff0c;实现100HZ&#xff0c;占空比50% 的PWM波形。 根据乐鑫官方的IDF指导文档设置内部计数器的分辨率&#xff0c;计数器每滴答一次相当于 1 / resolution_hz 秒。 &#xff08;ESP-IDF编程指导文档&a…

Jest项目实战(4):将工具库顺利迁移到GitHub的完整指南

开源代码&#xff1a;将工具库迁移到GitHub 随着项目的成熟和完善&#xff0c;将其开源不仅可以获得更多的用户和贡献者&#xff0c;还能促进项目本身的发展。GitHub作为全球最大的开源协作平台&#xff0c;自然成为了大多数开发者的首选。本文将引导您完成将工具库迁移至GitH…

C#线程池

目录 前言 线程 线程池 线程池的工作原理 重要方法 C#线程池总结 前言 线程池是一种多线程处理形式&#xff0c;它允许开发者将任务添加到队列中&#xff0c;然后线程池会自动管理线程的创建、分配和回收&#xff0c;以执行这些任务。线程池中的线程都是后台线程&#xf…

SpringBoot项目集成ONLYOFFICE

ONLYOFFICE 文档8.2版本已发布&#xff1a;PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新 文章目录 前言ONLYOFFICE 产品简介功能与特点Spring Boot 项目中集成 OnlyOffice1. 环境准备2. 部署OnlyOffice Document Server3. 配置Spring Boot项目4. 实现文档编辑功…

用示例来看C2Rust工具的使用和功能介绍

C2Rust可以将C语言的源代码转换成Rust语言的源代码。下面是一个简单的C语言代码示例&#xff0c;以及使用c2Rust工具将其转换为Rust安全代码的过程。 C语言源代码示例 // example.c #include <stdio.h>int add(int a, int b) {return a b; }int main() {int result a…

【IC验证】systemverilog的设计特性

systemverilog的设计特性 一.概述二.面向硬件的过程语句块1.说明2.always_comb2.always_latch3.always_ff 三.关系运算符1.说明2.例子 四.inside判定符1.说明2.例子 五.条件分支语句&#xff08;1&#xff09;说明&#xff08;2&#xff09;例子&#xff08;case和unique case的…

计算不停歇,百度沧海数据湖存储加速方案 2.0 设计和实践

数据湖这个概念&#xff0c;从 2012 年产生到现在已经有十余年的时间&#xff0c;每家公司对它内涵的解读都不太一样。但是数据湖的主要存储底座有从传统的 HDFS 向对象存储演进的趋势。 传统的大数据计算场景&#xff0c;比如 MapReduce、Spark、Hive 这些大数据组件都是基于…

信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)

1 编制目的 2 系统运行维护 2.1 系统运维内容 2.2 日常运行维护方案 2.2.1 日常巡检 2.2.2 状态监控 2.2.3 系统优化 2.2.4 软件系统问题处理及升级 2.2.5 系统数据库管理维护 2.2.6 灾难恢复 2.3 应急运行维护方案 2.3.1 启动应急流程 2.3.2 成立应急小组 2.3.3 应急处理过程 …

【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0

目录 一、相关面试题 1. HTTP 与 HTTPS 有哪些区别&#xff1f; 2. HTTPS 的工作原理&#xff1f;&#xff08;https 是怎么建立连接的&#xff09; &#xff08;1&#xff09;ClientHello &#xff08;2&#xff09;SeverHello &#xff08;3&#xff09;客户端回应 &a…

使用文心快码生成口算题,妈妈再也不用担心我的学习了

2024年10月NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。百度文心快码总经理臧志分享了《AI原生研发新范式的实践与思考》&#xff0c;探讨了大模型赋能下的研发变革及如何在公司和行业中落地&#xff0c;AI原生研发新范式的内涵和推动经验。 …

C#笔记 —— 事件

事件的语法 访问修饰符 event 委托类型 事件名&#xff1b; 例&#xff1a; public event Action myEvent; 事件的使用 事件的使用跟委托基本上一模一样&#xff0c; 1.但是事件不能在类外部直接赋值&#xff0c;只能使用 或 - 添加或删除函数&#xff1b; 2.事件不能在类…

JavaScript3*3表格实现每次点击只红一行

<script> window.onload function () { var myTd document.getElementsByTagName("td"); var currentlyHighlightedRow null; // 用于存储当前高亮显示的行 for (var i 0; i < myTd.length; i) { myTd[i].onclick function () { …