Kubernetes 1.26.0实战:在本地配置k8s集群
阶段一:开发环境及版本
以下环境均来自官网:
本地宿主机环境:Windows 10 21H2 64位
虚拟机软件:VMware workstation 15.5 pro
虚拟机镜像版本:ubuntu-20.04.5-desktop-amd64.iso
阶段二:在配置k8s之前的事前准备(已有机器环境可以跳过)
推荐的配置:2核处理器(必须)、2G内存、40G磁盘空间
需要准备三台相同配置的机器,以组成1 master + 2 slave 的集群,slave可以通过master克隆而来以减少工作量,但是要注意修改对应的host、nes/eth网卡IP配置。
从官网下载而来的Ubuntu是极为纯净的版本(自己可以提前配置好然后克隆),为了便于后续的操作,首先需要做一些基础配置:
(1).先把vim tiny改成full模式,这会大大方便接下来的操作,参考:
https://hufeng.blog.csdn.net/article/details/78045213
(2).执行以下命令:
apt-get update
apt-get install net-tools
使用ifconfig命令查看当前网卡的ipv4地址,以便于使用ssh远程登录:

注意,如果受网络环境限制,也许需要进行换源,阿里源或者网易源、华为源、utsc源均可。
换源需要验证密钥,可能需要提前下载gpg:
sudo apt-get install gnupg
再次运行apt-get命令,按照需求更新密钥:
gpg --keyserver keyserver.ubuntu.com --recv-keys 13EDEF05
gpg --export --armor 13EDEF05 | sudo apt-key add -
(3).准备ssh连接,apt-get install openssh-server
sudo passwd root,重设root密码,后续基本使用root登录。
使用vscode远程ssh以root身份连接Ubuntu:

至此,第二阶段的准备工作完成,我们拥有了一个可以正常运行k8s的良好Ubuntu环境。
阶段三:开始在master机上安装开源kubernetes软件
至今,kubernetes已经更新到了1.26.0版本,与前面几个版本相比,此版本变化较大,但参考资料网上不多,因此大部分参考官方文档https://docs.docker.com/engine/install/ubuntu/。
自K8s 1.25以上的版本禁用了dockershim,转为使用containerd。
Containerd的安装方法可以参考:
https://github.com/containerd/containerd/blob/main/docs/getting-started.md
docker安装完成后,开始下载kubernetes工具:
apt-get update && apt-get install -y docker.io kubelet kubernetes-cni kubeadm
在使用kubernetes前需要关闭swap交换区:
sudo swapoff -a #暂时关闭交换区,reboot后失效
vim /etc/fstab,注释掉swap相关行以永久禁用swap:

关闭防火墙,如Ubuntu系统的UFW或者centos系统的firewalld等,当然,这是为了便于实验,实际生产环境中采用开放特殊端口的形式提高系统的安全性。
例:iptables开放6443端口命令:
iptables -A INPUT -p tcp --dport 6443 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 6443 -j ACCEPT
获取当前镜像版本,并通过shell脚本下载:
kubeadm config images list


使用命令docker images查看pull下来的镜像,在该场景下docker仅作为containerd的镜像中转站使用。
Kubeadm init,初始化,提示至少需要2核的CPU,需要进行修改。

成功完成初始化后,k8s暂时无法使用,systemctl status kubelet检查服务状态,显示不可用(exit code 1)。
使用命令journalctl -xeu kubelet查看日志,显示CRI v1 runtime API与docker不兼容,这是在k8s升级到1.26.0版本以后出现的一个特殊bug,在开源项目的issue中予以反馈,截至报告撰写日期尚未修复。具体讨论在https://github.com/Mirantis/cri-dockerd/issues/125中。

在k8s官方手册中,给出了该情况下对于高级版本的适配方案,地址如下:
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd
检查并修改docker和k8s的cgroup driver相同,推荐为systemd(cgroups会出现可疑的重叠叠加情况)。


查看containerd的conf配置文件,取消对cri的禁用并增加对systemd的支持。


按照说明修改完成后,kubelet可以使用,服务状态正常:

然而,此时仍然无法启动,查看kubelet日志,出现failed to pull image \"registry.k8s.io/pause:3.6\" 字样的报错信息。原因是由于pause:3.6镜像需要连接外网才能够拉取。
这里使用先前在docker images中已经在国内源下载完成的pause:3.6镜像,在docker中做中转并对镜像打对应的tag,转移到containerd中,注意tag和日志中的名称应完全相符。具体命令如下:
docker save k8s.gcr.io/pause:3.6 -o pause.tar #从docker中转站中取出对应版本的镜像
ctr -n k8s.io image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6 #给镜像打tag
此处部分的操作参考:https://blog.51cto.com/u_12790562/5223807?articleABtest=1
需要注意的是,根据journalctl -xeu kubelet命令的查询结果,镜像tag一定要严格按照日志说明中拉取并命名,否则无法正确识别。且根据k8s和containerd的版本不同,默认命名空间及前缀会有差异,根据互联网上的绝大多数调试经验不一定完全适用,需要根据日志情况进行调试。
至此,k8s可以正常使用。尝试查看命名空间:

Master机配置完成,克隆出几个虚拟机作为slave节点。
阶段四:安装并配置网络插件
在master机上,为了使集群中的pod能够互相通信,需要安装对应的网络插件,此处仅在master机上安装即可。
完成master node的配置之后(相同配置通过克隆设置于slave node上)
配置网络插件,有很多选择,此处选用flannel:
通过以下命令查看Namespace,与前文相比多了kube-flannel命名空间(此处已安装完成):

需要在kubeadm init 时设置 --pod-network-cidr=10.244.0.0/16,如果先前没有进行相应设置,reset掉并重新设置,此处不再赘述。
命令如下:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
国内环境大概率无法直连github,会出现timeout,可以直接访问复制/下载。

将对应yml文件下载到master节点处,执行:
kubectl apply -f kube-flannel.yml
此时,kubectl get pod --all-namespaces查看pod状态,发现
Flannel pod始终处于CrashLoopBackOff状态,且doredns保持ContainerCreating状态。

命令journalctl -xeu kubelet查看kubelet报错信息:
Error syncing pod, skipping" err="failed to \"StartContainer\" for \"kube-flannel\" with CrashLoopBackOff: \"back-off 2m40s restartin
查看具体pod的log,命令为:
kubectl get pod --all-namespaces #查询pod的具体名字和状态
kubectl logs -n kube-flannel kube-flannel-ds-gg9kr #查询具体pod的log
报错信息如下:
E1224 12:38:12.602471 1 main.go:327] Error registering network: failed to acquire lease: subnet "10.224.0.0/16" specified in the flannel net config doesn't contain "10.244.0.0/24" PodCIDR of the "ubuntu" node
将前文kube-flannel.yml中对应json修改为master节点的IP

再次执行kubectl apply -f kube-flannel.yml,restart后,flannel正常工作。
flannel会间断时间restart,可以通过watch -n1 kubectl get pods -A命令查看实时状态。

至此,master节点配置完成,将slave节点join进入容器组中。
阶段五:尝试在k8s上部署一个应用
由于本地资源限制,此处暂时采用单机部署,在master节点上调度pod,命令如下:
kubectl taint nodes --all node-role.kubernetes.io/master-
由于此时节点暂时没有master属性,使用control-plane替代:

kubectl taint nodes --all node-role.kubernetes.io/control-plane-:
部署应用,通常需要编写yaml文件,来说明应用的各项属性、资源占用、版本等。
此处nginx应用的yaml文件来自于教程:
https://blog.csdn.net/piaoruiqing/article/details/102511315

Master节点默认不允许调度pod,因此在只有一个master节点的情况下,部署的应用处于pending状态。

查看该pod的状态,命令为:kubectl describe pod nginx-pod

显示untolerated taint node,master节点为污点,即在该节点上不允许pod运行调度。
命令kubectl describe nodes ubuntu | grep -i taint查看节点调度限制。
使用以下命令解除单节点pod调度限制:

Master节点上可以调度pod,应用部署成功,状态正常:

使用dashboard,图形化界面便于应用的部署与调度:
从https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml 中下载并获取对应的应用yaml信息,部署应用:


在master节点处创建证书:

Windows客户端下导入该证书:

浏览器登录,选择证书:

顺利进入dashboard的管理界面,可以开始配置并使用:

修改命令中关于token的设置项并重启设置:


生成登录使用的token:


进入主界面:

查看节点状态:

至此,基本完成在本地部署一个k8s集群的工作,此时只有单节点可用,如法炮制将其余节点加入集群。
Kubernetes 1.26.0实战:在本地配置k8s集群的更多相关文章
- K8S(08)交付实战-交付jenkins到k8s集群
k8s交付实战-交付jenkins到k8s集群 目录 k8s交付实战-交付jenkins到k8s集群 1 准备jenkins镜像 1.1 下载官方镜像 1.2 修改官方镜像 1.2.1 创建目录 1. ...
- 配置k8s集群context-rbac实践
说明 在openshift环境中,可以通过oc project {project_name}命令来切换project,那么在k8s中式如何切换namespace的呢?(ocp的project即相当于k ...
- kubernetes教程第一章-kubeadm高可用安装k8s集群
目录 Kubeadm高可用安装k8s集群 kubeadm高可用安装1.18基本说明 k8s高可用架构解析 kubeadm基本环境配置 kubeadm基本组件安装 kubeadm集群初始化 高可用Mas ...
- 通过tarball形式安装HBASE Cluster(CDH5.0.2)——如何配置分布式集群中的zookeeper
集群安装总览参见这里 Zookeeper的配置 1,/etc/profile中加入zk的路径设置,见上面背景说明. 2,进入~/zk/conf目录,复制zoo_sample.cfg为zoo.cfg v ...
- kubernetes忘记token或者token过期怎么加入k8s集群
1.先查看token是否还可用 [root@hadoop01 ~]# kubeadm token list 1.1) 还在则获取ca证书sha256编码hash值,不在则进行2操作 openssl x ...
- Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记
目录 二进制Metrics&Dashboard安装 二进制高可用集群可用性验证 生产环境k8s集群关键性配置 Bootstrapping: Kubelet启动过程 Bootstrapping: ...
- [k8s]jenkins配合kubernetes插件实现k8s集群构建的持续集成
另一个结合harbor自动构建镜像的思路: 即code+baseimage一体的方案 - 程序员将代码提交到代码仓库gitlab - 钩子触发jenkins master启动一次构建 - jenkin ...
- K8S集群集成harbor(1.9.3)服务并配置HTTPS
一.简介 简介请参考:https://www.cnblogs.com/panwenbin-logs/p/10218099.html 二.安装Harbor主机环境及安装要求 主机环境: OS: Cent ...
- Randcher 2.0部署K8s集群(一)
环境准备 1.系统版本 CentOS7.5 + docker ee 2.配置阿里云yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirro ...
- Kubernetes 1.26.0 集群部署Prometheus监控
前言 该存储库收集 Kubernetes 清单.Grafana仪表板和Prometheus 规则,结合文档和脚本,使用Prometheus Operator提供易于操作的端到端 Kubernetes ...
随机推荐
- freeswitch的ACL规则
概述 freeswitch是一款好用的VOIP开源软交换平台. VOIP公共网络中的安全问题是最重要的问题,我们必须对网络端口的访问权限做出限制. ACL全称Access Control List,意 ...
- .NET CORE实战项目之CMS 部署篇 思维导图
.NET Core实战项目之CMS 第十七章 CMS网站系统的部署 如何优雅的利用Windows服务来部署ASP.NET Core程序
- Feign源码解析6:如何集成discoveryClient获取服务列表
背景 我们上一篇介绍了feign调用的整体流程,在@FeignClient没有写死url的情况下,就会生成一个支持客户端负载均衡的LoadBalancerClient.这个LoadBalancerCl ...
- zipkin 与 sleuth 实现链路追踪
本文为博主原创,转载请注明出处 1.Zipkin 与 Sleuth 简介 zipkin 的官网地址: https://zipkin.io/ Zipkin 和 Sleuth 都是由 Twitter 开源 ...
- [转帖]ss 输出格式说明
ss 命令输出详解ss 全名socket statistics,是iproute2中的一员ss已经替代netstat,大热于江湖.但是关于ss命令输出的内容,是什么意思呢? [root@test]# ...
- [转帖]【Kafka】(二)Kafka去Zookeeper化,kraft模式搭建
1.简介 由于zookeeper慢慢的成了kafka的瓶颈,kafka提出了去zookeeper化的概念,并在2.8版本之后版本都包含了kraft模式,也就是不需要使用zookeeper了,目前这种模 ...
- [转帖]Intel“革命性”X86s架构,带来哪些颠覆及影响?
https://www.eet-china.com/mp/a221822.html 英特尔发布了一份新的白皮书(Intel X86-S扩展架构规格),计划简化其处理器指令集架构(ISA).英特尔提供了 ...
- [转帖]CPU缓存行
https://www.jianshu.com/p/e338b550850f CPU缓存 执行程序是靠运行CPU执行主存中代码,但是CPU和主存的速度差异是非常大的,为了降低这种差距,在架构中使用了C ...
- CentOS8 安装 SQLSERVER2019的简单过程
1. 获取rpm包直接从微软官方网站即可 -rw-r--r-- 1 root root 820984 Apr 5 22:23 msodbcsql17-17.5.2.1-1.x86_64.rpm -rw ...
- [转贴]手把手教你 GitLab 的安装及使用
https://www.jianshu.com/p/b04356e014fa 前言 新入职公司,发现公司还在使用落后生产工具 svn,由于重度使用过 svn 和 git ,知道这两个工具之间的差异,已 ...