kubernets组件介绍:
-
kuber-api server:k8s的鉴权、准入的入口
提供了k8s各类资源对象的增删改查以及watch等HTTP Rest接口,这些对象包括pods、services、replicationcontrollers等,APIServer为REST操作提供服务,并未集群的共享状态提供前端,所有其它组件都通过该前端进行交互。
-
REST ful API
是REST风格的网络接口,REST描述的是在网络中client和server的一种交互形式
-
REST
是一种软件架构风格,或者说是一种网络规范,其强调HTTP应当以资源为中心,并且规范了url风格,规范了HTTP请求动作(GET/PUT/POST/DELETE/HEAD/OPTIONS)的使用。具有对应的语意
运行时
- k8s版本大于1.23 containerd或cri-docker
- k8s版本小于等于1.23 docker
区别:
对于k8s的管理和使用,kubectl无区别
主要是安装部署k8s的时候有区别
kubernetes api server
- 该端口默认值为6443,可通过启动参数
--secure-port
的值来修改默认值 - 默认IP地址为非本地(Non-Localhost)网络端口,通过启动参数
--bind-address
设置该值 - 该端口用于接收客户端、dashboard等外部HTTPS请求
- 用于基于Token文件或客户端证书及HTTP Base的认证
- 用于基于策略的授权
- kubernetes api 测试
- curl --cacert /etc/kubernetes/ssl/ca.pem -H “Authorization:Bearer ${TOKEN}” https://ip:6443
- curl 127.0.0.1:6443 返回所有的api列表
- curl 127.0.0.1:6443/apis 分组api
- curl 127.0.0.1:6443/api/v1 带具体版本号的api
- curl 127.0.0.1:6443/version api版本信息
- curl 127.0.0.1:6443/healthz/etcd 与etcd的心跳监测
- curl 127.0.0.1:6443/apis/autoscaling/v1 api的详细信息
- curl 127.0.0.1:6443/metrics 指标数据
- api版本
- Alpha:预览版,可能包含bug和错误,后期版本会修复且不支持之前的版本,不建议使用
- Beta:测试版,如storage.k8s.io/v1beta1,可能存在不稳定或者潜在bug,不建议生产使用
- v1:稳定版,如apps/v1,经过验证的stable版本,可以生产使用
kube-scheduler
-
kubernets调度器是一个控制面进程,负责将pods指派到节点上
-
通过调度算法为待调度Pod列表的每个Pod从可用node列表里选择一个最合适的node,并将信息写入etcd
-
node节点上的kubelet通过API Server监听到kubernets scheduler产生的pod绑定信息,然后获取对应的pod清单,下载image并启动容器
-
策略
- LeastRequestedPriority:优先从备选节点列表中选择资源消耗最小的节点(CPU+内存)
- CalculateNodeLabelPriority:优先选择含有指定label的节点
- BalancedResourceAllocation:优先从备选节点列表中选择各项资源使用率最均衡的节点
-
工作步骤
- 创建pod
- 过滤掉资源不足的节点
- 在剩余可用节点进行筛选
- 选中节点
kube-controller-manager
kube-controller-manager | Kubernetes
- controller-manager还包含一些子控制器(副本控制器、节点控制器、命名空间控制器、服务账号控制器等),控制器作为集群内部的管理控制中心,负责集群内的node、pod副本、服务断点(endpoint)、命名空间、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个node意外宕机时,controller-manager会及时发现并执行自动化修复流程,确保集群中的pod副本始终处于预期的工作状态
- controller-manager控制器每隔5秒检查一次节点状态
- 如果controller-manager没有收到节点的心跳,则将该node节点标记为不可达
- controller-manager将在node标记为无法访问之前等待40秒
- 如果node节点被标记为无法访问5分钟后还没恢复,controller-manager会删除当前node节点的所有pod并在其它节点上重建这些pod
- pod高可用机制
- node monitor period:节点监视周期,5s
- node monitor grace period:节点监视宽限期,40s
- node eviction timeout:pod驱逐时间,5m
kube-proxy
管理当前节点上的iptables或者IPVS规则
- kube-proxy:kubernetes网络代理运行在node上,它反映了node上kubernetes API中定义的服务并可以通过一组后端进行简单的tcp、udp和sctp流转发或者在一组后端进行循环tcp、udp和sctp转发,用户必须使用apiserver API创建一个服务来配置代理,其实就是kube-proxy通过在主机上维护网络规则并执行连接转发来实现kubernetes服务访问
- kube-proxy运行在每个节点上,监听API Server中服务对象的变化,在通过管理iptables或ipvs规则来实现网络转发
- kube-proxy不同的版本可支持三种工作模式
- UserSpace:k8s v1.1版本之前使用,1.2及以后淘汰
- IPtables:k8s v1.1版本开始支持,1.2开始默认
- IPVS:k8s v1.9版本引入到1.11为正式版本,需要安装ipvsadm、ipset工具包和加载ip_vs内核模块
配置使用IPVS及指定调度算法kube-proxy 配置 (v1alpha1) | Kubernetes
kubelet
接收api server的pod创建。调用(docker、containerd)
对pod进行周期健康检查
给api server反馈pod状态
给api server反馈node状态
kubelet是运行在每个worker节点的代理组件,它会监视已分配给节点的pod。具体功能如下:
- 向master节点汇报node节点的状态信息
- 接收指令并在pod中创建容器
- 准备pod所需的数据卷
- 返回pod的运行状态
- 在node节点执行容器健康检查
kubectl
是一个通过命令行对kubernets集群进行管理的客户端工具
etcd
为 Kubernetes 运行 etcd 集群 | Kubernetes
是CoerOS公司开发,目前是kubernetes默认使用的key-vaule数据存储系统,用于保存k8s所有集群数据。etcd支持分布式集群功能,生产环境使用时需要etcd数据提供定期备份机制
DNS
负责为整个集群提供DNS服务。从而实现服务之间的访问
- coredns
- kube-dns:1.18
- sky-dns
Dashboard
部署和访问 Kubernetes 仪表板(Dashboard) | Kubernetes
是基于网页的k8s用户界面,可以使用Dashboard获取运行在集群中的应用的概览信息,也可以创建或者修改k8s资源(如Development、Job、DaemonSet等),也可以的Development实现弹性伸缩、发起滚动升级、重启pod或者使用想到创建新的应用。
基于kubeadm和containerd部署k8s v1.24.3
一、contianerd部分
1.安装contianerd
1.下载二进制文件
# pwd
/usr/local/src
# ll
total 42424
drwxr-xr-x 2 root root 4096 Nov 18 21:07 ./
drwxr-xr-x 11 root root 4096 Aug 24 16:49 ../
-rw-r--r-- 1 root root 43430474 Nov 18 21:07 containerd-1.6.10-linux-amd64.tar.gz
# tar xvf containerd-1.6.10-linux-amd64.tar.gz
bin/
bin/ctr
bin/containerd
bin/containerd-shim
bin/containerd-stress
bin/containerd-shim-runc-v2
bin/containerd-shim-runc-v1
# cp bin/* /usr/local/bin/
2.创建service文件
# vim /etc/systemd/system/containerd.service
[Unit]
Description=containerd container runtime
After=network.target local-fs.target
Documentation=https://contianerd.io
[Service]
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
ExecStartPre=-/usr/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
2.编辑配置文件
旧版本镜像加速
# mkdir /etc/containerd/
# containerd config default > /etc/containerd/config.toml
# vim /etc/containerd/config.toml
61 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7" #该镜像用于封装pod底层网络
153 [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
154 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
155 endpoint = ["https://gjsamcgt.mirror.aliyuncs.com"]
# systemctl restart containerd.service
# systemctl enable containerd.service
# systemctl status containerd.service
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7"
新版containerd镜像加速
# containerd config default > /etc/containerd/config.toml
# vim /etc/containerd/config.toml
144 [plugins."io.containerd.grpc.v1.cri".registry]
145 config_path = "/etc/containerd/certs.d"
创建/etc/container