阶段一:开发环境及版本

以下环境均来自官网:

本地宿主机环境: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集群的更多相关文章

  1. K8S(08)交付实战-交付jenkins到k8s集群

    k8s交付实战-交付jenkins到k8s集群 目录 k8s交付实战-交付jenkins到k8s集群 1 准备jenkins镜像 1.1 下载官方镜像 1.2 修改官方镜像 1.2.1 创建目录 1. ...

  2. 配置k8s集群context-rbac实践

    说明 在openshift环境中,可以通过oc project {project_name}命令来切换project,那么在k8s中式如何切换namespace的呢?(ocp的project即相当于k ...

  3. kubernetes教程第一章-kubeadm高可用安装k8s集群

    目录 Kubeadm高可用安装k8s集群 kubeadm高可用安装1.18基本说明 k8s高可用架构解析 kubeadm基本环境配置 kubeadm基本组件安装 kubeadm集群初始化 高可用Mas ...

  4. 通过tarball形式安装HBASE Cluster(CDH5.0.2)——如何配置分布式集群中的zookeeper

    集群安装总览参见这里 Zookeeper的配置 1,/etc/profile中加入zk的路径设置,见上面背景说明. 2,进入~/zk/conf目录,复制zoo_sample.cfg为zoo.cfg v ...

  5. kubernetes忘记token或者token过期怎么加入k8s集群

    1.先查看token是否还可用 [root@hadoop01 ~]# kubeadm token list 1.1) 还在则获取ca证书sha256编码hash值,不在则进行2操作 openssl x ...

  6. Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记

    目录 二进制Metrics&Dashboard安装 二进制高可用集群可用性验证 生产环境k8s集群关键性配置 Bootstrapping: Kubelet启动过程 Bootstrapping: ...

  7. [k8s]jenkins配合kubernetes插件实现k8s集群构建的持续集成

    另一个结合harbor自动构建镜像的思路: 即code+baseimage一体的方案 - 程序员将代码提交到代码仓库gitlab - 钩子触发jenkins master启动一次构建 - jenkin ...

  8. K8S集群集成harbor(1.9.3)服务并配置HTTPS

    一.简介 简介请参考:https://www.cnblogs.com/panwenbin-logs/p/10218099.html 二.安装Harbor主机环境及安装要求 主机环境: OS: Cent ...

  9. Randcher 2.0部署K8s集群(一)

    环境准备 1.系统版本 CentOS7.5 + docker ee 2.配置阿里云yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirro ...

  10. Kubernetes 1.26.0 集群部署Prometheus监控

    前言 该存储库收集 Kubernetes 清单.Grafana仪表板和Prometheus 规则,结合文档和脚本,使用Prometheus Operator提供易于操作的端到端 Kubernetes ...

随机推荐

  1. C++中vector容器详解

    参考链接:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html 一.什么是vector? 向量(Vector)是一个封装了 ...

  2. CentOS7挂载webdav添加开机启动

    CentOS7挂载webdav添加开机启动 一.安装davfs2 yum install davfs2 二.挂载 1.新建挂载位置 mkdir -p /guazai chmod +x /guazai ...

  3. 精通 VS 调试技巧,学习与工作效率翻倍!

    ​ 欢迎大家来到贝蒂大讲堂 ​ 养成好习惯,先赞后看哦~ ​ 所属专栏:C语言学习 ​ 贝蒂的主页:Betty's blog ​ 1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预期的情 ...

  4. [转帖]聊聊字符串数据长度和nls_length_semantics参数

    字符串是我们设计数据库经常用到的类型,从传统的ASCII格式到UTF-8格式,不同应用需求对应不同的字符类型和长度配置.针对Oracle而言,最常用的类型无外乎char和varchar2两个基本类型. ...

  5. [转帖]sql server 索引阐述系列六 碎片查看与解决方案

    https://www.cnblogs.com/MrHSR/p/9365720.html 一 . dm_db_index_physical_stats 重要字段说明 1.1 内部碎片:是avg_pag ...

  6. [转帖]RAC AWR重要指标说明

    1.Global Cache Load Profile Global Cache blocks received:  接收到的全局缓冲块 Global Cache blocks served: 发送的 ...

  7. [转帖]decimal and numeric (Transact-SQL)

    https://learn.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-ser ...

  8. [转帖]MinIO系列7 - Minio性能压测

    https://www.zhihu.com/people/keen-wang 前言 声明:此文为本人历史笔记的整理,文章实际撰写时间为2021年2月份,所以本中所使用的相关组件版本较老.此文是通过压力 ...

  9. [转帖]20191022-从Jenkins NativeOOM到Java8内存

    我把老掉牙的Jenkins升级了,它跑了几天好好的:后来我有一个python脚本使用JenkinsAPI 0.3.9每隔2.5分钟发送约300余get请求,结果过了3天,它就挂了:当我开两个脚本时,4 ...

  10. [转帖]shell删除文件前几行或后几行

    https://www.cnblogs.com/1394htw/p/14852207.html shell删除文件前几行或后几行 #!/bin/bash #删除前两行 sed -i '1,2d' fi ...