- Kubernetes简介
-
- 背景:
Kubernetes,也称为K8S,其中8是代表中间“ubernete”的8个字符,Kubernetes这个单词来自于希腊语,含义是舵手或领航员;
K8S是 CNCF 的项目,源于Google的内部项目borg系统,2014年Google用go语言重新编写并开源出来,又后来为了其茁壮成长,捐给了CNCF;
Kubernetes拥有Google在生产环境上15年运行的经验,并结合了社区中最佳实践;
注:CNCF,全称Cloud Native Computing Foundation,即云原生计算基金会,这是一个非营利性的开源软件基金会,由一群致力于推动云计算发展和应用的科技公司创立,CNCF的主要目标是支持和推动云原生计算的发展,通过提供开放的API和工具,帮助开发者更高效地构建、部署和管理微服务应用。
- Kubernetes的功能:[华王1]
用于容器自动化部署、规划、扩展和管理,它将组成应用程序的容器分组为逻辑单元,以便于管理和发现,用于管理云平台中多个主机上的容器化的应用,
Kubernetes 的目标是让部署容器化的应用简单并且高效,很多细节都不需要运维人员去进行复杂的手工配置和处理;
- Kubernetes整体架构[华王2] :master--nodes
- Master:集群控制节点
接受集群外用户的操作请求(如kubectl命令),对集群进行调度管理;
Master Node 由 API Server、Scheduler、ETCD 数据库(ClusterState Store)和 Controller Manger所组成
2、Nodes:集群工作节点,也叫Worker Node,运行用户业务容器;
包含kubelet、kube proxy 和 Pod(麻屋子pod,红帐子容器,里面住着个白胖子容器中的服务)
- 部署 Kubernetes 集群方式介绍
部署集群有多种方式:
-
- minikube[华王3]
minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便您可以试用Kubernetes或进行日常开发工作;
-
- kind[华王4]
Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker;
-
- kubeadm[华王5]
Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;
官方地址:
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
Installing kubeadm | Kubernetes
-
- 二进制包
从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是能让你对各个组件有更清晰的认识;
-
- yum安装
通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老了,所以这种方式用得也比较少了;
-
- 第三方工具
有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;
-
- 花钱购买
直接购买类似阿里云这样的公有云平台k8s,一键搞定;
- 集群节点准备
1.1 主机操作系统说明
CentOS7u9
1.2 主机硬件配置说明
Cpu 4核,内存4G,硬盘100G
1.3 主机配置
1.3.1 主机名配置
由于本次使用3台主机完成kubernetes集群部署,其中1台为master节点,名称为master01;其中2台为worker节点,名称分别为:worker01及worker02
master节点192.168.10.11
[root@localhost ~]# hostnamectl set-hostname master01
[root@localhost ~]# bash
worker01节点192.168.10.12
[root@localhost ~]# hostnamectl set-hostname worker01
[root@localhost ~]# bash
worker02节点 192.168.10.13
[root@localhost ~]# hostnamectl set-hostname worker02
[root@localhost ~]# bash
1.3.2 主机IP地址配置
master01节点IP地址为:192.168.10.11/24
worker1节点IP地址为:192.168.10.12/24
worker2节点IP地址为:192.168.10.13/24
1.3.3 主机名与IP地址解析
所有集群主机均需要进行配置。
[root@master01 ~]#cd /etc/yum.repos.d/
[root@master01 yum.repos.d]# mv * /tmp/
[root@master01 yum.repos.d]#curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@master01 yum.repos.d]#yum -y install wget
[root@master01 yum.repos.d]#wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[root@master01 yum.repos.d]# yum -y install net-tools
[root@master01 yum.repos.d]#yum -y install vim
[root@master01 yum.repos.d]#wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
将主机名映射到IP地址
[root@master01 ~]# vim /etc/hosts
添加:
192.168.10.11 master01
192.168.10.12 worker01
192.168.10.13 worker02
将hosts文件拷贝到其他两台主机上
[root@master01 ~]# scp -rp /etc/hosts root@192.168.10.12:/etc/
[root@master01 ~]# scp -rp /etc/hosts root@192.168.10.13:/etc/
1.3.4 防火墙配置
所有主机均需要操作。
关闭现有防火墙firewalld
# systemctl disable firewalld
# systemctl stop firewalld
1.3.5 SELINUX配置
所有主机均需要操作。修改SELinux配置需要重启操作系统。
# setenforce 0
# sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
1.3.6 时间同步配置
所有主机均需要操作。最小化安装系统需要安装ntpdate软件。
[root@master01 ~]#yum -y install ntpdate
[root@master01 ~]# ntpdate time1.aliyun.com
[root@master01 ~]# crontab -e
0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com
1.3.7 配置内核路由转发及网桥过滤
所有主机均需要操作。
添加网桥过滤及内核转发配置文件
[root@master01 ~]# vim /etc/sysctl.d/k8s.conf
添加:
net.bridge.bridge-nf-call-ip6tables = 1[华王6]
net.bridge.bridge-nf-call-iptables = 1[华王7]
net.ipv4.ip_forward = 1[华王8]
vm.swappiness = 0 [华王9]
[root@master01 ~]# sysctl --system
加载br_netfilter模块(网桥过滤)
[root@master01 ~]# modprobe br_netfilter[华王10]
[root@master01 ~]# echo "modprobe br_netfilter" >> /etc/rc.d/rc.local[华王11]
[root@master01 ~]# chmod +x /etc/rc.d/rc.local
查看是否加载
[root@master01 ~]# lsmod | grep br_netfilter
1.3.8 安装ipset及ipvsadm
所有主机均需要操作。
[root@master01 ~]# yum -y install ipset ipvsadm
配置ipvsadm模块加载方式
添加需要加载的模块
[root@master01 ~]# cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs[华王14]
modprobe -- ip_vs_rr[华王15]
modprobe -- ip_vs_wrr[华王16]
modprobe -- ip_vs_sh[华王17]
modprobe -- nf_conntrack[华王18]
EOF
授权、运行、检查是否加载
[root@master01 ~]#chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
1.3.10 关闭SWAP分区[华王19] (虚拟内存)
修改完成后需要重启操作系统,如不重启,可临时关闭,命令为
[root@master01 ~]# swapoff -a
永久关闭swap分区
[root@master01 ~]# vim /etc/fstab
在行首添加#注释掉
# /dev/mapper/centos-swap swap swap defaults 0 0
- Docker准备
2.1 Docker安装YUM源准备
使用阿里云开源软件镜像站。
[root@master01 ~]#wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
2.2 Docker安装
[root@master01 ~]# yum -y install docker-ce
2.3 启动Docker服务
[root@master01 ~]#systemctl enable --now docker
2.4 修改cgroup方式,添加国内镜像源
/etc/docker/daemon.json 默认没有此文件,需要单独创建
在/etc/docker/daemon.json添加如下内容
[root@master01 ~]# vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://your_preferred_mirror",
"https://dockerhub.icu",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
[root@master01 ~]# systemctl restart docker
参考国内镜像加速器列表(vpn连接访问):
https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6
2.5 cri-dockerd[华王20] 安装
拖包
[root@master01 ~]# yum -y localinstall cri-dockerd-0.3.8-3.el7.x86_64.rpm
[root@master01 ~]# vim /usr/lib/systemd/system/cri-docker.service
修改第10行内容
ExecStart[华王21] =/usr/bin/cri-dockerd[华王22] --pod-infra-container-image=registry.k8s.io/pause:3.9[华王23] --container-runtime-endpoint fd://[华王24]
[root@master01 ~]# systemctl start cri-docker
[root@master01 ~]# systemctl enable cri-docker
- kubernetes 1.28.2 集群部署
3.1 集群软件及版本说明(版本1.28.2,各个组件版本相同)
集群所有主机都安装:
Kubeadm:初始化集群、管理集群等
Kubelet:用于接收api-server指令,对pod生命周期进行管理
Kubectl:集群应用命令行管理工具
3.2 kubernetes YUM源准备
添加阿里云YUM源
[root@master01 ~]# cat > /etc/yum.repos.d/k8s.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1[华王25]
gpgcheck=0[华王26]
repo_gpgcheck=0[华王27]
gpgkey[华王28] =https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
3.3 集群软件安装
所有节点均可安装
查看指定版本
[root@master01 ~]# yum list kubeadm.x86_64 --showduplicates | sort -r
[root@master01 ~]# yum list kubelet.x86_64 --showduplicates | sort -r
[root@master01 ~]# yum list kubectl.x86_64 --showduplicates | sort -r
安装指定版本
[root@master01 ~]# yum -y install kubeadm-1.28.2-0 kubelet-1.28.2-0 kubectl-1.28.2-0
注:不指定版本时,将安装yum源中最新版本 # yum -y install kubeadm kubelet kubectl
3.4 配置kubelet(用于管理pod)
为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。
[root@master01 ~]# vim /etc/sysconfig/kubelet
添加:
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"[华王29]
设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
[root@master01 ~]# systemctl enable kubelet
3.5 集群镜像准备所有主机都需要做
查看集群所需的镜像,可使用VPN实现下载。
[root@master01 ~]#kubeadm config images list --kubernetes-version=v1.28.2
如果已提前下载导出为镜像文件,可复制后直接导入本地镜像库:
拖包
导入镜像
[root@master01 ~]# docker load -i k8s-1.28.2.tar
3.6 集群初始化(注意--cri-socket 部分)只在master01上做
[root@master01 ~]# kubeadm init --kubernetes-version=v1.28.2 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.10.11 --cri-socket unix:///var/run/cri-dockerd.sock
如果初始化失败后,可以重启一下
3.7 Worker节点加入群集:
3.7.1 在master01节点上执行提示中的内容
创建目录用于存放k8s配置文件
[root@master01 ~]# mkdir -p $HOME/.kube
[root@master01 ~]#sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config[华王30]
[root@master01~]# export KUBECONFIG=/etc/kubernetes/admin.conf[华王31]
3.7.2在所有worker节点上执行加入群集命令:
复制提示中的内容,并在尾部添加cri-socket
worker01:192.168.10.12
[root@worker01 ~]# kubeadm join 192.168.10.11:6443 --token j3yyyx.6jrt4f5txicbelsy \
--discovery-token-ca-cert-hash sha256:86ae71d3aa7b2b72907ade9ece9ed5c404fe24a9fc8891b0dcbb7e0dfe14d716 --cri-socket unix:///var/run/cri-dockerd.sock
worker02:192.168.10.13
[root@worker02 ~]# kubeadm join 192.168.10.11:6443 --token j3yyyx.6jrt4f5txicbelsy \
--discovery-token-ca-cert-hash sha256:86ae71d3aa7b2b72907ade9ece9ed5c404fe24a9fc8891b0dcbb7e0dfe14d716 --cri-socket unix:///var/run/cri-dockerd.sock
注:如果出现错误,不能加入集群,可先停止kubelet,清除状态信息,重新加入即可
示例:
# systemctl stop kubelet
# kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
重新配置群集即可
3.8 集群网络插件部署 calicomatser01上做
使用calico部署集群网络
3.8.1 应用operator资源清单文件:
[root@master01 ~]# kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
将yaml文件拖到master01
通过 Kubernetes 部署一个名为 tigera-operator 的资源
[root@master01 ~]#kubectl create -f tigera-operator.yaml
3.8.2 通过自定义资源方式安装:
如果提前已下载,直接修改pod对应的网段地址
[root@master01 ~]# vim custom-resources.yaml
修改文件第13行,修改为使用kubeadm init ----pod-network-cidr对应的IP地址段
......
11 ipPools:
12 - blockSize: 26
13 cidr: 10.244.0.0/16
14 encapsulation: VXLANCrossSubnet
......
3.8.3 应用资源清单文件
可提前下载镜像并导入本地镜像库(只在master01节点)
[root@master01 ~]# docker load < calico-typha.tar[华王32]
[root@master01 ~]# docker load < calico_v3.25.1.tar[华王33]
[root@master01 ~]# docker load < calico-apiserver.tar[华王34]
通过 Kubernetes 部署一个自定义资源(Custom Resource,CR)
[root@master01 ~]# kubectl create -f custom-resources.yaml
实时监控 Calico 系统中所有 Pod 的状态
[root@master01 ~]# watch kubectl get pods -n calico-system
已经全部运行后,ctrl-C结束监控即可
[root@master01 ~]# kubectl get pods -n calico-system
- 验证集群可用性
4.1 查看所有的节点
[root@master01 ~]# kubectl get nodes
注:如果出现如下状态,说明calico网络插件未装好
[root@master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 NotReady control-plane 3m4s v1.28.2
worker01 NotReady <none> 58s v1.28.2
worker02 NotReady <none> 4s v1.28.2
4.2 查看集群健康情况
[root@master01 ~]# kubectl get cs
4.3 查看kubernetes集群pod运行情况
[root@master01 ~]# kubectl get pods -n kube-system
4.4 再次查看calico-system命名空间中pod运行情况
[root@master01 ~]# kubectl get pods -n calico-system
补充辅助操作:设置kubectl命令行工具自动补全功能
[root@master01 ~]# yum install -y bash-completion
加载 Bash 自动补全功能。
[root@master01 ~]# source /usr/share/bash-completion/bash_completion
启用 kubectl 的 Bash 自动补全功能。
[root@master01 ~]# source <(kubectl completion bash)
将 kubectl 自动补全的配置添加到 ~/.bashrc 文件中
[root@master01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
为了以后我们写yaml文件方便些,这里设置tab键空格个数
[root@master ~]# vim .vimrc
添加:
set tabstop=2
[root@master ~]# source .vimrc
注意:
[root@master01 ~]# kubectl get nodes
E0310 23:10:58.590120 1646 memcache.go:265] couldn't get current server API group list: Get "https://192.168.10.11:6443/api?timeout=32s ": dial tcp 192.168.10.11:6443: connect: connection refused
故障原因可能是:
kubelet、docker、cri-docker等服务异常,可重启服务尝试
[华王1]1. 自动部署应用
- 功能:你只需要告诉 Kubernetes 你想运行什么应用,它就会自动帮你部署好,不用手动操作。
- 例子:就像你告诉厨师想吃什么菜,厨师会自动做好端上来。
2. 自动扩展
- 功能:如果你的应用突然有很多人用,Kubernetes 会自动增加更多的容器来分担压力;如果没人用,它会减少容器,节省资源。
- 例子:就像餐厅人多时自动加桌子,人少时收桌子。
3. 自动修复
- 功能:如果某个容器挂了,Kubernetes 会自动重启它;如果整个服务器出问题,它会把容器搬到其他服务器上。
- 例子:就像家里的灯泡坏了,系统会自动换一个新的。
4. 负载均衡
- 功能:Kubernetes 会把用户的请求平均分配到多个容器上,避免某个容器太忙。
- 例子:就像银行开多个窗口,让顾客不用只排一个队。
5. 存储管理
- 功能:Kubernetes 可以自动挂载存储(比如硬盘),让你的应用能保存数据。
- 例子:就像给你的应用配了一个随身U盘,随时存东西。
6. 滚动更新和回滚
- 功能:更新应用时,Kubernetes 会逐步替换旧版本,如果新版本有问题,它会自动回滚到旧版本。
- 例子:就像修路时,先修一半,等修好了再修另一半;如果修坏了,马上恢复原样。
7. 服务发现
- 功能:Kubernetes 会自动给每个容器分配一个地址,其他容器可以通过这个地址找到它。
- 例子:就像给每个人发一个电话号码,大家可以直接打电话联系。
8. 配置和密钥管理
- 功能:Kubernetes 可以帮你管理应用的配置文件和敏感信息(比如密码),并安全地传递给容器。
- 例子:就像把你的密码和设置放在一个保险箱里,需要用的时候再拿出来。
9. 批处理任务
- 功能:Kubernetes 可以运行一次性任务或定时任务,比如每天凌晨清理数据。
- 例子:就像设定一个闹钟,到点自动执行任务。
10. 多环境支持
- 功能:Kubernetes 可以在本地、云上或者混合环境中运行,轻松迁移应用。
- 例子:就像你的手机APP可以在不同品牌的手机上运行。
11. 监控和日志
- 功能:Kubernetes 可以监控应用的运行状态,并记录日志,方便你排查问题。
- 例子:就像给你的应用装了一个行车记录仪,随时查看发生了什么。
- [华王2]用户请求:用户通过互联网发送请求到 Kubernetes 集群。
- 防火墙:请求首先通过防火墙,确保只有合法的请求能够进入集群。
- 主控节点(Master):
-
- API Server:接收用户的请求,并进行身份验证(Auth)。
- Scheduler:根据资源情况和调度策略,决定将请求分配到哪个节点(Node)上运行。
- Controller Manager:确保集群的当前状态与用户定义的期望状态一致。
- 节点(Node):
-
- kubelet:负责与主控节点通信,并管理节点上的 Pod 和容器。
- kube-proxy:处理节点上的网络通信,确保 Pod 之间的网络连接。
- Pod 和容器:
-
- Pod:Kubernetes 中最小的部署单元,包含一个或多个容器。
- Container:实际运行应用程序的容器。
- 流程总结:
-
- 用户请求通过防火墙进入集群。
- API Server 接收请求并进行身份验证。
- Scheduler 将请求分配到合适的节点。
- Controller Manager 确保集群状态符合预期。
- 节点上的 kubelet 和 kube-proxy 管理 Pod 和容器的运行及网络通信。
- [华王3]简介:minikube是一个轻量级的Kubernetes部署工具,允许开发者在本地快速启动和管理单节点Kubernetes集群。这种方式非常适合开发和测试使用,因为开发者不需要复杂的配置就能搭建起一个完整的Kubernetes集群,从而节省了时间和资源。
- 特点:
-
- 支持多驱动,包括Docker、Hyper-V、VirtualBox等,适配不同操作系统。
- 允许指定Kubernetes版本,便于多版本测试。
- 集成Ingress、Dashboard、Metrics Server等插件,一键启用。
- 支持Kubernetes的主要功能,如DNS、NodePorts、ConfigMaps和Secrets、仪表板等。
[华王4]kind
- 简介:kind(Kubernetes in Docker)是一个使用 Docker 容器作为节点来运行本地 Kubernetes 集群的工具。它主要用于测试 Kubernetes 本身,也可用于本地开发或 CI。
- 特点:
-
- 支持多节点(包括高可用)集群。
- 支持从源代码构建 Kubernetes 发行版。
- 支持 Linux、macOS 和 Windows。
- 是 CNCF 认证的符合 Kubernetes 标准的安装程序。
[华王5]kubeadm
- 简介:kubeadm 是官方社区推出的一个用于快速部署 Kubernetes 集群的工具。它能通过简单的指令完成 Kubernetes 集群的部署。
- 特点:
-
- 可以通过两条指令完成一个 Kubernetes 集群的部署:创建一个 Master 节点 $ kubeadm init,将一个 Node 节点加入到当前集群中 $ kubeadm join <Master节点的IP和端口>。
- 实现尽可能简单地部署符合最佳实践、满足基本安全合规要求的 Kubernetes 高可用集群。
- [华王6]作用:允许 Linux 网桥(bridge)将 IPv6 数据包传递给 ip6tables 进行处理。
- 意义:
-
- 在 Kubernetes 中,网络插件(如 Calico、Flannel)通常会使用网桥来管理容器网络。
- 启用此参数可以确保 IPv6 数据包经过 ip6tables 的过滤和转发规则,保证网络安全和策略生效。
- [华王7]作用:允许 Linux 网桥将 IPv4 数据包传递给 iptables 进行处理。
- 意义:
-
- Kubernetes 依赖 iptables 来实现服务负载均衡、网络策略等功能。
- 启用此参数可以确保 IPv4 数据包经过 iptables 的过滤和转发规则,保证网络功能正常。
- [华王8]作用:启用 IPv4 数据包的转发功能。
- 意义:
-
- Kubernetes 节点需要转发数据包以实现 Pod 之间的通信以及 Pod 与外部网络的通信。
- 启用此参数后,节点可以充当路由器,转发数据包。
- [华王9]作用:控制内核使用交换分区(swap)的倾向。
- 意义:
-
- 当 vm.swappiness = 0 时,内核会尽量避免使用交换分区,除非内存完全耗尽。
- 在 Kubernetes 中,禁用或减少交换分区的使用可以提高性能,因为容器化应用对内存访问速度非常敏感。
- [华王10]br_netfilter 是一个内核模块,用于使 Linux 网桥(bridge)能够处理 iptables 和 ip6tables 的规则。
- 在 Kubernetes 中,br_netfilter 是必需的,因为它确保数据包经过网桥时能够被 iptables 过滤和转发,从而实现服务负载均衡、网络策略等功能。
- [华王11]/etc/rc.d/rc.local 是一个脚本文件,系统在启动时会自动执行其中的命令。
- 通过将 modprobe br_netfilter 添加到该文件,可以确保每次系统重启后自动加载 br_netfilter 模块。
[华王12]ipset
作用:ipset 是一个用于管理 IP 地址集合的工具,可以与 iptables 结合使用,高效地处理大量 IP 地址的过滤和匹配。
意义:
在 Kubernetes 中,ipset 通常用于优化网络策略和服务负载均衡的性能。
它可以减少 iptables 规则的数量,提高规则匹配的效率。
[华王13]ipvsadm
作用:ipvsadm 是 IP Virtual Server (IPVS) 的管理工具,用于配置和管理 Linux 内核中的负载均衡功能。
意义:
Kubernetes 支持使用 IPVS 作为 kube-proxy 的负载均衡模式,替代默认的 iptables 模式。
IPVS 提供了更高的性能和更灵活的负载均衡算法(如轮询、最小连接等),适合大规模集群。
- [华王14]ip_vs:IP Virtual Server 核心模块,提供负载均衡功能。
- [华王15]ip_vs_rr:轮询(Round Robin)调度算法模块。
[华王16]ip_vs_wrr:加权轮询(Weighted Round Robin)调度算法模块
- [华王17]ip_vs_sh:源地址哈希(Source Hashing)调度算法模块。
- [华王18]nf_conntrack:连接跟踪模块,用于跟踪网络连接状态。
[华王19]1. Kubernetes 的资源管理机制
- Kubernetes 使用 cgroups 来管理容器的资源(如 CPU 和内存)。
- 当容器使用的内存超过其限制时,Kubernetes 会终止该容器并重新启动它(OOM Killer,Out-Of-Memory Killer)。
- 如果启用了 SWAP,容器可能会将部分内存数据交换到 SWAP 分区,导致 Kubernetes 无法准确判断容器的实际内存使用情况。
- 这会导致 Kubernetes 的资源调度和限制机制失效,影响集群的稳定性和性能。
2. 性能问题
- SWAP 分区 是基于磁盘的虚拟内存,访问速度远低于物理内存(RAM)。
- 当系统内存不足时,操作系统会将部分内存数据交换到 SWAP 分区,这会显著降低系统性能。
- 在 Kubernetes 中,容器化应用通常对性能要求较高,使用 SWAP 会导致应用响应变慢,甚至引发超时或故障。
3. 节点资源分配的准确性
- Kubernetes 调度器(Scheduler)依赖于节点的可用资源(如 CPU 和内存)来决定将 Pod 调度到哪个节点。
- 如果启用了 SWAP,节点的可用内存可能会被高估(因为部分内存被交换到 SWAP),导致调度器做出错误的调度决策。
- 这可能会导致节点过载,影响集群的稳定性和性能。
4. 与 kubelet 的兼容性
- Kubernetes 的 kubelet 组件默认会检查节点的 SWAP 状态。
- 如果 SWAP 启用,kubelet 会拒绝启动或运行,除非显式配置 --fail-swap-on=false 参数。
- 为了避免额外的配置复杂性,通常建议直接关闭 SWAP。
[华王20]容器运行时接口(CRI)支持
- 实现CRI接口:cri-dockerd为Docker提供了一个shim,使得Kubernetes可以通过其容器运行时接口(CRI)来控制Docker。这使得Kubernetes能够以统一的方式与不同的容器运行时进行交互,而不需要针对每种运行时编写特定的代码。
- [华王21]ExecStart:
-
- 这是 systemd 服务文件中的一个指令,用于指定启动服务时要执行的命令或脚本。
- 在这里,它指定了启动 cri-dockerd 服务的命令及其参数。
- [华王22]/usr/bin/cri-dockerd:
-
- 这是 cri-dockerd 的可执行文件路径。cri-dockerd 是一个允许 Kubernetes 使用 Docker 作为容器运行时的组件。
- [华王23]--pod-infra-container-image=registry.k8s.io/pause:3.9:
-
- 这个参数指定了 Pod 基础设施容器的镜像。
- 在 Kubernetes 中,每个 Pod 都会启动一个特殊的基础设施容器(通常称为 pause 容器),它负责为 Pod 中的其他容器提供网络命名空间和其他基础功能。
- registry.k8s.io/pause:3.9 是这个基础设施容器镜像的地址和版本。
- [华王24]--container-runtime-endpoint fd://:
-
- 这个参数指定了容器运行时的通信端点。
- fd:// 表示使用 Unix 域套接字进行通信,这是 Docker 的默认通信方式。
- [华王26]gpgcheck=0:
-
- 关闭 GPG 签名检查,即不验证软件包的签名。
- [华王27]repo_gpgcheck=0:
-
- 关闭对整个仓库的 GPG 签名检查。
- [华王28]gpgkey:
-
- 指定了 GPG 公钥的地址,用于验证软件包的签名。这里提供了两个公钥的 URL。
- [华王29]在 Linux 系统中,cgroup 的管理方式有两种:
-
- cgroupfs:默认的 cgroup 驱动,直接使用文件系统管理 cgroup。
- systemd:使用 systemd 的 cgroup 管理功能。
- 如果系统的初始化进程是 systemd(大多数现代 Linux 发行版默认使用 systemd),则需要将 kubelet 的 cgroup 驱动设置为 systemd,以确保 kubelet 和容器运行时使用相同的 cgroup 驱动。
- 如果 kubelet 和容器运行时的 cgroup 驱动不一致,可能会导致资源管理错误,甚至 kubelet 无法启动。
- [华王30]作用:将 ~/.kube/config 文件的所有权更改为当前用户,确保 kubectl 可以访问该文件。
- 注意:
-
- $(id -u) 获取当前用户的 UID。
- $(id -g) 获取当前用户的 GID。
- [华王31]作用:将 KUBECONFIG 环境变量设置为 Kubernetes 管理配置文件的路径,使 kubectl 能够正确连接到集群。
- 注意:
-
- 这个环境变量的设置是临时的,仅在当前终端会话中有效。
- 如果希望永久生效,可以将该命令添加到用户的 shell 配置文件(如 ~/.bashrc 或 ~/.zshrc)中:
[华王32]calico-typha.tar
- 作用:包含 Calico Typha 组件的容器镜像。Typha 是 Calico 架构中的一个组件,主要负责在数据存储(如 Kubernetes API 服务器)和多个 Felix 实例之间进行通信,以提高大规模部署中的性能和可扩展性。
[华王33]calico_v3.25.1.tar
- 作用:包含 Calico v3.25.1 版本的安装文件和相关配置。这个文件通常是一个压缩包,里面包含了在 Kubernetes 集群中部署 Calico 所需的清单文件(如 YAML 文件)和相关脚本。
[华王34]calico-apiserver.tar
- 作用:包含 Calico API Server 组件的容器镜像。Calico API Server 提供了一个 RESTful API,用于管理 Calico 的网络策略和网络安全相关配置。