阶段一:开发环境及版本

以下环境均来自官网:

本地宿主机环境: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. freeswitch的ACL规则

    概述 freeswitch是一款好用的VOIP开源软交换平台. VOIP公共网络中的安全问题是最重要的问题,我们必须对网络端口的访问权限做出限制. ACL全称Access Control List,意 ...

  2. .NET CORE实战项目之CMS 部署篇 思维导图

    .NET Core实战项目之CMS 第十七章 CMS网站系统的部署 如何优雅的利用Windows服务来部署ASP.NET Core程序

  3. Feign源码解析6:如何集成discoveryClient获取服务列表

    背景 我们上一篇介绍了feign调用的整体流程,在@FeignClient没有写死url的情况下,就会生成一个支持客户端负载均衡的LoadBalancerClient.这个LoadBalancerCl ...

  4. zipkin 与 sleuth 实现链路追踪

    本文为博主原创,转载请注明出处 1.Zipkin 与 Sleuth 简介 zipkin 的官网地址: https://zipkin.io/ Zipkin 和 Sleuth 都是由 Twitter 开源 ...

  5. [转帖]ss 输出格式说明

    ss 命令输出详解ss 全名socket statistics,是iproute2中的一员ss已经替代netstat,大热于江湖.但是关于ss命令输出的内容,是什么意思呢? [root@test]#  ...

  6. [转帖]【Kafka】(二)Kafka去Zookeeper化,kraft模式搭建

    1.简介 由于zookeeper慢慢的成了kafka的瓶颈,kafka提出了去zookeeper化的概念,并在2.8版本之后版本都包含了kraft模式,也就是不需要使用zookeeper了,目前这种模 ...

  7. [转帖]Intel“革命性”X86s架构,带来哪些颠覆及影响?

    https://www.eet-china.com/mp/a221822.html 英特尔发布了一份新的白皮书(Intel X86-S扩展架构规格),计划简化其处理器指令集架构(ISA).英特尔提供了 ...

  8. [转帖]CPU缓存行

    https://www.jianshu.com/p/e338b550850f CPU缓存 执行程序是靠运行CPU执行主存中代码,但是CPU和主存的速度差异是非常大的,为了降低这种差距,在架构中使用了C ...

  9. 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 ...

  10. [转贴]手把手教你 GitLab 的安装及使用

    https://www.jianshu.com/p/b04356e014fa 前言 新入职公司,发现公司还在使用落后生产工具 svn,由于重度使用过 svn 和 git ,知道这两个工具之间的差异,已 ...