CKA笔记整理(八)之k8s架构原理及安装

 

nerdctl默认使用default命名空间,可修改为k8s.io。k8s使用的命名空间为k8s.io,虽然k8s自己本身有很多命名空间(namespace),但实质上就是在使用containerd的k8s.io。

在k8s中创建的容器称为pod--豆荚,当然,pod和普通的容器有所不同。

所谓的pod就是加了层壳的容器,我们可在pod中设置多种策略来方便管理容器,同时一个pod中可包括多个容器,但一般情况下只设置一个容器。pod为k8s下最小调度单位。 

当我们想创建一个pod时,首先通过kubectl或其他可视乎工具来连接matser node(control plane控制平面节点)的kube-apiserver,apiserver将该请求发送给kube-scheduler(调度器),scheduler会根据自身算法按各worker节点的资源将工作分配给符合条件的worker。

然后scheduler会反馈给apiserver,apiserver会将请求反馈至worker上的kubectl,kubectl则调动runtime生成pod。自k8s1.24开始,不再使用docker作为runtime,而是使用containerd。

在每个worker节点需安装kubelet来控制runtime生成容器、pod,kubelet相当于runtime的客户端。

管理pod需要使用控制器,在k8s中有许多控制器,管理所有控制器的组件为kube-controller-manager。

在k8s下所做的所有操作都需一个数据库来记录(etcd),etcd并不属于master但在master上运行。实际中,需对etcd做高可用。

外界客户端无法直接访问pod,虽可设置,但pod挂掉后重启一个新的,IP地址会改变,因此一般外界不会直接访问pod。我们需建立一个类似负载均衡的东西(service svc)。svc会关联到后端的pod上,从此外界访问svc即可,然后svc将信息发送给pod。svc通过iptables或ipvs技术来实现转发,而决定使用哪种技术是由配置组件(kube-proxy)实现,默认情况下是iptables。因此,每个worker node上都需配置一个kube-proxy。

如果想打通跨节点的pod间的相互通信,可使用BGP、Vxlan、openvswitch等技术建立高速通信隧道。但我们实际上没必要因此去学以上技术,我们可以使用别人打包好的产品:calico、flannel等,以上产品都遵循CNI标准(容器网络接口标准)。

安装:

采用一个master加一个worker的结构进行演示。

masterworker
26.9126.92

所有节点:

配置hosts文件、关闭swap、关闭防火墙、配置yum源。

参数设置:

/etc/modules-load.d/containerd.conf

overlay
br_netfilter
/etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

modprobe overlay   

modprobe br_netfilter

sysctl -p /etc/sysctl.d/k8s.conf
所有节点:安装runtime

yum install containerd.io cri-tools -y

配置containerd:

crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock
rm -rf /etc/containerd/config.toml ; wget ftp://ftp.rhce.cc/cka/cka-1.25.2/config.toml -P /etc/containerd/

systemctl enable containerd --now

安装nerdctl

tar zxf nerdctl-1.1.0-linux-amd64.tar.gz -C /usr/bin/ nerdctl ; chmod +x /usr/bin/nerdctl

mkdir -p /opt/cni/bin/ /etc/nerdctl/ /etc/containerd/certs.d/docker.io

tar zxf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin/
rm -rf /etc/nerdctl/nerdctl.toml ; wget ftp://ftp.rhce.cc/cka/cka-1.25.2/nerdctl.toml -P /etc/nerdctl/
配置加速器:
mkdir -p /etc/containerd/certs.d/docker.io
wget ftp://ftp.rhce.cc/cka/cka-1.25.2/hosts.toml -P /etc/containerd/certs.d/docker.io/
重启containerd
systemctl restart containerd
所有节点:安装kubernetes
yum install -y kubelet-1.25.2-0 kubeadm-1.25.2-0 kubectl-1.25.2-0 --disableexcludes = kubernetes
systemctl enable kubelet ; systemctl restart kubelet
在matser上:
初始化集群:

kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.25.2 --pod-network-cidr=10.244.0.0/16

然后按要求,二选一进行创建目录并赋权。

获取worker节点加入集群的命令:

kubeadm token create -- print - join - command
执行完后系统会给出一条命令,在worker节点执行即可。
可使用kubectl get pod 查看集群节点
安装calico以完成节点间pod的通信,此处使用环境提供的镜像。
在所有节点导入镜像:nerdctl load - i soft / calico / calico - img - 3.23 . tar
然后仅在master上安装calico,执行如下命令生成pod:
kubectl apply - f soft / calico / calico - v3 . 23. yaml

没有该yaml的可以在如下地址下载:wget https://docs.projectcalico.org/manifests/calico.yaml

需修改pod所在网段以及网卡以避免多张网卡带来的不便。

如果希望可以使用tab补全命令,可修改/etc/profile,添加

source <(kubectl completion bash)

wq,source /etc/profile

注意:所有对集群的命令都在master上执行。

#查看节点数
kubectl get nodes
#查看集群信息
kubectl cluster-info
#查看集群版本
kubectl version --short
#查看集群配置
kubectl get cm kubeadm-config -n kube-system -o yaml
#想查看所有资源类型名的简写,比如pod--po,namespace--ns
kubectl api-resources

其中访问apiserver时,我们需要知道其地址,可通过kubectl  cluster-info来查看。

到此,一个k8s集群安装完毕。

在master上将worker节点从集群踢出去:

首先将该节点设置为可调度的(维护模式),此时集群会将该节点上运行的pod驱逐到其他节点上运行。kubectl drain vms92.rhce.cc  --ignore-daemonsets --delete-emptydir-data

然后删除该节点:kubectl delete nodes vms92.rhce.cc

此时kubectl  get  nodes 会发现列表中该节点消失。

如果需要将该节点再次加入集群,首先需清空节点上的配置:

kubeadm  reset

然后去master上执行获取加入集群命令的命令:kubeadm  token  create  --print-join-command,将反馈的命令再次执行。如果还记得之前加入集群的命令也可跳过这步在清空配置后直接执行。但如果是master重新格式化(重置加入集群),那么需要重新安装calico。

如果再次加入集群出错的话,需要将/etc/kubernetes/pki和/var/lib/kubelet/两个目录下的内容清空,然后再次加入集群即可。当然也有可能是containerd服务未设置自启或worker下/var/run/containerd/没有containerd.sock该文件,需再次执行crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock,如果执行完没有产生文件,则需要重启containerd服务并再次执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御坂家的小菜菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值