K8S简介及部署基础环境
简要讲述K8S的概念及基础部署环境
文章目录
简介
云原生
简介
- 2004年开始,Google已在内部大规模地使用容器技术。
- 2008年,Google将 Cgroups合并进入了Linux内核。
- 2013年,Docker项目正式发布。
- 2014年,Kubernetes项目正式发布。
- 2015年,由Google、Redhat 以及微软等大型云计算厂商以及一些开源公司共同牵头成立了CNCF(Cloud Native ComputingFoundation)云原生计算基金会。
- 2017年,CNCF达到170个成员和14个基金项目;
- 2018年,CNCF成立三周年有了195个成员,19个基金会项目和11个孵化项目。
- 2022年,全球187国家、820+企业成员、130+项目、16万以上开发者。
云原生定义
云原生是一种提供了可应用于生产环境的方法论,方便企业快速运行应用程序,企业不需要将人效用于放在底层运行环境,而是主要聚焦在业务层功能开发,从而实现产品的快速交付、迭代及稳定性,从而整体降低成本支出并提高交付效率。
云原生技术栈
- 容器化:以docker、containerd为代表的容器运行技术。
- 服务网格: 比如Service Mesh等。
- 微服务:在微服务体系结构中,一个项目是由多个松耦合且可独立部署的较小组件或服务组成。
- 不可变基础设施:不可变基础设施可以理解为一个应用运行所需要的基本运行需求,不可变最基本的就是指运行服务的服务器在完成部署后,就不在进行更改,比如镜像等。
- 声明式API:描述应用程序的运行状态,并且由系统来决定如何来创建这个环境,例如声明一个pod,会有k8s执行创建并维持副本。
一些概念
- 什么是CNCF:
CNCF(云原生计算基金会、Cloud Native Computing Foundation)是由Google牵头在2015年成立的一个开源基金会,主要目的为支持开源社区开发云原生组件,目前孵化出了kubernetes、Prometheus、containerd、Harbor等众多开源项目。
- 什么是云原生?
云原生是在云计算环境中构建、部署和管理现代应用程序的方法,云原生的宗旨是基于云原生基金会的项目可以帮助企业在公有云、私有云和混合云上构建和运行可扩展的应用,主要关注的是如何构建和交付应用,而不仅仅是在哪里部署应用
- 什么是云原生应用程序?
云原生应用程序是由多个称为微服务的相互依赖的小型服务组成的业务程序,相比较于传统的单体应用,开发人员将业务程序按照功能拆分为若干个更小的微服务,这使得云原生应用程序的开发和迭代更加敏捷,因为这些微服务可以独立部署、运行和工作,并且只需极少的计算资源即可运行。
- 什么是云计算?
云计算是指托管在专有数据中心并提供给企业客户、个人等按量付费的基础设施,使用云计算后企业前期不需要购买大量的硬件服务器、网络设备、存储设备及安全设备等,后期也不需要维护基础设施,企业可以使用云提供商提供的按需付费的服务,如云主机、RDS、ES、注册中心等。
一、K8s简介
之前的docker学习,已经让我们了解到容器编排工具的强大之处,但是docker-compose,是单机的、小型的容器编排工具,不适合大规模商用。
Kubernetes的出现解决了这一问题,是一个强大的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。
Kubernetes系统组件
首先Kubernetes可以理解为一个云操作系统,系统本身并没有什么价值,需要在系统上安装相应的软件,k8s 可以做到除了开发以外几乎所有的运维的操作。
Kubernetes由Master和Worker两类节点组成。
这里的node节点就是worker。
- Master:控制节点 负责决策
- 任务分发
- 当用户发起请求运行容器的时候
- 不需要对集群内的主机进行调度
- 直接由master来下发任务给work进程
- 任务分发
- Worker:工作节点 负责执行
- 执行容器管理
Kubernetes组件
Master:
- API SERVER : 对应的软件kube-apiserver。
- 接收请求,以及集群内的所有的消息调度全都需要依靠apiserver。
- Scheduler:对应的软件 kube-scheduler。
- 选择相应的worker节点部署容器,根据worker的 具体软硬件状态。
- Controller Manager: 对应的软件 kube-contonller-manager。
- 发布 变更 故障处理 部署 更新 扩缩容 卸载 是运维工程师的日常工作。
- Controller Manager 就是 代码化了的运维工程师,但是并不能完全替代 运维工程师。
- 用户的期望状态 以及实际状态。
- Cluster State Store(集群状态存储): Etcd(简单理解为数据库)。
Worker:
- kubelet: agent (他只是 k8s的 组件,并不能直接调用 容器,需要调用容器运行时)
- 基于CRI (Container Runtime Interface)接口调用容器进行时
- docker不支持 CRI 接口,早期 k8s使用了 docker-shim 中间层对接docker
- containerd 成熟后 那么就放弃了 docker-shim
- kube proxy: 调度器
- 多副本之间的网络调度
- 生成iptables 规则,来进行调度
- service
在k8s 中运行docker需要经历以下过程:Docker Engine --> Containerd (高级容器运行时) --> containerd-shim --> runC (低级容器运行时)
containerd 只是docker engine 一个组件而已。
二、使用kubeadm安装k8s
kubeadm 是 Kubernetes 官方提供的一个工具,用于快速部署和初始化 Kubernetes 集群。简化 Kubernetes 集群的安装和配置过程和提供一种标准化的方法来创建最小可行的集群。
主要功能:
- 初始化 Kubernetes 主节点
- 加入工作节点到集群
- 管理集群证书
- 升级 Kubernetes 集群
实际操作
系统环境
master节点:192.168.232.100 master1
node1节点:192.168.232.101 slave1
node2节点:192.168.232.102 slave2
系统环境初始化
配置通过域名访问需要修改hosts文件。
更改完之后,需要之间用域名ping一下,确保之后可以正常访问。
更新ubuntu的apt源。
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
也可以自行更换成ali源,记得测试一次!
apt update
安装容器引擎
K8S 1.23版本之前包含1.23,使用docker作为容器引擎。1.24之后,containerd取代了docker。containerd取代了docker引擎,提高了效率,docker也是调用containerd的。
在Kubernetes中,容器引擎的核心作用是管理容器的完整生命周期,包括创建、运行、停止和删除容器。它负责镜像管理、网络配置、存储管理、资源分配、安全隔离,以及与Kubernetes系统的集成。容器引擎通过实现Container Runtime Interface (CRI),使Kubernetes能够统一管理不同的容器技术,从而实现高效、灵活的容器编排和大规模应用部署。
注意:每一个节点都需要安装
apt install containerd -y
apt安装containerd
配置containerd
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
containerd 的一个子命令,用于生成默认的配置。
后面是 containerd 配置文件的标准路径。
vim /etc/containerd/config.toml
修改pause镜像地址:
65sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" #阿里镜像地址
用于指定 Kubernetes 中使用的 "Pause" 容器镜像,Pause 容器就像是每个pod的"管家"。
168 [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
169 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
170 endpoint = ["https://mzopiu9t.mirror.aliyuncs.com"]
当系统需要从 Docker Hub 拉取镜像时,会自动转向使用阿里云的镜像服务。
137 SystemdCgroup = true
将 SystemdCgroup 设置为 true 意味着使用 systemd 来管理容器的 CGroups。
安装crictl工具
crictl是一个命令行工具,用于与容器运行时接口(CRI,Container Runtime Interface)兼容的容器运行时进行交互。
crictl的作用是管理容器,调试和排查问题。
mkdir /usr/local/bin/crictl
tar xvf crictl-v1.29.0-linux-amd64.tar.gz -C /usr/local/bin/crictl
vim /etc/profile
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/bin/crictl
source /etc/profile
crictl -v
配置crictl
vim /etc/crictl.yaml
runtime-endpoint: "unix:///run/containerd/containerd.sock"
这行配置指定了 crictl 应该连接到哪个容器运行时的 Unix 套接字接口。containerd.sock 是 containerd 容器运行时的默认 Unix 套接字文件。通过这个套接字,crictl 可以与 containerd 进行通信,执行诸如创建、管理和删除容器的操作。
image-endpoint: "unix:///run/containerd/containerd.sock"
类似于 runtime-endpoint,这个配置项指定了 crictl 用于与镜像服务进行通信的接口。在大多数情况下,它与 runtime-endpoint 相同,因为 containerd 既负责容器的运行,也负责镜像的管理。
timeout: 10
如果 crictl 在 10 秒内没有收到来自容器运行时的响应,它会超时并返回错误。
debug: false
这个配置项用于控制 crictl 是否输出调试信息。当设置为 true 时,crictl 会输出更多的调试信息,这对于排查问题可能很有帮助。
安装nerdctl工具
安装 nerdctl 工具的作用主要在于为使用 containerd 作为容器运行时的用户提供一个更接近 Docker 用户体验的命令行接口。
管理容器:启动、停止、删除和查看容器。
管理镜像:拉取、构建、删除和列出镜像。
管理网络和存储卷:设置和操作容器网络及存储解决方案。
执行容器操作:进入容器内部执行命令,查看日志等。
nerdctl 为 containerd 用户提供了一个功能丰富、易用的命令行工具,使容器管理变得更加便捷和高效。
tar xvf nerdctl-1.7.6-linux-amd64.tar.gz -C /usr/local/bin/
nerdctl version
mkdir /etc/nerdctl
vim /etc/nerdctl/nerdctl.toml
namespace = "k8s.io"
在 Kubernetes 环境中,"k8s.io" 通常用作默认的命名空间。
命名空间用于组织和隔离资源,特别是在 Kubernetes 集群中。
debug = false不启用调试输出。
debug_full = false不启用完整的调试信息。
insecure_registry = true这个设置允许与不安全(没有 HTTPS)的容器镜像仓库进行通信。
安装CNI工具
CNI (Container Network Interface) 工具是容器网络管理的标准接口和实现,它为容器提供网络连接、配置和管理能力。CNI 负责容器的 IP 分配、路由设置和网络命名空间配置,支持跨主机通信、网络策略实施和容器间隔离。通过插件化架构,CNI 可以灵活适应不同的网络需求,支持多种网络解决方案(如 Calico、Flannel 等),并能在云原生环境中实现动态、可扩展的网络配置。它简化了容器运行时与网络解决方案的集成,是现代容器化和 Kubernetes 生态系统中不可或缺的组件。
mkdir /opt/cni/bin/ -p
tar xvf cni-plugins-linux-amd64-v1.5.1.tgz -C /opt/cni/bin/
初始化K8S环境
1.安装基本的软件
apt install chrony ipvsadm tree ipset -y
2.关闭防火墙和关闭selinux
systemctl stop ufw
3.关闭swap ,交换分区
临时关闭和永久关闭
临时关闭swapoff -a,用free确定一下。
修改/etc/fstab。
4.配置时间服务器
设置时间服务器的作用是让整个集群有统一的时间,不影响服务。
5.加载模块
modprobe br_netfilter && lsmod |grep br_netfilter
用 modprobe 工具来加载 br_netfilter 内核模块。br_netfilter 是一个网桥网络过滤模块,通常用于在桥接网络中允许 iptables 的过滤功能。
lsmod 列出当前加载的内核模块,并通过管道将输出传递给 grep br_netfilter,从而过滤并显示 br_netfilter 模块相关的信息,确认其已经成功加载。
modprobe ip_conntrack && lsmod | grep conntrack
用 modprobe 加载 ip_conntrack 内核模块。ip_conntrack 是一个用于跟踪网络连接状态的模块,广泛用于防火墙配置和 NAT,帮助实现连接跟踪功能。
vim /etc/modules-load.d/modules.conf
在 Linux 系统中,/etc/modules-load.d/modules.conf 是一个配置文件,用于在启动时自动加载指定的内核模块。
ip_vs
ip_vs_lc
ip_vs_lblcip_vs_lblcr
ip_vs_rr
ip_vs_wrr
ip_vs_sh
ip_vs_dh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
ip_tables
ip_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
xt_set
br_netfilter
nf_conntrack
overlay
systemctl restart systemd-modules-load.service
lsmod | grep -e ip_vs -e nf_conntrack
ip_vs:IP Virtual Server,是 Linux Virtual Server (LVS) 的核心模块,提供第 4 层网络负载均衡功能。
ip_vs_lc:Least-Connection 负载均衡算法模块,为 IPVS 提供基于最少连接数的调度算法。
ip_vs_lblc 和 ip_vs_lblcr:Locality-Based Least Connections 调度算法模块,适合应用于具有本地性会话粘性的负载均衡。
ip_vs_rr:Round Robin 负载均衡算法模块,实现简单的轮询调度。
ip_vs_wrr:Weighted Round Robin 负载均衡算法模块,允许配置不同的权重来影响服务器选择。
ip_vs_sh:Source Hashing 调度算法模块,根据请求源 IP 的哈希值进行调度,确保同一客户端总是访问同一服务器,对会话保持有利。
ip_vs_dh:Destination Hashing 调度算法模块,类似于 SH,但基于请求的目标地址。
ip_vs_fo:Full Cone NAT 模式模块,使所有内部网络设备可以共享一个公共 IP 地址访问外部网络。
ip_vs_nq:Never Queue 调度算法模块,一个简单的调度器,不对请求进行排队。
ip_vs_sed:Shortest Expected Delay 调度算法模块,通过计算每台服务器的预期延迟来分配请求。
ip_vs_ftp:为支持 FTP 协议的 LVS 模块,处理特殊的 FTP 会话连接。
ip_tables:提供基于 IPv4 的包过滤框架,是 iptables 工具的核心模块。
ip_set:使 ipset 可以与 iptables 配合使用,可以高效地管理大批量 IP 地址集。
ipt_set:与 ip_set 相关联的模块,提供在 iptables 规则中使用 ipset 的能力。
ipt_rpfilter:模块用于启用反向路径过滤,用于防止 IP 欺骗。
ipt_REJECT:iptables 的扩展模块,允许立即拒绝不符合规则的数据包并返回错误。
ipip:内核模块,用于 IP 级隧道封装(IP-in-IP),使在一个 IP 网络中封装另一个 IP 数据包。
xt_set:扩展 ipt_set 模块,增强 iptables 使用 ipset 集合的功能。
br_netfilter:在网桥接口上启用网络过滤,使得数据包能够在桥接设备上被过滤。
nf_conntrack:用于网络连接跟踪,记录连接细节并支持状态性防火墙规则。
overlay:通常指用于 Docker 和 Kubernetes 中的 Overlay 网络驱动,提供跨主机的容器网络连接。
6.加载内核参数
vim /etc/sysctl.conf
net.ipv4.ip_forward=1启用 IPv4 的网络包转发功能
vm.max_map_count=262144设置进程可以拥有的最大内存映射区域数。
kernel.pid_max=4194303定义系统可用的最大进程 ID 值,允许系统运行更多的进程。
fs.file-max=1000000设置系统可以同时打开的最大文件数量。
net.ipv4.tcp_max_tw_buckets=6000设置 TCP 连接中 "TIME-WAIT" 状态的最大套接字数量。
net.netfilter.nf_conntrack_max=2097152定义 netfilter 可以跟踪的最大连接数量。
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
用于在桥接流量中启用 IPv6 和 IPv4 包过滤。启用这两个设置后,流经网桥的包也将应用于 iptables 规则。
vm.swappiness=0
控制内核倾向于使用交换空间的程度。值越低,系统越倾向于使用物理内存,可提高系统性能,因为磁盘交换通常比内存访问慢得多。设置为 0 表示尽可能避免使用交换。
sysctl -p
可选项:machin-id,克隆后才需要改变机器id。
cat /etc/machine-id
rm -f /etc/machine-id
systemd-machine-id-setup
正式安装K8S-kubeadm
apt install apt-transport-https ca-certificates curl gpg
使 APT 包管理器能够通过 HTTPS 协议下载软件包。
包含常用的证书颁发机构 (CA) 证书,这些证书用于验证 HTTPS 连接的合法性和安全性。
一种命令行工具,用于从命令行下载数据或与网络服务器之间进行数据交互。
GNU Privacy Guard 的简称,是一种加密工具,用于提供数字签名和加密功能,确保数据的安全性和完整性。APT 使用 GPG 来验证下载的包的真实性。
mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
使用 curl 从指定的 URL 下载 Release.key 文件。-f(失败不输出)、-s(静默模式)、-S(状态错误时输出)和 -L(重定向)选项确保下载的可靠性。
管道符号 | 将下载的公钥传递到 gpg --dearmor 命令中,该命令将 ASCII 格式的公钥转换为二进制格式,并将结果输出到 /etc/apt/keyrings/kubernetes-apt-keyring.gpg 文件中。
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
使用 echo 命令生成一行内容,该内容定义了一个新的 APT 软件包源。
包含 [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg],表示该源的包签名将由之前存储的 GPG 密钥进行验证。
URL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ 是阿里云提供的 Kubernetes 软件源。
使用 tee 命令将这行内容写入文件 /etc/apt/sources.list.d/kubernetes.list,从而将新的软件包源添加到 APT 的源列表中。
apt-get update && apt-cache madison kubeadm
apt-cache madison 是一个用于显示 Debian 软件包中可用于安装的各版本的工具。此命令特别用于检查 kubeadm 工具的可用版本。运行后,它会列出 kubeadm 的可用版本及其对应的软件包来源信息。
apt-get install -y kubelet=1.30.3-1.1 kubeadm=1.30.3-1.1 kubectl=1.30.3-1.1
Kubelet 是每个 Kubernetes 节点上运行的主要“节点代理”,用于管理节点上的容器。
Kubeadm 是一个工具,用于初始化和管理 Kubernetes 集群。
Kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。
至此所有基本工作结束,需要在所有节点上操作。
创建master
kubeadm init --v=5 --apiserver-advertise-address=192.168.232.100 \
--apiserver-bind-port=6443 \
--kubernetes-version=v1.30.3 \
--pod-network-cidr=10.200.0.0/16 \
--service-cidr=10.96.0.0/16 \
--service-dns-domain=cluster.local \
--image-repository=registry.aliyuncs.com/google_containers \
--ignore-preflight-errors=swap
kubeadm init
初始化一个新的 Kubernetes 控制平面
--v=5
设置详细级别为 5,这增加了诊断日志的详细程度
--apiserver-advertise-address=192.168.232.100
指定控制平面节点在网络中的可访问 IP 地址。该地址将用于其它节点连接到 API Server。
--apiserver-bind-port=6443
指定 API Server 监听的端口,默认为 6443。该端口用于接收来自客户端和节点的请求。
--kubernetes-version=v1.30.3
指定 Kubernetes 的版本安装为 v1.30.3。
--pod-network-cidr=10.200.0.0/16
为 Pod 分配的网络范围。
--service-cidr=10.96.0.0/16
为 Kubernetes 服务分配的网络范围。它用于分配集群内部的虚拟 IP 地址。
--service-dns-domain=cluster.local
指定集群内服务的 DNS 域名,默认值是 cluster.local
--image-repository=registry.aliyuncs.com/google_containers
指定从阿里云的镜像仓库(而非默认的 Google 镜像仓库)下载 Kubernetes 相关的容器镜像。这对于无法访问 Google 官方镜像仓库的地区非常有用。
--ignore-preflight-errors=swap
忽略初始化前的交换分区(swap)相关的错误。
运行完上述命令后,会出现如下结果。
按照提示完成即可。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
mkdir -p $HOME/.kube
创建一个名为 .kube 的目录在用户的home目录下。-p 参数确保如果父目录不存在也会被创建。
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
复制Kubernetes管理配置文件 (admin.conf) 到用户的 .kube 目录,并命名为 config。这个文件包含访问集群所需的认证信息。
sudo chown $(id -u):$(id -g) $HOME/.kube/config
更改 .kube/config 文件的所有权为当前用户。这确保用户有权限读写该文件。
export KUBECONFIG=/etc/kubernetes/admin.conf
设置 KUBECONFIG 环境变量,指向Kubernetes配置文件。这告诉kubectl命令行工具在哪里找到集群的配置信息。
kubeadm join 192.168.232.100:6443 --token n8wjbu.5jpzqk9vh0zf14qc \
--discovery-token-ca-cert-hash sha256:b9e93556ddb4a73d2976d5318051c896ef081aed27aac48559ba3647e49bc73c
复制此条命令到从节点上。
主上查看节点。
更多推荐
所有评论(0)