当前位置: 首页 > news >正文

Kubernetes架构原理与集群环境部署

Kubernetes架构原理与集群环境部署

Kubernetes 带来的挑战
Kubernetes 从诞生至今,一路突飞猛进,在容器编排的领域过关斩将,最终拿下了容器编排的冠军宝座,成为最无可替代、不可撼动的佼佼者,但是针对 Kubernetes 的学习和使用始终是一个很大的难题。

​ 首先,Kubernetes 本身的学习就很困难,因为 Kubernetes 概念太多,涉及的知识面也非常广泛,可能学习了一个月也无法入门,甚至连集群也搭建不出来,使人望而却步。并且 Kubernetes 的技术能力要求也比较高,因为运维不仅仅均限于传统运维,有时候可能要修改业务代码、制定业务上线体系、给研发人员在开发应用中提供更好的建议等。需要掌握的知识也有很多,可能需要掌握公司内所有使用带的代码,比如代码如何进行编译、如何正确发布、如何修改代码配置文件等,这对于运维人员也是一种挑战。

master 节点的组件
master 节点是 Kubernetes 集群的控制节点,在生产环境中不建议部署集群核心组件外的任何容器(在 kubeadm 安装方式下,系统组件以容器方式运行在 master 节点的宿主机上;二进制安装方式下,系统组件以守护进程的方式运行,master 节点可以不运行任何容器),公司业务程序的容器是不建议部署在 master 节点上,以免升级或者维护时对业务在成影响。

API server

​ API server 提供了集群网关,是整个集群的控制中枢,提供集群中各个模块之间的数据交换,并将集群信息存储到 ETCD 集群中。同时,它也是集群管理、资源配额、提供完备的集群安全机制的入口,为集群各类资源对象提供增删改查。API server 在客户端对集群进行访问,客户端需要通过认证,并使用 API server 作为访问节点和 pod(以及服务)的堡垒和代理 / 通道。

API 服务器公开 Kubernetes API。
REST/Kubectl 的入口点 —— 它是 Kubernetes 控制平面的前端。
它跟踪所有集群组件的状态并管理它们之间的交互。
它旨在水平扩展。
它使用 YAML/JSON manifest 文件。
它验证和处理通过 API 发出的请求。

Scheduler

​ Scheduler 主要功能是资源调度,将 pod 调度到对应的主机上。依据请求资源的可用性、服务请求的质量等约束条件,K8S 也支持用户自己提供的调度器。

它将 pod 调度到工作节点。
它监视 api-server 以查找没有分配节点的新创建的 Pod,并选择一个健康的节点让它们运行。
如果没有合适的节点,则 Pod 将处于挂起状态,直到出现这样一个健康的节点。
它监视 API Server 的新工作任务。

Controller Manager

​ Controller Manager 负责维护集群的状态,比如故障检测、内存垃圾回收、滚动更新等,也执行 API 业务逻辑,K8S 默认提供 replication controller、replicaset controller、daemonset controller 等控制器。

它监视它管理的对象的期望状态并通过 API 服务器监视它们的当前状态。
采取纠正措施以确保当前状态与所需状态相同。
它是控制器的控制器。
它运行控制器进程。从逻辑上讲,每个控制器都是一个单独的进程,但为了降低复杂性,它们都被编译成一个二进制文件并在单个进程中运行。

etcd

​ etcd 用于可靠的存储集群的配置数据,是一种持久性、轻量级、分布式的键值数据存储组件。可以理解为一种分布式的非关系型数据库。etcd 是集群的状态,K8s 默认使用分布式的 etcd 集群整体存储用来实现发现服务和共享配置集群的所有状态都存储在 etcd 实例中,并具有监控的能力,因此当 etcd 中的信息发生变化时,能够快速地通知集群中相关的组件。

它是一个一致的、分布式的、高度可用的键值存储。
它是有状态的持久存储,用于存储所有 Kubernetes 集群数据(集群状态和配置)。
它是集群的真相来源。
它可以是控制平面的一部分,也可以在外部进行配置。
etcd 集群最少 3 个节点,容错点才会有 1 个。3 个节点和 4 个节点的容错能力是一样的,所以有时候保持奇数节点更好,从这里可以判断出我们在部署 k8s 的时候,至少有 3 个节点,才保证 etcd 有 1 个节点容错性。
另外,etcd 的 Leader 选举和数据写入都需要半数以上的成员投票通过确认,因此,集群最好由奇数个成员组成,以确保集群内部一定能够产生多数投票通过的场景。所以 etcd 集群至少需要 3 个以上的奇数个成员。
如果使用偶数个节点,可能出现以下问题:

偶数个节点集群不可用风险更高,表现在选主(Leader 选举)过程中,有较大概率的等额选票,从而触发下一轮选举。
偶数个节点集群在某些网络分割的场景下无法正常工作。当网络分割发生后,将集群节点对半分割开,形成脑裂。


四、部署docker运行时
1、基础环境
bash
1 systemctl stop firewalld
2 systemctl disable firewalld
3 setenforce 0
4 sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config

2、下载 Docker 的 repo 文件

curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repocd /etc/yum.repos.d/sed -i 's/$releasever/8/g' docker-ce.repo
sed -i 's/$basearch/x86_64/g' docker-ce.repodnf clean all
dnf makecachednf -y install docker-ce

3、指定docker镜像仓库

cd /etc/docker/
vim daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com"
]
}

4、重载守护进程,并启动服务

systemctl daemon-reload
systemctl start docker
systemctl enable docker

5、优化内核参数

net.ipv4.ip_forward=1 是 Docker 网络功能正常运行的前提,它允许内核转发容器与外部网络、容器与容器之间的数据包,是实现容器通信、端口映射等核心功能的基础

vim /etc/sysctl.conf###编辑内容###
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1sysctl -p

五、部署kubernetes

基础配置

*192.168.10.101*
hostnamectl set-hostname k8s-master
bashcat <<EOF >> /etc/hosts
192.168.10.101 k8s-master
192.168.10.102 k8s-node01
192.168.10.103 k8s-node02
EOF
*192.168.10.102*
hostnamectl set-hostname k8s-node01
bashcat <<EOF >> /etc/hosts
192.168.10.101 k8s-master
192.168.10.102 k8s-node01
192.168.10.103 k8s-node02
EOF
192.168.10.103
hostnamectl set-hostname k8s-node02
bashcat <<EOF >> /etc/hosts
192.168.10.101 k8s-master
192.168.10.102 k8s-node01
192.168.10.103 k8s-node02
EOF

所有节点关闭交换分区


swapoff -ased -i 's/\/dev\/mapper\/openeuler-swap none/#\/dev\/mapper\/openeuler-swap none/g' /etc/fstab

配置 Kubernetes 的 YUM 源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

关闭校验

sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/kubernetes.repo
sed -i 's/repo_gpgcheck=1/repo_gpgcheck=0/g' /etc/yum.repos.d/kubernetes.repo
dnf clean all
dnf makecache

所有节点安装kubelet、kubeadm、kubectl

dnf -y install kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0

所有节点设置开机自启

​ kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功

systemctl enable kubelet

生成初始化配置文件

*192.168.10.101*

kubeadm config print init-defaults>init-config.yaml

Kubeadm 配置在 Kubernetes 集群中存于 ConfigMap,可写入配置文件,通过 kubeadm config 命令操作配置文件

修改配置文件

vim init-config.yaml
sed -i 's/advertiseAddress: 1.2.3.4/advertiseAddress: 192.168.10.101/g' /root/init-config.yaml
sed -i 's/name: node/name: k8s-master/g' /root/init-config.yaml
sed -i 's/imageRepository: k8s.gcr.io/imageRepository: registry.aliyuncs.com\/google_containers/g' /root/init-config.yaml
sed -i '/serviceSubnet: 10.96.0.0\/12/a\  podSubnet: 10.244.0.0\/16' /root/init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.10.101bindPort: 6443
nodeRegistration:criSocket: /var/run/dockershim.sockimagePullPolicy: IfNotPresentname: k8s-mastertaints: null
---
apiServer:timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.23.0
networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12podSubnet: 10.244.0.0/16
scheduler: {}

导入镜像

cd images/
bash imp_docker_img.sh

初始化主节点

192.168.10.101

kubeadm init --config=init-config.yaml

node节点加入集群

img

设置变量

*192.168.10.101*

mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configcdcat <<EOF >> /root/.bash_profile
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF###查看###
vim .bash_profile 

img

查看各节点

kubectl get nodes

kubectl get nodes

kubectl create -f calico.yaml

kubectl create -f calico.yaml

kubectl get pod -A 

img

创建别名

vim .bashrc
# .bashrc# User specific aliases and functionsalias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias ku='kubectl'
# Source global definitions
if [ -f /etc/bashrc ]; then. /etc/bashrc
fi

1、下载Metrics-server 的yaml 文件

curl -o https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.3/components.yaml

2、修改yaml文件并安装

vim components.yaml
###编辑内容###- --kubelet-insecure-tls
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.6.3ku create -f components.yaml

3、测试

ku top node

img

http://www.lryc.cn/news/591501.html

相关文章:

  • Spring Boot 自动配置:从 spring.factories 到 AutoConfiguration.imports 的演变
  • MySQL安全修改表结构、加索引:ON-Line-DDL工具有哪些
  • 数据产品结构:从数据接入到可视化的完整架构指南
  • 学习C++、QT---27(QT中实现记事本项目实现行列显示、优化保存文件的功能的讲解)
  • Spring Boot 参数校验:@Valid 与 @Validated
  • 关于vector中的erase的强调
  • Leetcode刷题营第二十八题:二叉树的前序遍历
  • Effective Python 条款7 用列表推导来取代map和filter
  • c++之 KMP 讲解
  • 网络原理 —— HTTP
  • 深入理解Collections.addAll方法
  • Python 离线安装 PyInstaller 的完整步骤(以python3.11.4-amd64.exe为例)
  • Trae IDE:打造完美Java开发环境的实战指南
  • 产品经理如何绘制服务蓝图(Service Blueprint)
  • 基于5G系统的打孔LDPC编码和均匀量化NMS译码算法matlab性能仿真
  • Oracle 成本优化器(CBO)与数据库统计信息:核心原理与实践
  • 线程(三) linux 同步
  • .NET Framework版本信息获取(ASP.NET探针),获取系统的.NET Framework版本
  • pycharm提交项目到github及问题解决
  • ubuntu基础搭建
  • 【Android代码】绘本翻页时通过AI识别,自动通过手机/pad朗读绘本
  • 基于单片机公交车报站系统/报站器
  • 分支和循环语句
  • Kotlin集合与空值
  • 使用位运算优化 Vue.js 应用:高效状态管理技巧
  • 学习 Flutter (四):玩安卓项目实战 - 中
  • 【LeetCode 热题 100】230. 二叉搜索树中第 K 小的元素——中序遍历
  • Java全栈面试实录:从电商支付到AIGC的深度技术挑战
  • HTML常用标签汇总(精简版)
  • Easy ARM2132