【Kubernetes】K3S

目录

  • 前言
  • 一、原理
    • 单体架构
    • 高可用架构
  • 二、初始化
    • 1.配置yum源
    • 2.关掉防火墙
    • 3.关掉selinux
    • 4. 修改内核参数
    • 5.关掉swap交换分区
  • 三、安装master节点
    • 1. 安装container
    • 2.启动master服务
  • 四、安装node节点
  • 五、卸载
  • 六、总结

前言

各位小伙伴们,大家好,小涛又来了,今天澳同学又来挑刺 提问了
在这里插入图片描述

温馨提示:老规矩,我们先简单了解原理,实操部分请从第二节开始阅读

一、原理

下面我们来看看原理
官网:https://www.rancher.cn/k3s/
文档:https://docs.k3s.io/zh/

K3s 适用于以下场景:

  • 边缘计算
  • 物联网-IoT
  • CI:持续集成
  • Development:开发
  • ARM
  • 嵌入K8S

由于运行 K3s 所需的资源相对较少,所以 K3s 也适用于开发和测试场景。

单体架构

在这里插入图片描述

  • k3s server节点是运行k3s server命令的机器,而k3s Agent 节点是运行k3s agent命令的机器

  • 单点架构只有一个控制节点(在 K3s 里叫做Server node,相当于 K8s 的 master节点),而且K3s的数据存储使用 SQLite 并内置在了控制节点上

  • 在这种配置中,每个 agent 节点都注册到同一个 server 节点。K3s 用户可以通过调用server节点上的K3s API来操作Kubernetes资源。

高可用架构

在这里插入图片描述
虽然单节点 k3s 集群可以满足各种用例,但对于 Kubernetes control-plane 的正常运行至关重要需要在高可用配置中运行 K3s。

一个高可用 K3s 集群由以下几个部分组成:

  • K3s Server 节点:两个或者更多的server节点将为 Kubernetes API 提供服务并运行其他 control-plane 服务
  • 外部数据库:外部数据存储(与单节点 k3s 设置中使用的嵌入式 SQLite 数据存储相反)【不安装在内部集群中】

二、初始化

和K8S的前期工作一样,进行如下操作

1.配置yum源

#配置国内安装docker和containerd的阿里云的repo源
$ yum install yum-utils
$ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#================================================
# 配置安装k8s组件需要的阿里云的repo源
cat >  /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

#================================================
$ yum install lrzsz vim-enhanced

2.关掉防火墙

#每个节点都执行
systemctl stop firewalld ; systemctl disable firewalld

# 查看是否已关闭
systemctl status firewalld
systemctl is-enabled firewalld

在这里插入图片描述

3.关掉selinux

#每个节点都执行
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

#修改selinux配置文件之后,重启机器,selinux配置才能永久生效,
#查看是否已生效
$ getenforce
#如果显示Disabled说明selinux已经关闭

在这里插入图片描述

4. 修改内核参数

$ modprobe br_netfilter
$ cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

#加载文件
$ sysctl -p /etc/sysctl.d/k8s.conf

问题1:sysctl是做什么的?
在运行时配置内核参数
-p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载


问题2:为什么要执行modprobe br_netfilter?
修改/etc/sysctl.d/k8s.conf文件,增加如下三行参数:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

如果 sysctl -p /etc/sysctl.d/k8s.conf出现报错:
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

# 解决方法:
$ modprobe br_netfilter

问题3:为什么开启net.bridge.bridge-nf-call-iptables内核参数?
在centos下安装docker,执行docker info出现如下警告:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

解决办法:
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1


问题4:为什么要开启net.ipv4.ip_forward = 1参数?
kubeadm初始化k8s如果报错:
在这里插入图片描述就表示没有开启ip_forward,需要开启。

net.ipv4.ip_forward是数据包转发:

  • 出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
  • 要让Linux系统具有路由转发功能,需要配置一个Linux的内核参数net.ipv4.ip_forward。这个参数指定了Linux系统当前对路由转发功能的支持情况;其值为0时表示禁止进行IP转发;如果是1,则说明IP转发功能已经打开。

5.关掉swap交换分区

备注:在安装k8s里,swap交换分区必须关闭,但有一次做测试的时候,没关,发现也能安装k3s【建议大家最好给关闭】

#每个节点都执行
#临时关闭
$ swapoff -a

#永久关闭:注释swap挂载,给swap这行开头加一下注释
$ vim /etc/fstab   #给swap这行开头加一下注释#
#/dev/mapper/centos-swap swap      swap    defaults        0 0

澳同学:为什么要关闭swap交换分区?
小涛:swap是交换分区,如果机器内存不够,会使用swap分区,但是swap分区的性能较低,k8s设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm初始化的时候会检测swap是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s的时候可以指定–ignore-preflight-errors=Swap来解决。

三、安装master节点

1. 安装container

#在 master 和 node 上安装containerd
$ yum install containerd -y

#启动containerd
$ systemctl start containerd

2.启动master服务

#我们可以用如下方法:安装速度会更快
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

#在 master 上操作:【本次实验用这种方式执行】
$ curl -sfL https://get.k3s.io | sh -
#看到如下,说明k3s已经启动了:

在这里插入图片描述

#验证安装是否成功【这两种方法都一样】
$ k3s kubectl get node
$ kubectl get node

$ kubectl get pods -n kube-system

在这里插入图片描述

我们再对比一下安全前后的内存
很直观的发现,内存只用了大约 512MB 左右,真的很轻量!!
在这里插入图片描述

四、安装node节点

在安装好master节点后,我们继续安装node节点

#获取join token
#添加node节点。需要一个join token。Join token存在于master节点的文件系统上
$ cat /var/lib/rancher/k3s/server/node-token

#获取到一串token:[记住这个token]

在这里插入图片描述

#在 node 上执行如下,把work节点加入k3s:
ssh node01
curl -sfL https://get.k3s.io | K3S_URL=https://<master01_IP>:6443 K3S_TOKEN=<刚才cat 的那一串全部粘贴进来>  sh -

#如果太慢,使用下面这个方法可加速[本次实验用的这个方法]
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://<master01_IP:6443>  K3S_TOKEN=<刚才cat 的那一串全部粘贴进来> sh -

#验证work节点是否加入集群:
#在 master节点
$ systemctl status k3s-agent
$ kubectl get nodes

大功告成,接下来可以愉快的使用容器了😉
注意哦,k3s的所有操作跟k8s无区别,但是学习还是以k8s为主,之后再扩展k3s

五、卸载

下面是如何进行干净的卸载K3S,这一步可忽略

#在server节点执行:
/usr/local/bin/k3s-uninstall.sh

#在agent节点执行:
/usr/local/bin/k3s-agent-uninstall.sh

六、总结

澳同学:原来如此,那k3sk8s如何选择呢?
小涛:k8s虽然相对“重”一些,但更稳重,比较适合云计算场景;而k3s比较轻量,适宜用边缘计算场景
澳同学:不错,下回再给你出个难题
小涛:行行行,尽管提问,相互学习,俺可是有cka、cks的运维小哥了😊
澳同学:可以嘛,晚上请你🍗
小涛:谢谢大佬~

各位小伙伴们,咱们下篇文章再见了~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣每日一题 使二叉树所有路径值相等的最小代价 满二叉树 贪心

Problem: 2673. 使二叉树所有路径值相等的最小代价 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 灵神题解 复杂度 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public int minIncrements(int …

InnoDB锁介绍

本文主要介绍MySQL InnoDB引擎中的各种锁策略和锁类别&#xff0c;并针对记录锁做演示以便于理解。 以下内容适用于MySQL 8.0版本。 读写锁 处理并发读/写访问的系统通常实现一个由两种锁类型组成的锁系统。这两种锁通常被称为共享锁(shared lock)和排他锁(exclusive lock)&…

Java玩转《啊哈算法》暴力枚举之坑爹奥数

每个笨蛋都会随时准备杀了自己&#xff0c;这是最怯懦&#xff0c;也是最简单的出路。 路 缘起代码地址枚举题1题2题2 - Plus完整代码 缘起 各位小伙伴们好呀&#xff01;本人最近看了下《啊哈算法》&#xff0c;写的确实不错。 但稍显遗憾的是&#xff0c;书籍示例代码是c语…

算法修炼-动态规划之斐波那契数列模型

一、动态规划的算法原理 这是本人动态规划的第一篇文章&#xff0c;所以先阐述一下动态规划的算法原理以及做题步骤。动态规划本人的理解就是通过题目所给的条件正确地填满dp表&#xff08;一段数组&#xff09;。首先要先确定好dp表每个位置的值所代表的含义是什么&#xff0c…

二叉树的增删查改

本节复习二叉树的增删查改&#xff0c; 二叉树的知识相对于前面的循序表&#xff0c; 链表&#xff0c; 以及栈和队列都要多一些。 同时二叉树的增删查改理解起来相对来说要困难一些。 本节来好好复习一下二叉树的增删查改。 目录 准备文件 创建结构体蓝图 二叉树的前序遍历…

Windows PowerShell 命令行历史记录补全

Windows 命令行历史记录补全 使用 powershell 安装PSReadLine 2.1.0 Install-Module PSReadLine -RequiredVersion 2.1.0检查是否存在配置文件 Test-path $profile # 为 false 则执行命令创建 New-item –type file –force $profile编辑配置文件 notepad $profile# 输入如下…

数据结构------栈(Stack)和队列(Queue)

也是好久没写博客了&#xff0c;那今天就回归一下&#xff0c;写一篇数据结构的博客吧。今天要写的是栈和队列&#xff0c;也是数据结构中比较基础的知识。那么下面开始今天要写的博客了。 目录 栈&#xff08;Stack&#xff09; 队列&#xff08;Queue&#xff09; 喜欢就点…

从C到C++

二、从C到C 本章介绍一些C拓展的非面向对象功能。 引用&#xff08;掌握&#xff09; 1.1 概念 引用从一定程度上讲是一个指针的平替&#xff0c;几乎被所有面向对象编程语言所使用。引用相当于对某一个目标变量起”别名“。 操作引用与操作原变量完全一样。 #include <iost…

工厂模式 详解 设计模式

工厂模式 其主要目的是封装对象的创建过程&#xff0c;使客户端代码和具体的对象实现解耦。这样子就不用每次都new对象&#xff0c;更换对象的话&#xff0c;所有new对象的地方也要修改&#xff0c;违背了开闭原则&#xff08;对扩展开放&#xff0c;对修改关闭&#xff09;。…

Unity UI适配规则和对热门游戏适配策略的拆解

前言 本文会介绍一些关于UI适配的基础概念&#xff0c;并且统计了市面上常见的设备的分辨率的情况。同时通过拆解目前市面上较为成功的两款休闲游戏Royal Match和Monopoly GO(两款均为近期游戏付费榜前几的游戏)&#xff0c;大致推断出他们的适配策略&#xff0c;以供学习和参…

go并发模式之----阻塞/屏障模式

常见模式之一&#xff1a;阻塞/屏障模式 定义 顾名思义&#xff0c;就是阻塞等待所有goroutine&#xff0c;直到所有goroutine完成&#xff0c;聚合所有结果 使用场景 多个网络请求&#xff0c;聚合结果 大任务拆分成多个子任务&#xff0c;聚合结果 示例 package main ​…

Delegate动画案例(P30 5.6delegate动画)

一、ListElement&#xff0c;ListModel&#xff0c;ListView 1. ListElement ListElement 是 QML 中用于定义列表项的元素。它可以包含多个属性&#xff0c;每个属性对应列表项中的一个数据字段。通过在 ListModel 中使用 ListElement&#xff0c;可以定义一个列表的数据模型…

USB-C接口:办公新宠,一线连接笔记本与显示器

USB-C接口如今已成为笔记本与显示器连接的优选方案。无需担心正反插错&#xff0c;支持雷电4和DP视频信号输出&#xff0c;高速数据传输&#xff0c;还有最高100W的快充功能&#xff0c;真是方便又实用&#xff01; 一线连接&#xff0c;多功能融合 通过这个接口&#xff0c;你…

面试笔记系列三之spring基础知识点整理及常见面试题

目录 如何实现一个IOC容器? 说说你对Spring 的理解&#xff1f; 你觉得Spring的核心是什么&#xff1f; 说一下使用spring的优势&#xff1f; Spring是如何简化开发的&#xff1f; IOC 运行时序 prepareRefresh() 初始化上下文环境 obtainFreshBeanFactory() 创建并…

瑞_23种设计模式_外观模式

文章目录 1 外观模式&#xff08;Facade Pattern&#xff09;1.1 介绍1.2 概述1.3 外观模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 jdk源码解析 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《23种设计模式》的外观模式篇。本文中的部分…

如何在Windows部署TortoiseSVN客户端并实现公网连接内网VisualSVN服务端

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

Flutter开发之Slider

Flutter开发之Slider 本文是关于介绍Slider相关属性的含义。 class SliderThemeData {/// slider轨道的高度 final double? trackHeight; /// 滑块滑过的轨道颜色 final Color? activeTrackColor; /// 滑块未滑过的轨道颜色 final Color? inactiveTrackColor; /// 滑块滑过…

JavaEE——简单认识JavaScript

文章目录 一、简单认识 JavaScript 的组成二、基本的输入输出和简单语法三、变量的使用四、JS 中的动态类型图示解释常见语言的类型形式 五、JS中的数组六、JS 中的函数七、JS 中的对象 一、简单认识 JavaScript 的组成 对于 JavaScript &#xff0c;其中的组成大致分为下面的…

多线程如何设计?一对多/多对一/多对多

二、14个多线程设计模式 参考原文&#xff1a;https://www.cnblogs.com/rainbowbridge/p/17443503.html single Thread 模式 一座桥只能通过一个人 Single Thread模式是一种单线程设计模式&#xff0c;即在一个应用程序中只有一个主线程、一个事件循环&#xff0c;对外只提…

【C语言基础】:深入理解指针(一)

文章目录 一、内存和地址1. 内存2. 如何理解编址 二、指针变量和地址2.1 取地址操作符(&)2.2 指针变量和解引用操作符(*)2.2.1 指针变量2.2.2 如何拆解指针变量2.2.3 解引用操作符 2.3 指针变量的大小 三、指针变量类型的意义3.1 指针的解引用3.2 指针 - 整数3.3 void*指针…