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 ...
随机推荐
- C++中vector容器详解
参考链接:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html 一.什么是vector? 向量(Vector)是一个封装了 ...
- CentOS7挂载webdav添加开机启动
CentOS7挂载webdav添加开机启动 一.安装davfs2 yum install davfs2 二.挂载 1.新建挂载位置 mkdir -p /guazai chmod +x /guazai ...
- 精通 VS 调试技巧,学习与工作效率翻倍!
欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预期的情 ...
- [转帖]聊聊字符串数据长度和nls_length_semantics参数
字符串是我们设计数据库经常用到的类型,从传统的ASCII格式到UTF-8格式,不同应用需求对应不同的字符类型和长度配置.针对Oracle而言,最常用的类型无外乎char和varchar2两个基本类型. ...
- [转帖]sql server 索引阐述系列六 碎片查看与解决方案
https://www.cnblogs.com/MrHSR/p/9365720.html 一 . dm_db_index_physical_stats 重要字段说明 1.1 内部碎片:是avg_pag ...
- [转帖]RAC AWR重要指标说明
1.Global Cache Load Profile Global Cache blocks received: 接收到的全局缓冲块 Global Cache blocks served: 发送的 ...
- [转帖]decimal and numeric (Transact-SQL)
https://learn.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-ser ...
- [转帖]MinIO系列7 - Minio性能压测
https://www.zhihu.com/people/keen-wang 前言 声明:此文为本人历史笔记的整理,文章实际撰写时间为2021年2月份,所以本中所使用的相关组件版本较老.此文是通过压力 ...
- [转帖]20191022-从Jenkins NativeOOM到Java8内存
我把老掉牙的Jenkins升级了,它跑了几天好好的:后来我有一个python脚本使用JenkinsAPI 0.3.9每隔2.5分钟发送约300余get请求,结果过了3天,它就挂了:当我开两个脚本时,4 ...
- [转帖]shell删除文件前几行或后几行
https://www.cnblogs.com/1394htw/p/14852207.html shell删除文件前几行或后几行 #!/bin/bash #删除前两行 sed -i '1,2d' fi ...