在学习kubernetes/k8s的时候,需要搭建一个学习环境。可以用官方提供的模拟器,不过由于是模拟器,有些东西和实际还是有区别的。下面通过虚拟机来进行搭建。

创建虚拟机

multipass是ubuntu的一个轻量级虚拟机,占用资源比较小,本次就选择multipass。

通过multipass来创建和管理虚拟机节点,官方地址https://multipass.run/,安装后分别创建三个虚拟机

#注意maste的至少需要2V2G,不然启动不起来
$ multipass launch -n master -c 2 -m 2G -d 40G
$ multipass launch -n node1 -c 2 -m 1G -d 40G
$ multipass launch -n node2 -c 2 -m 1G -d 40G
#查看虚拟机列表
$ multipass list
Name                    State             IPv4             Image
master                  Running           172.26.69.30     Ubuntu 20.04 LTS
node1                   Running           172.26.70.162    Ubuntu 20.04 LTS
node2                   Running           172.26.71.167    Ubuntu 20.04 LTS

multipass的其他一些管理虚拟机的命令

# 启动实例
multipass start master
#进入节点
multipass shell master
# 停止实例
multipass stop master
# 删除实例(删除后,还会存在)
multipass delete master
# 释放实例(彻底删除),释放占用的空间
multipass purge

每个节点安装kubernetes所需的基础组件

然后分别进入每个节点执行如下操作

安装containerd

安装containerd,由于kubernetes已经改用containerd而不是docker,这里安装containerd

安装必要依赖

#进入节点
$ multipass shell master
#更新源
$ sudo apt-get update
$ sudo apt-get install -y ca-certificates curl gnupg lsb-release

添加 GPG 密钥

$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

设置 apt 仓库

$ echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装containerd

#安装containerd
$ sudo apt-get update
$ sudo apt-get install -y containerd.io
# 锁定 containerd.io 版本,可选
$ sudo apt-mark hold containerd.io

启用 cri 和 systemd

$ containerd config default | sudo tee /etc/containerd/config.toml

找到下面的配置项并修改。

[plugins."io.containerd.grpc.v1.cri"]sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"...[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]...[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = true

重启 containerd 并设置 containerd 自启动。

$ sudo systemctl restart containerd.service
$ sudo systemctl enable containerd.service

安装kubeadm kubelet kubectl等组件

#首先,为系统添加K8s GPG key:
$ sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add
# 然后添加下面的安装源:
$sudo apt-add-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"
#安装k8s的重要组件
$ sudo apt-get install kubeadm kubelet kubectl -y

其他配置,有些不执行可能也没啥影响,不过尽量都执行下,避免遇到奇怪的问题

# 禁用swap
$ sudo swapoff -a
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo modprobe br_netfilter
$ sudo echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables

master配置

初始化master,下面的操作只在master上做

$ sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.25.0 --pod-network-cidr=172.26.0.1/16
# 如果上面的命令执行失败,可以通过kubeadm reset命令重置,解决问题后重试

执行成功后,最后会出现如下内容,记住复制一下,其他节点加入的时候执行该命令即可,执行时如果没有权限,加上sudo即可

kubeadm join 172.26.69.30:6443 --token 9cqm3d.0udl95kfp9kkb41p \--discovery-token-ca-cert-hash sha256:20cbd3d899af003c3b73ef736ea720f9cffd23e3292fe354e33dd12619af2492

配置 kubectl

初始化master初始化完成后,会提示如下内容,对于maste节点,直接执行就行

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$  sudo chown $(id -u):$(id -g) $HOME/.kube/config

对于work节点,如果需要执行kubectl命令,也需要执行上面的操作,由于没有/etc/kubernetes/admin.conf 文件,需要从master上拷贝该文件,可以新建一个,直接拷贝内容就行,然后执行上面的命令

执行成功后,在对应节点执行如下命令都是正常的,否则会报下面的错误

ubuntu@master:~$ kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?

安装kube-flannel

kube-flannel是kubenertes的网络管理组件,需要安装后master才能和各个节点正常通讯,如果不安装该组件,则通过 kubectl get nodes看到的节点都是NotReady状态

kube-flannel可以通过如下命令安装,不过由于需要翻墙,而且需要修改网络设置等问题,不推荐这种安装方式

#不推荐,需要翻墙,而且网络部分需要修改,建议将文件下载下来修改后再安装
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

可以上github下载该文件,其他地方下载的可能不是最新的,安装后容易出各种问题,下载地址

https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml

文件下载后,需要修改网络设置部分,如下,Network网段的值修改成初始化master时的 --pod-network-cidr一样即可

  net-conf.json: |{"Network": "172.26.0.0/16","Backend": {"Type": "vxlan"}}

修改后,执行如下命令安装 kube-flannel组件即可

$ kubectl apply -f kube-flannel.yml

安装完成后,需要检查kube-flannel是否正常运行,可以通过如下命令查看pod的状态

#查看所有的pod,看其中kube-flannel相关的pod是否状态异常
$ kubectl get pod -A

异常情况

NAMESPACE      NAME                             READY   STATUS              RESTARTS       AGE
kube-flannel   kube-flannel-ds-h2zjz            1/1     Running             2 (14s ago)    81s
kube-flannel   kube-flannel-ds-pbhgw            0/1     CrashLoopBackOff    6 (111s ago)   8m53s
kube-system    coredns-c676cc86f-bctmt          0/1     ContainerCreating   0              37m

其中kube-flannel-ds-pbhgw 的状态是CrashLoopBackOff,表示异常,可以查看日志

#查看日志
$ kubectl logs kube-flannel-ds-pbhgw  -n kube-flannel

如果出现如下问题

Error registering network: failed to acquire lease: subnet "10.244.0.0/16" specified in the flannel net config doesn't contain "172.26.0.0/24" PodCIDR of the "master" node.

说明是网络配置出现问题,需要修改kube-flannel.yml 文件中的Network的值,参见上面的修改网络设置部分,然后执行kubectl apply -f kube-flannel.yml ,应用后需要等一段时间,再查看pod是否变成Running状态

数据节点加入

在各个数据节点上执行节点命令,将节点加入集群中,该命令在主节点初始化完成后会有提示

$ sudo kubeadm join 172.26.69.30:6443 --token 9cqm3d.0udl95kfp9kkb41p \--discovery-token-ca-cert-hash sha256:20cbd3d899af003c3b73ef736ea720f9cffd23e3292fe354e33dd12619af2492

验证

查看节点列表

在主节点执行如下命令

$ kubectl get nodes
#结果如下,可以看到节点都连上了
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   58m   v1.25.0
node1    Ready    <none>          17m   v1.25.0
node2    Ready    <none>          88s   v1.25.0

部署ningx测试集群

#创建集群
$ kubectl create deployment nginx  --image=nginx:1.14-alpine
#暴露端口
$ kubectl expose deploy nginx  --port=80 --target-port=80  --type=NodePort
#查看服务
$ kubectl get svc
#输出如下
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        90m
nginx        NodePort    10.101.33.142   <none>        80:31812/TCP   6m33s
#可以看到服务端口是31812

可以通过浏览器分别访问如下地址测试是否都正常

http://172.26.69.30:31812
http://172.26.70.162:31812
http://172.26.71.167:31812

后记

以下全是废话,如果您比较忙的或者不想看的话,可以直接跳过。

不得不说,kubernets环境的搭建还是挺麻烦的,坑有点多,如果学习用,刚开始的时候还是通过Minikube来搭建比较方便。

不过由于Minikube是模拟环境,可能有些东西不一样,所以我想搭建一个类似生产的环境。而由于资源有限,所以选择在本机进行搭建。一开始的想法是通过docker来进行搭建。在docker里面安装docker来进行部署,但是问题比较多,比如在docker里运行ubuntu等系统,然后在里面在安装docker时出现安装完无法启动的问题。而docker:dind虽然能在docker里面运行docker,但由于外层的系统太过精简,什么都干不了,自己重新配置安装系统也很老火。于是就只能走虚拟机这条路了。

虚拟机方案虽然占用的资源比较多,但胜在稳定,网上相应的资料也多。而之所以选择multipass,是因为他足够轻量,在我的这个渣渣机器上能够跑起来三个节点(由于kubernetes的节点资源有要求)。multipass只能运行ubuntu系统,不过对于我们这个场景来说,已经够了。

kubernets以前的版本是兼容docker的,按网上的文章做了一遍,发现kubeadm init 的时候,一直有个地方卡住,具体记不清了,通过详细日志查看,卡在一个请求api server接口的地方,40秒超时。后来经过排查,发现是我安装的1.25不兼容docker了,导致kubernets的 相关组件运行不起来。

于是又将docker卸载掉,换成了containerd,据说可以通过安装一个中间层cri-docker来使kubernets能使用docke,不过没试过。感觉不如直接安装containerd省事。

kube-flannel的安装也是几经波折,由于官方地址https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml需要翻墙无法访问,于是就在网上搜索该文件,有的博主比较好心,把该文件贴在网上,我直接复制下来使用,于是坑就来了,安装后kube-flannel的几个pod死活启动不起来,查看日志发现问题如下

 Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-amd64-6qrrv': pods "kube-flannel-ds-amd64-6qrrv" is forbidden: User "system:serviceaccount:kube-system:flannel" cannot get resource "pods" in API group "" in the namespace "kube-system"

看起来是权限的问题,由于不熟悉kubernets的权限管理问题,网上找了下,也没找到靠谱的方案。后来想想可能是版本的问题,又找到github,找到最新的文件,重试之后就可以了。

还有kube-flannel.yml是需要修改里面的网络部分的网段的,网上一般没说这个。如果不修改的花,一样会报错,你部署的服务也会启动不起来。

经过一番折腾后,kubernets在本地虚拟机上的集群总算是搭建起来了。不过由于每个人实际的情况和环境不一样。再加上各种组件的版本都在更新。网上的文档只能做参考,比如我写这篇文章时,这个搭建流程在我本地是可用的。但当你看到时,可能时过境迁,早已物逝人非,你一路搭建下来,可能会遇到很多我不曾遇到过的问题。就如我现在看别人的文章,别人没踩到的坑,我就踩到了,这时需要多搜多看,综合各种方案,最后才能形成一套可行的搭建流程。另外,官网也是一个重要的参考,遇事多看官网资料总没错。

-----------------------------------------------------------------------------------------------------------------------------------2022-09-10 中秋

基于本地虚拟机搭建k8s集群相关推荐

  1. 本地虚拟机搭建k8s集群完整篇

    1.安装前置条件 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 一台或多台机器[本人是三个,一个master,两个node],操作系统 CentOS7.x-86_x64 硬件配置 ...

  2. 基于VMWare虚拟机搭建Linux集群

    基于VMWare虚拟机搭建Linux集群 1.虚拟机的安装 2.下载CentOS系统 3.虚拟机安装CentOS系统 4.虚拟机和本机文件通信 5.虚拟机网络配置 6.本机物理机下载Xshell连接操 ...

  3. 在一台物理机上创建3个虚拟机搭建k8s集群(一)

    2019年10月7日,参考链接: https://blog.csdn.net/qq_38252499/article/details/99214276 https://blog.csdn.net/cn ...

  4. 简单快速-虚拟机搭建K8S集群

    0>. 虚拟机需要固定IP :etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO=dhcp 改成: BOOTPROTO= static IPA ...

  5. 搭建k8s集群几个常用方法

    没搭建过,肯定要尝试! kubeadm 1.13就GA了,general availability,表标明广泛使用 kubeadm最大杀手锏是代码放在k8s源码中 kubeadm二进制的子功能分割,可 ...

  6. 1主2从基于GKE搭建k8s集群-无需科学上网

    1主2从基于GKE搭建k8s集群-无需科学上网 1.安装docker: 2.搭建k8s集群: 2.1.组件版本 2.1.修改hosts文件 2.3.部署前基础前提配置 2.4.部署kubeadm, k ...

  7. 搭建k8s集群完整流程,云服务器、虚拟机均可参考

    一.机器准备 本次搭建k8s集群采用三台云服务器,master节点最好采用2核2G以上的机器,node节点不作要求 二.开始搭建 1.机器 | 角色     | IP           | | -- ...

  8. Linux云计算虚拟化-使用rancher搭建k8s集群并发布电商网站

    文章目录 Linux云计算虚拟化-使用Rancher搭建k8s集群并使用lnmp架构发布电商网站 1. Rancher介绍 2. 使用Rancher搭建k8s集群 2.1 实验环境介绍 2.2 在ra ...

  9. 【云原生-K8s】kubeadm搭建k8s集群

    搭建K8s集群[无需科学上网] 官网:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kub ...

最新文章

  1. AI一分钟|欧盟将对Google开出天价罚单;智能家居制造商Nest并入Google;沃尔玛与微软合作挑战AWS...
  2. 央视首位AI手语主播亮相,动作精确、实时转译,网友:能接住广权的段子么?...
  3. Slackware硬盘安装方法
  4. 图解用Scientific Toolworks Understand分析Microsoft DirectX SDK (June 2010)自带D3D示例
  5. leetcode 594. Longest Harmonious Subsequence | 594. 最长和谐子序列
  6. (转)走进AngularJs(六) 服务
  7. webkit中对incomplete type指针的处理技巧
  8. 同步与异步以及线程与进程
  9. 如何解决线程安全问题?有几种方式?synchronized与lock有什么异同?
  10. 基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)
  11. 顶饰条行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  12. xcodebuild -exportArchive -allowProvisioningUpdates
  13. 微软推补丁服务器,[图]微软再推稳定性补丁 为即将到来功能更新做准备
  14. Windows 10 开启代理软件代理流量之后,系统的某些自带软件无法联网
  15. 微信小程序:人生重开模拟器
  16. 计算机应用基础网上作业2,华东理工 计算机应用基础(本)网上作业2
  17. 软件测试面试题: B/S、C/S、OA 什么意思?
  18. 使用canvas 代码画小猪佩奇
  19. 最新YGBOOK小说站源码/全自动采集+已修BUG
  20. STL容器系列文章:array容器

热门文章

  1. polygon NFT开发教程
  2. window7取消文件默认打开方式的方法
  3. Wannafly挑战赛20 A 染色(暴力/思维)
  4. Python 编程1000例(5):拿鸡蛋问题和回文数问题
  5. Node.js项目中动态加载环境变量配置
  6. 全球区块链农业技术平台Dimitra与 Morpheus AMA回顾
  7. 计算机主机配置有哪些,组装电脑配置推荐有哪些
  8. 怎么用计算机管理你的外卖订单,外卖系统怎么确定收到订单 外卖接单软件怎么做...
  9. 游戏厂商必看:游戏音效验收标准
  10. 《黑头人》(暂定)开发日志