Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程

Kubenetes安装和集群搭建保姆级教程

kubernetes(k8s)自2014年9月推出以来已经经历了快8年,特别是近几年在国内一片大热,在所有容器编排工具中,几乎做到独占鳌头。在熟悉Kubernetes基本概念后,通过实际部署安装能够让初学者更加深刻的理解k8s的架构,以及各个组件的基础功能和工作方式。k8s和其它许多开源软件具有很大区别的一点就是安装,安装k8s的难度总体来说中等偏上,可以说这是让许多初学者止步的一个重要因素了。

一、安装k8s之前需要提前学习的知识:

  • 具备基础的Linux系统操作能力;
  • 熟悉Docker等容器(container)工具的使用,了解Docker在多节点多集群模式下的痛点;
  • 具备基础的网络编程知识;

二、k8s的发展历史以及k8s和Docker的关系

开始安装k8s之前需要简单了解一下k8s的发展历史以及k8s和Docker的关系,截至目前2023年6月29日,k8s已经更新至1.27.3版。从v1.24起,Docker不能直接作为k8s的容器运行时,因为在k8s v1.24版本移除了叫dockershim的组件,这是由k8s团队直接维护而非Docker团队维护的组件,这意味着Docker和k8s的关系不再像原来那般亲密,开发者需要使用其它符合CRI(容器运行时接口)的容器运行时工具(如containerd, CRI-O等),当然这并不意味着新版本的k8s彻底抛弃Docker(由于Docker庞大的生态和广泛的群众基础,显然这并不容易办到),在原本安装了Docker的基础上,可以通过补充安装cri-dockerd,以满足容器运行时接口的条件,从某种程度上说,cri-dockerd就是翻版的dockershim。然而目前网上绝大多数k8s的教程依然停留在v1.24甚至v1.18以前,这无疑是对小菜同学的巨大考验,奔着买新不买旧的原则,直接上最新版v1.27.3。

三、软件、物理(硬件)基础

  • 至少两台内存4g,2核CPU,磁盘40g的虚拟机,构建一个完整的k8s集群至少需要两台server,一台master,一台node节点。可以在网上购买云服务器,也可以自己创建。这里使用镜像为CentOS7-2009,也可以使用其它镜像,这里只是为了讲解方便;

  • 虚拟机工具推荐使用Oracle VM VirtualBox,免费,界面简洁易操作,并且支持中文;
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第1张图片

  • SSH客户端推荐使用MobaXterm,免费版就足够使用了,支持语法高亮提示,支持MobaTextEditor文本编辑器,告别vi满屏一字一句修改(老眼昏花直接劝退)。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第2张图片

  • *(不推荐使用任何破解、公共许可等软件,尊重知识产权,个人使用无可厚非,在企业使用容易产生信息泄露及软件产权问题)

以上内容为介绍和环境要求,话不多说,直接开整。

四、构建虚拟机

这一步最关键的是配置虚拟机网络,这一步比较冗长,熟悉虚拟机构建及k8s网络通讯环境的可以直接跳过。

  1. 打开VirtualBox软件,点击新建。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第3张图片

  2. 输入虚拟机名称、存储路径、镜像位置,点击next。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第4张图片

  3. 输入用户名、密码和Hostname,这里随便输,实际并不会生效,正真起作用的在后面,点击next。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第5张图片

  4. 输入内存大小4096MB(4GB),2个CPU,点击next。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第6张图片

  5. 输入磁盘大小40GB,点击next。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第7张图片

  6. 直接点击Finish。Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第8张图片
    这样虚拟机就创建好了,但仅仅是创建好,还未完善配置。

  7. 在使用虚拟机环境搭建k8s集群过程中,很多同学会因为虚拟机的ip地址相同的原因而导致集群创建失败,所以需要在VirtualBox的网络管理中心对Nat网络进行一下配置,点击管理→工具→Network Manager,老版本VirtualBox的Network Manager应该是在全局设定里,点击NAT Networks→创建,创建两个Nat网卡,注意一定要设置不同的ip地址,否则肯定会报错。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第9张图片
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第10张图片

  8. 找到刚刚创建的虚拟机master,鼠标右键点击设置
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第11张图片

  9. 这里可以看见刚刚为虚拟机赋予的所有属性,开始设置网络,这一步非常关键,直接决定后面虚拟机之间是否能够通讯,需要设置两张网卡,一张Host-Only网卡用于和主机之间进行通讯,一张Nat网络网卡用于访问公网,注意两台虚拟机选择不同的Nat网卡。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第12张图片
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第13张图片

  10. 打开网络设置,查看虚拟机网卡的网关,找到网络适配器页面→找到VirtualBox Host-Only网卡→右键点击状态→点击详情→找到网关地址,找个小本本记录下来,后面配置虚拟机ip地址网段要和网关一致,我这里的虚拟机网卡网关为192.168.56.10,故将两台虚拟机的Host-Only网卡的ip地址分别设置为192.168.56.50,192.168.56.51(在后续步骤进行设置)。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第14张图片

  11. 现在可以打开虚拟机了,让新建的虚拟机先跑一会儿,过程有点多,很多步骤就不给出图片了,选择虚拟机镜像→点击重启。

  12. 选择Install CentOS 7→设置语言,为了更好的兼容性建议选择英文,点击continue→设置日期时间,选择Asia, Shanghai,点击Done。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第15张图片

  13. 点击INSTALLATION DESTINATION磁盘设置→选择一开始创建的40GB的磁盘,点击Done。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第16张图片

  14. 点击KDUMP,取消勾选Enable kdump。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第17张图片

  15. 点击NETWORK & HOST NAME→将两张网卡enp0s3和enp0s8的状态都设置为ON,设置Host name,这里为了方便区分master和node,将两台虚拟机分别设置为k8s-master和k8s-node1,后续可以增加node2,node3….…→选择网卡enp0s3,这里需要对Host Only网卡进行配置,点击Configure…,点击IPv4 Settings,修改Method为Manual手动,添加一个Address设置ip地址,子网掩码和网关,子网掩码和网关需和上一步中主机上面的VirtualBox Host-Only网卡一致,ip地址的前三位也要一致,这里设置为192.168.56.50,点击save→点击Done。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第18张图片

  16. 点击Begin Installation→设置root账户(超级管理员)密码,太简单的话比如‘123456’需要点击两次Done→设置普通用户账户密码,同设置root用户,也可以选择不创建普通用户→进度条拉满之后点击Finish configuration→点击Reboot,虚拟机启动前的配置圆满完成。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第19张图片

  17. 启动虚拟机,使用命令ip addr可以发现之前修改的enp0s3网卡的ip 192.168.56.50并未显示出来,说明网卡的配置还未完全正确执行命令vi /etc/sysconfig/network-scripts/ifcfg-enp0s3修改配置,修改BOOTPROTO=static, DEFROUTE=no, ONBOOT=yes, 重启网络systemctl restart network, 再次使用命令ip addr发现enp0s3网卡之前配置的ip地址显示出来了。

$ vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
PROXY_METHOD=no
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=no
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=01f42cd6-3670-450e-be7c-eb3ec71b0d59
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.56.50
PREFIX=24
GATEWAY=192.168.56.1
IPV6_PRIVACY=no

$ systemctl restart network
$ ip addr

Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第20张图片
Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第21张图片
18. 检测虚拟机网络是否畅通,可以使用最简单的ping方式,这里需要ping三个对象 ping www.baidu.com, ping 主机ip,ping 另一台虚拟机,三者都ping通说明虚拟机网络环境畅通,可以愉快的进行下一步了
Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第22张图片

五、通过SSH工具连接虚拟机

使用MobaXterm连接虚拟机,在完成虚拟机网络配置后,就可以通过MobaXterm连接虚拟机了,这样做可以非常便于上传文件,修改配置等操作。点击Session→SSH→在Remote host处输入虚拟机ip地址→Specify username输入用户名称→port 22→Session name 给当前Session取一个别名→点击OK,在输入参数无误的情况下会自动连接虚拟机并提示输入密码,输入当前用户的密码无误后即完成了虚拟机的远程连接。
Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第23张图片
Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第24张图片

六、安装Docker

容器运行时环境还是使用大家熟知的Docker,只是在k8s v1.24以后需要额外安装cri-dockerd, k8s才能够正常识别到Docker。这里也可以使用其它容器运行时工具,比如containerd, CRI-O等可以根据个人喜好使用,只是截至目前Docker在国内占的比重依然可以说是一枝独秀。安装Docker的方式有很多种,这是使用最简单的方式使用yum安装

  1. 在做一切之前,请先更新yum源,这可能会花费一点时间。
$ sudo yum update -y
  1. 卸载旧版Docker,如果是新安装的虚拟机这一步就可以忽略了。
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  1. 设置存储库,这里直接使用官方源不需要更换为国内源。
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装Docker (Engine) 及其它依赖库。
$ sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Installed:
  containerd.io.x86_64 0:1.6.21-3.1.el7      docker-buildx-plugin.x86_64 0:0.10.5-1.el7       docker-ce.x86_64 3:24.0.2-1.el7
  docker-ce-cli.x86_64 1:24.0.2-1.el7        docker-compose-plugin.x86_64 0:2.18.1-1.el7

Dependency Installed:
  audit-libs-python.x86_64 0:2.8.5-4.el7                             checkpolicy.x86_64 0:2.5-8.el7
  container-selinux.noarch 2:2.119.2-1.911c772.el7_8                 docker-ce-rootless-extras.x86_64 0:24.0.2-1.el7
  fuse-overlayfs.x86_64 0:0.7.2-6.el7_8                              fuse3-libs.x86_64 0:3.6.1-4.el7
  libcgroup.x86_64 0:0.41-21.el7                                     libseccomp.x86_64 0:2.3.1-4.el7
  libsemanage-python.x86_64 0:2.5-14.el7                             policycoreutils-python.x86_64 0:2.5-34.el7
  python-IPy.noarch 0:0.75-6.el7                                     setools-libs.x86_64 0:3.3.8-4.el7
  slirp4netns.x86_64 0:0.4.3-4.el7_8

Complete!
  1. 启动Docker,设置开机自启动,查看Docker状态为active (running) 即为启动成功。
$ sudo systemctl start docker
$ sudo systemctl enable docker
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2023-07-01 11:45:16 CST; 32s ago
     Docs: https://docs.docker.com
 Main PID: 10843 (dockerd)
   CGroup: /system.slice/docker.service
           └─10843 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jul 01 11:45:16 k8s-master systemd[1]: Starting Docker Application Container Engine...
Jul 01 11:45:16 k8s-master dockerd[10843]: time="2023-07-01T11:45:16.343206349+08:00" level=info msg="Starting up"
Jul 01 11:45:16 k8s-master dockerd[10843]: time="2023-07-01T11:45:16.383523101+08:00" level=info msg="Loading containers: start."
Jul 01 11:45:16 k8s-master dockerd[10843]: time="2023-07-01T11:45:16.860114525+08:00" level=info msg="Firewalld: interface ...rning"
Jul 01 11:45:16 k8s-master dockerd[10843]: time="2023-07-01T11:45:16.933380446+08:00" level=info msg="Loading containers: done."
Jul 01 11:45:16 k8s-master dockerd[10843]: time="2023-07-01T11:45:16.957435554+08:00" level=info msg="Docker daemon" commit...24.0.2
Jul 01 11:45:16 k8s-master dockerd[10843]: time="2023-07-01T11:45:16.957573990+08:00" level=info msg="Daemon has completed ...ation"
Jul 01 11:45:16 k8s-master systemd[1]: Started Docker Application Container Engine.
Jul 01 11:45:16 k8s-master dockerd[10843]: time="2023-07-01T11:45:16.986717670+08:00" level=info msg="API listen on /run/do....sock"
Hint: Some lines were ellipsized, use -l to show in full.
  1. 通过运行映像hello-world,验证 Docker 引擎安装是否成功。
$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

至此,Docker已经成功安装。

七、安装cri-dockerd

  1. 官方给出的安装方式为git下载,还需要先准备git环境,有点麻烦不是很推荐。直接通过下载最新版cri-dockerd rpm包,网络条件好的话直接使用wget下载,网络条件一般的话可以在github上面先下载再上传到虚拟机,下载地址:Releases · Mirantis/cri-dockerd (github.com)。什么,gitHub也访问不了?那先睡一觉再说……开个玩笑而已,遇到困难并不可怕,这是每个人的必经之路。遇到GitHub打不开的朋友请参考:GitHub:无法访问此网站,一个简单的解决办法-知乎 (zhihu.com)
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第25张图片
$ sudo yum install -y wget # 新安装虚拟机需要先安装wget
$ sudo wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el7.x86_64.rpm # 通过wget下载最新版cri-dockerd
  1. 解压下载好的rpm文件
$ rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:cri-dockerd-3:0.3.4-3.el7        ################################# [100%]
  1. 重载系统守护进程→设置cri-dockerd自启动→启动cri-dockerd
$ sudo systemctl daemon-reload # 重载系统守护进程
$ sudo systemctl enable cri-docker.socket cri-docker # 设置cri-dockerd自启动
$ sudo systemctl start cri-docker.socket cri-docker # 启动cri-dockerd
$ sudo systemctl status cri-docker.socket
● cri-docker.socket - CRI Docker Socket for the API
   Loaded: loaded (/usr/lib/systemd/system/cri-docker.socket; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2023-07-01 12:20:14 CST; 11s ago
   Listen: /run/cri-dockerd.sock (Stream)sudo systemctl start cri-docker.socket cri-docker
$ sudo systemctl status cri-docker
● cri-docker.service - CRI Interface for Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/cri-docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2023-07-01 12:20:14 CST; 16s ago
     Docs: https://docs.mirantis.com
 Main PID: 15889 (cri-dockerd)
    Tasks: 7
   Memory: 12.7M
   CGroup: /system.slice/cri-docker.service
           └─15889 /usr/bin/cri-dockerd --container-runtime-endpoint fd://

至此cri-dockerd安装成功。

八、*安装Kubernetes

关于kubernetes的安装,实际上官方给出了非常详细的教程,但是官方的中文文档阅读起来显得非常的晦涩,中国人看国外写的汉字就是感觉怪怪的哈哈,就像外国人读中国人写的通过google翻译后的文章。其实在国内安装Kubernetes最大的问题还是网络问题,网络不够通畅,就会导致yum拉取镜像失败、使用docker下载k8s相关组件镜像失败等情况……基本上一顿操作下来,能踩的坑都会踩一遍。解决网络问题实际有两种方法:

  1. 连接代理 (),很多外企都会提供代理用以访问google和公司内网,如果有代理的话,能够避免99%的坑。但是绝大多数人没有这个条件,对于程序猿,个人建议还是准备一个这个东西,由于其它原因这里不做教学,在本节最后会介绍添加代理的位置。
  2. 更换国内源,这个也是普遍的做法,但是很多时候不能做到完全畅通,要么是教程时间太久,源已经失效,要么是没有把所有需要换源的地方都换掉。

闲话聊到这里,下面开始实践:

(一)、安装kubectl

kubectl是kubernetes的命令行工具,是操作、检查集群的重要组件。这里通过 curl 方式来安装 kubectl最新发行版v1.27.3。

  1. 通过命令行下载。
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   138  100   138    0     0     85      0  0:00:01  0:00:01 --:--:--    85
100 46.9M  100 46.9M    0     0  1613k      0  0:00:29  0:00:29 --:--:-- 2097k
  1. 下载校验文件,验证 kubectl 的可执行文件。
$ curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   138  100   138    0     0    105      0  0:00:01  0:00:01 --:--:--   105
100    64  100    64    0     0     31      0  0:00:02  0:00:02 --:--:--    31
$ echo "$(cat kubectl.sha256)  kubectl" | sha256sum --check
kubectl: OK
  1. 安装 kubectl。
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
  1. 测试安装是否成功和安装的版本,安装成功会返回一个WARNING,这是正常的,只要版本输出是正确的就说明kubectl安装成功。
$ kubectl version --client
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"27", GitVersion:"v1.27.3", GitCommit:"25b4e43193bcda6c7328a6d147b1fb73a33f1598", GitTreeState:"clean", BuildDate:"2023-06-14T09:53:42Z", GoVersion:"go1.20.5", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v5.0.1

(二)、安装kubeadm

kubeadm是创建和管理kubernetes集群的工具,安装过程有些复杂,这一步也是踩坑最多的一步。

  1. 为了防止在安装过程中因为端口未开放而造成启动失败的问题,虚拟机建议直接关闭防火墙,云服务器的话至少开启6443和其它端口。
$ sudo systemctl stop firewalld # 关闭防火墙
$ sudo systemctl disable firewalld # 关闭防火墙自启动
# 以上关闭防火墙和开启端口二选一,建议直接关闭防火墙
$ sudo firewall-cmd --zone=public --add-port=6443/tcp --permanent # 开启6443端口
$ sudo firewall-cmd --reload # 重新加载防火墙
$ sudo firewall-cmd --zone=public --list-ports # 查看所有开放的端口
  1. 禁用SELinux。这一步必不可少,只有禁用SELinux之后容器才可以访问系统资源。
$ sudo setenforce 0
$ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  1. 安装 kubeadm、kubelet 和 kubectl,配置yum文件,因为国内无法直接访问google,这里需要将官网中的google的源改为国内源,以阿里云为例:
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
  1. 执行安装,结果输出以下内容即为安装成功。
$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

Installed:
  kubeadm.x86_64 0:1.27.3-0                  kubectl.x86_64 0:1.27.3-0                  kubelet.x86_64 0:1.27.3-0

Dependency Installed:
  conntrack-tools.x86_64 0:1.4.4-7.el7        cri-tools.x86_64 0:1.26.0-0                 kubernetes-cni.x86_64 0:1.2.0-0
  libnetfilter_cthelper.x86_64 0:1.0.0-11.el7 libnetfilter_cttimeout.x86_64 0:1.0.0-7.el7 libnetfilter_queue.x86_64 0:1.0.2-2.el7_2
  socat.x86_64 0:1.7.3.2-2.el7

Complete!
  1. 设置kubelet自启动
sudo systemctl enable --now kubelet

恭喜你,自此Kubernetes的组件kubectl, kubeadm和kubelet安装完成,步骤其实并不多,但每一步都需要仔细谨慎。

九、*搭建Kubernetes集群

以上所有的幸苦都是在为了这一步做准备,假设你已经完成了上面的一切,总结一下此时你应该具备以下条件:

  • 2台ip不相同的server(虚拟机/云服务器),并且相互能够进行通讯,也能访问外网,此处分别为192.168.56.50,192.168.56.51。
  • 2台server都安装了容器运行时(Docker + cri-dockerd),已经安装kubernetes组件kubectl, kubeadm和kubelet。

(一)、环境准备

*这一步应该在所有node上完成,包括master。

  1. 关闭swap分区,这里分为临时关闭和永久关闭,虚拟机环境推荐永久关闭,因为会经常开关机,反之云环境推荐临时关闭。
$ swapoff -a # 临时关闭swap分区
$ vi /etc/fstab # 永久关闭swap分区,注释掉fstab中包含swap的这一行即可
# /dev/mapper/centos-swap swap                    swap    defaults        0 0
$ reboot #重启使其生效
  1. 安装runc,这是Kubernetes必须要的运行环境。这里下载之后上传到server。
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第26张图片
$ sudo install -m 755 runc.amd64 /usr/local/bin/runc # 安装runc
$ runc -v # 检查是否安装成功
runc version 1.1.7
commit: v1.1.7-0-g860f061b
spec: 1.0.2-dev
go: go1.20.3
libseccomp: 2.5.4
  1. Docker和cri-dockerd设置国内镜像加速。
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://tsvqojsz.mirror.aliyuncs.com"]
}
EOF
$ vi /usr/lib/systemd/system/cri-docker.service # 找到第10行ExecStart= 修改为
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
$ systemctl daemon-reload && systemctl restart docker cri-docker.socket cri-docker # 重启Docker组件,这个地方是个小技巧,连写会方便很多
$ systemctl status docker cir-docker.socket cri-docker # 检查Docker组件状态
  1. 检查hostname,node节点则对应修改为相应名称
$ cat /etc/hostname
k8s-master
$ vi /etc/hosts
192.168.56.50 k8s-master
192.168.56.51 k8s-node1
  1. 转发 IPv4 并让 iptables 看到桥接流
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

lsmod | grep br_netfilter
lsmod | grep overlay

sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

# 如果init时仍提示iptables错误请执行
echo "1">/proc/sys/net/bridge/bridge-nf-call-iptables
echo "1">/proc/sys/net/ipv4/ip_forward

(二)、*初始化控制平面节点/Master

注意了,这一步是最最关键的一步,也是最容易出错的一步,如果这一步执行成功了,就基本上宣布我们的k8s集群可以顺利搭建完成了,前面一步的环境准备也是为了这一步能够成功执行。

  1. 执行初始化命令,这一步只在master执行。
    执行初始化可以通过配置文件的形式,也可以直接通过命令行的形式,因为配置文件的参数过多反而有可能让初学者们不知所措,所以这里直接采用命令行的方式进行初始化。
$ kubeadm init --node-name=k8s-master --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=192.168.56.50 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
# ......
# ......,恭喜你,看到以下内容就说明Master初始化成功了!!
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.56.50:6443 --token vn1kky.ikxktdgqv0ntmof1 \
        --discovery-token-ca-cert-hash sha256:b416f1d5d388fec1133b7c3c8960c84f27b51d35efbc8b8e0fac223f649ba73d

# 非root用户请执行
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
# root用户直接执行
$ export KUBECONFIG=/etc/kubernetes/admin.conf # 临时生效,重启后失效,不推荐。
$ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>  ~/.bash_profile # 永久生效,执行kubeadm reset后再次init也无需再次执行这条命令
$ source ~/.bash_profile # 执行永久生效命令之后需要source一下使其生效
$ echo $KUBECONFIG # 检测配置是否生效
/etc/kubernetes/admin.conf

将kubeadm join这一段用一个文本文档记下,后面node节点执行加入就是依靠这一条指令。
*本人经过多次尝试,以下参数一个也不能少:

--image-repository=registry.aliyuncs.com/google_containers # 将下载容器镜像源替换为阿里云,否则因为网络原因会导致镜像拉不下来,一定会执行不成功。
--cri-socket=unix:///var/run/cri-dockerd.sock # 这是指定容器运行时,因为containerd也是Docker的组件之一,下载Docker会一并将containerd下载下来,在执行初始化时当Kubernetes检测到有多个容器运行时环境,就必须要手动选择一个。这里也可以看出containerd实际上比Docker更轻量得多。
--apiserver-advertise-address=192.168.56.50 # 为API server设置广播地址,这里选择本机的ipv4地址,这里不希望API SERVER设置在其他node上的话就不要改为其他地址。
--pod-network-cidr=10.244.0.0/16 # 指明 pod 网络可以使用的 IP 地址段,暂时不清楚的可以先不管就用这个值。
--service-cidr=10.96.0.0/12 # 为服务的虚拟 IP 地址另外指定 IP 地址段,暂时不清楚的可以先不管就用这个值。
  1. 安装配置网络插件——这里使用flannel,这一步在node节点上也需要完成。
    需要先安装CNI插件,这里通过这个链接下载并上传到server上,用同样的方式将kube-flannel.yml文件下载上传到server上
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第27张图片
    Kubenetes最新版2023.07v1.27.3安装和集群搭建保姆级教程_第28张图片
$ mkdir -p /opt/cni/bin
$ tar -C /opt/cni/bin -xzf cni-plugins-linux-amd64-v1.3.0.tgz

$ kubectl apply -f kube-flannel.yml # 为Kubernetes配置flannel网络插件
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

$ cat /run/flannel/subnet.env # 没有这个文件或文件夹的话则需要手动创建,内容同下
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

(三)、Node节点加入Master

  1. 在执行join指令前还需要将master节点上的/etc/kubernetes/admin.conf拷贝到node节点上,在局域网状态下,可以使用scp命令快速高效地完成两个节点之间的文件传输。
# 格式:scp ${current_server_path}/file_name target_server_ip:${target_server_path} 
$ scp /etc/kubernetes/admin.conf 192.168.56.51:/etc/kubernetes/

# 到node节点检查admin.conf文件是否传输完成
$ cd /etc/kubenetes
$ ls
admin.conf  manifests
$ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>  ~/.bash_profile # 不要忘记将admin.conf加入环境变量,这里直接使用永久生效。
$ source ~/.bash_profile

如果第1步操作遗漏掉了的话,在执行get nodes的时候会收到以下错误:

$ kubectl get nodes
E0704 21:50:22.095009   28309 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0704 21:50:22.099568   28309 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0704 21:50:22.104090   28309 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
  1. 执行join指令,如果出现代码中的结果,那么恭喜你,加入节点成功。如果执行失败,请检查上述环境配置中是否在node中有遗漏的操作。
$ kubeadm join 192.168.56.50:6443 --token vn1kky.ikxktdgqv0ntmof1 \
>         --discovery-token-ca-cert-hash sha256:b416f1d5d388fec1133b7c3c8960c84f27b51d35efbc8b8e0fac223f649ba73d --cri-socket=unix:///var/run/cri-dockerd.sock
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
  1. 在任意节点执行 kubectl get nodes。如果节点都是ready的话说明整个集群状态是正常的。同时通过kubectl get pod指令查看所有pod是否正常,正常状态下,所有pod的状态都应是Running。
$ kubectl get nodes
NAME         STATUS   ROLES           AGE     VERSION
k8s-master   Ready    control-plane   3h40m   v1.27.3
k8s-node1    Ready    <none>          3m53s   v1.27.3
$ kubectl get pod -A
NAMESPACE      NAME                                 READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-4mr9z                1/1     Running   0          162m
kube-flannel   kube-flannel-ds-8ml75                1/1     Running   0          14m
kube-system    coredns-7bdc4cb885-8mx78             1/1     Running   0          3h50m
kube-system    coredns-7bdc4cb885-gtdnk             1/1     Running   0          3h50m
kube-system    etcd-k8s-master                      1/1     Running   0          3h50m
kube-system    kube-apiserver-k8s-master            1/1     Running   0          3h50m
kube-system    kube-controller-manager-k8s-master   1/1     Running   0          3h50m
kube-system    kube-proxy-glbwc                     1/1     Running   0          3h50m
kube-system    kube-proxy-rlv5j                     1/1     Running   0          14m
kube-system    kube-scheduler-k8s-master            1/1     Running   0          3h50m

恭喜你,达成这一步一个简单的Kubernetes集群就已经搭建起来了!软件之路,学习永无止境。今日你的神通又加深了一分!但是要真正体验一个具备负载均衡、调度等功能的Kuberbetes集群的话至少需要两个Node(三台server)才行,请根据自己的硬件条件做出合理的选择。

十、有代理的情况下如何搭建Kubernetes集群

这一节仅作参考,如果有错误还请指出。
在有代理的情况下,事情就变得简单许多了,影响最大的一个方面就是不用更换镜像源了,直接照着官方文档来就行了,但如何配置代理,这是一个问题。
首先需要明确的是,在有代理的情况下,主机是可以连接外网的,也就是能访问google,但是虚拟机在不加任何配置的情况下一定是无法ping通www.google.com的,也就是虽然我们的主机可以连接外网,但是虚拟机不行。那有的同学就要问了,那不就跟上面所说的一样吗,有什么区别吗?这还真有区别,我曾经就是这样认为的,结果在执行kubeadm init的时候死活不行。这里直接上结论:**在主机配置代理了的情况下,将镜像源替换为阿里云或国内其他源是行不通的,在进行DNS连接的时候会被拒绝。正确的做法是虚拟机要和主机保持一致:在执行相应步骤的时候需要加上代理。**下面一一讲解需要配置代理的地方。

  1. 在执行yum下载kubeadm、kubelet、kubectl的时候yum源使用官方给出镜像即可,修改/etc/yum.conf,在最后添加proxy=Address:Port,否则会拉不下来。
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
proxy=http://Address:Port
  1. Docker配置代理,并去除上述在/etc/docker/deamon.json和/usr/lib/systemdsystem/cri-docker.service配置的国内镜像源加速。配置代理的做法有多种,这里举例一种:在/etc/systemd/system/docker.service.d/中创建proxy.conf文件。
$ cd /etc/systemd/system/docker.service.d # 不存在目录的话自行创建
$ vi proxy.conf
[Service]
Environment="HTTP_PROXY=http://Address:Port"
Environment="HTTPS_PROXY=http://Address:Port" # 和HTTP_PROXY一致。
Environment="NO_PROXY=localhost,127.0.0.1,.example.com" # 不需要走代理的地址,一般加上本地地址。
  1. 执行kubeadm init的时候去掉参数–image-repository=……,这个时候就会走docker配置的代理了,如果报镜像拉不下来的问题可以尝试手动下载。
$ kubeadm config images list # 查看执行kubeadm init所需镜像
registry.k8s.io/kube-apiserver:v1.27.3
registry.k8s.io/kube-controller-manager:v1.27.3
registry.k8s.io/kube-scheduler:v1.27.3
registry.k8s.io/kube-proxy:v1.27.3
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.7-0
registry.k8s.io/coredns/coredns:v1.10.1
$ docker pull registry.k8s.io/kube-apiserver:v1.27.3 # 手动一个一个拉取镜像

其他步骤均参照国内普通环境安装即可。


支持原创,转载请注明出处。

你可能感兴趣的:(云原生,kubernetes,docker,云原生)