一、梳理k8s 各组件功能
kube-apiserver
Kubernetes API server提供k8s各类资源对象的增删改查及watch等rest接口,这些对应包括pods/services/replicationcontrollers等;
API Server为各类操作提供接口服务,并为集群的资源状态提供前端,所有其他组件都通过该前端进行交互;
API Server默认端口6443,可通过启动参数"--secure-port"来修改默认端口,该端口接收客户端、dashboard等外部https请求;
默认IP地址为非本地(Non-localhost)网络端口,通过启动参数"--bind-address"设置bind IP;
基于tocken文件或客户端证书的认证,支持基于策略的授权;
kube-scheduler
Kubernetes的调度器,是一个控制面的进程,负责将pods调度到节点上;
通过调度算法为待调度pod列表里的每个pod从可用node列表中选择一个最合适的node,并将信息写入etcd中;
node节点上的kubelet通过APIServer监听到kube-scheduler产生的pod绑定信息,然后获取对应的pod清单,下载image,并启动容器;
调度策略:
LeastRequestedPriority: 优先从备选节点列表中选择资源消耗最小的节点(CPU+MEM)
CalculateNodeLabelPriority: 优先选择含有指定Label的节点
BalancedResourceAllocation: 优先从备选节点列表中选择各项资源使用率最均衡的节点
kube-controller-manager
ControllerManager还包括一些子控制器(副本控制器、节点控制器、命名空间控制器和服务帐号控制器)
控制器作为集群内部的管理控制中心,负责集群内的node/pod副本/服务端点(Endpoint)、命名空间(Namespace)、服务帐号(ServiceAccount)、资源定额(ResourceQuota)的管理
当某个node意外宕机时,ControllerManager会及时发现并执行自动化修复流程,确保集群中的pod副本时钟处于期望的工作状态
ControllerManager控制器每间隔5s检查一次节点的状态,如果ControllerManager没收到节点的心跳,则将node节点标记为不可达(在标记为不可达之前等待40s)
如果该node节点被标记为不可达后5min还没恢复,ControllerManager会删除该节点上的所有pod,并在其他可用节点上重建这些pod
kube-porxy
Kubernetes网络代理,运行在node上,它反映了node上Kube-apiserver中定义的服务,并可以通过一组后端进行简单的TCP/UDP和SCTP流转发或者在一组后端进行循环TCP/UDP/SCTP转发;
用户必须使用apiserver api创建服务来配置代理,kube-proxy通过在主机上维护网络规则并执行转发来实现Kubernetes服务访问;
kube-porxy运行在每个节点上,监听apiserver中服务对象的变化,再通过管理iptables或者IPVS规则来实现网络的转发;
kube-proxy不同版本可支持三种工作模式:
UserSpace:k8s v1.1之前使用,k8s v1.2及以后已淘汰
IPtables:k8s v1.1版本开始支持,k8s v1.2开始默认使用
IPVS:k8s v1.9引入 k8s v1.11正式使用IPVS,需要安装ipvsadm/ipset工具包,需要加载ip_vs内核模块
IPVS相对IPtables效率会更高一些,使用IPVS模式需要在运行Kube-Proxy的节点上安装ipvsadm、ipset工具包和加载ip_vs内核模块,当Kube-Proxy以IPVS代理模式启动时,Kube-Porxy
将验证节点上是否安装了IPVS模块,如果未安装,则Kube-Proxy将回退到IPtables代理模式;
使用IPVS模式,Kube-proxy会监视kubernetes Service对象和endpoints,调用宿主机内核netlink接口,相应地创建IPVS规则并定期与kubernetes service对象的endpoints对象同步IPVS规则,
以确保IPVS状态与期望一致,访问服务时,流量将被重定向到其中一个后端pod,ipvs使用哈希表作为底层数据结构并在内核空间中工作,这意味着ipvs可以更快地重定向流量,并且在同步代理
规则时具有更好的性能,此外,ipvs为负载均衡提供了更多调度算法,如:rr(轮询调度)、lc(最小连接数)、dh(目标哈希)、sh(源哈希)、sed(最短期望延迟)、nq(不排队调度)等。
kubelet
kubelet是运行在每个worker节点的代理组件,它监视分配给节点的pod
向master汇报node节点的状态信息
接收指令并在pod中创建docker容器
准备pod所需的数据卷
返回pod的运行状态
在node节点执行容器健康检查
kubectl
kubectl是一个通过命令行对kubernetes集群进行管理的客户端工具
etcd
etcd是CoreOS公司开发,目前是kubernetes默认使用的key-value数据存储系统, 用于保存kubernetes的所有集群数据,etcd支持分布式集群功能,生产环境使用时需要为etcd数据制定定期备份机制
DNS
DNS负责为整个集群提供DNS服务,从而实现服务之间的访问(coredns/kube-dns/sky-dns)
Dashboard
Dashboard是基于网页的kubernetes用户界面,可以使用Dashboard获取运行在集群中应用的概览信息,可以创建、修改kubernetes资源(如deployment、job、daemonset等),也可以对deployment实现弹性伸缩、
发起滚动升级、重启pod
二、掌握containerd的安装和使用
1.使用yum安装containerd
查看containerd.service文件
验证runc环境
查看containerd的默认配置
containerd config default
cat /etc/containerd/config.toml
验证下载镜像
ctr客户端创建测试容器
2.二进制安装containerd
下载二进制文件,解压,并将解压出来的二进制文件cp至/usr/local/bin下
从yum安装containerd的机器上cp service文件,并修改二进制文件的路径
从yum安装containerd的机器上生成配置文件,并cp过来
从github上下载runc,cp至/usr/bin/runc,赋可执行权限
下载镜像,并运行测试容器
containerd客户端工具扩展
推荐使用nerdctl
安装cni-plugins
运行测试容器
三、基于kubeadm和containerd部署单master k8s v1.24.x
1.在master、node1、node2上分别安装containerd、cni-plugins、runc、nerdctl,安装步骤见上文
2.在master、node1、node2上写kubernetes的yum.repo文件
三个机器上使用yum安装kubeadm、kubelet、kubectl
3.提前下载kubernetes初始化使用的镜像
images-download.sh脚本内容
4.修改内核参数(三个节点上都做)
在/etc/sysctl.conf文件里添加两行
5.初始化kubernetes
初始化成功
根据提示创建.kube,cp认证文件
6.根据提示将worker节点加入集群
先把认证文件cp到worker节点
将节点加入集群
7.检查加入结果
8.部署nginx.yaml测试集群
浏览器访问测试
四、部署harbor并实现https(SAN签发证书)
containerd登录docker基础--第二周作业_KaiA8的博客-CSDN博客搭建的harbor时,报错,证书不是通过SAN签发的,所以containerd登录不上,需要重新通过SAN签发证书
containerd登录SAN签发证书的harbor还没测试成功
在harbor机器上使用SAN签发证书
# mkdir /usr/local/src/harbor/certs
# cd /usr/local/src/harbor/certs
# openssl genrsa -out ca.key 4096
# openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=ShanDong/L=JiNan/O=example/OU=Personal/CN=likai.com" \
-key ca.key \
-out ca.crt
# openssl genrsa -out likai.com.key 4096
# openssl req -sha512 -new \
-subj "/C=CN/ST=ShanDong/L=JiNan/O=example/OU=Personal/CN=likai.com" \
-key likai.com.key \
-out likai.com.csr
# cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=likai.com
DNS.2=harbor.likai.com
DNS.3=harbor1.likai.com
DNS.4=harbor2.likai.com
EOF
# openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in likai.com.csr \
-out likai.com.crt
生成如下证书文件
修改harbor配置文件harbor.yml,引用生成的证书文件
重新通过install.sh脚本部署harbor
成功后通过web页面访问https://harbor.likai.com正常访问
docker登录使用SAN签发证书的harbor时,需要将harbor的证书文件cp到docker的certs.d目录下
在docker机器上创建certs.d目录
将harbor的证书文件scp到docker的certs.d目录下
在测试登录之前,先删除之前登录成功的认证文件.docker/config.json,取消docker/daemon.json里配置的insecure-registries
测试登录
五、部署haproxy和keepalived高可用负载均衡
在【docker基础】使用Harbor搭建私有仓库-docker-compose使用示例--第二周作业_KaiA8的博客-CSDN博客文中已部署两台harbor,并通过haproxy实现两台harbor的负载均衡;
现在需要在添加一台同样的haproxy,然后在两台haproxy上部署keepalived实现haproxy高可用;
在两台haproxy机器上安装keepalived,配置keepalived
启动两台机器上的keepalived,检查vip是否生成
测试通过vip访问页面https://10.49.33.57
关闭master的keepalived,检查backup机器上是否生成vip
测试通过vip访问页面https://10.49.33.57
配置域名harbor.likai.com解析到VIP 10.49.33.57,可通过域名访问
扫一扫关注作者公众号