kubernetes(k8s)自2014年9月推出以来已经经历了快8年,特别是近几年在国内一片大热,在所有容器编排工具中,几乎做到独占鳌头。在熟悉Kubernetes基本概念后,通过实际部署安装能够让初学者更加深刻的理解k8s的架构,以及各个组件的基础功能和工作方式。k8s和其它许多开源软件具有很大区别的一点就是安装,安装k8s的难度总体来说中等偏上,可以说这是让许多初学者止步的一个重要因素了。
一、安装k8s之前需要提前学习的知识:
二、k8s的发展历史以及k8s和Docker的关系
开始安装k8s之前需要简单了解一下k8s的发展历史以及k8s和Docker的关系,截至目前2023年7月20日,k8s已经更新至1.27.4版。从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.4。
三、软件、物理(硬件)基础
-
至少两台内存4g,2核CPU,磁盘40g的虚拟机,构建一个完整的k8s集群至少需要两台server,一台master,一台node节点。可以在网上购买云服务器,也可以自己创建。这里使用镜像为CentOS7-2009,也可以使用其它镜像,这里只是为了讲解方便; -
虚拟机工具推荐使用Oracle VM VirtualBox,免费,界面简洁易操作,并且支持中文;
请添加图片描述
-
SSH客户端推荐使用MobaXterm,免费版就足够使用了,支持语法高亮提示,支持MobaTextEditor文本编辑器,告别vi满屏一字一句修改(老眼昏花直接劝退)。
请添加图片描述
-
*(不推荐使用任何破解、公共许可等软件,尊重知识产权,个人使用无可厚非,在企业使用容易产生信息泄露及软件产权问题)
以上内容为介绍和环境要求,话不多说,直接开整。
四、构建虚拟机
这一步最关键的是配置虚拟机网络,这一步比较冗长,熟悉虚拟机构建及k8s网络通讯环境的可以直接跳过。1. 打开VirtualBox软件,点击新建。
请添加图片描述
-
输入虚拟机名称、存储路径、镜像位置,点击next。
请添加图片描述
2. 输入用户名、密码和Hostname,这里随便输,实际并不会生效,正真起作用的在后面,点击next。
请添加图片描述
3. 输入内存大小4096MB(4GB),2个CPU,点击next。
请添加图片描述
4. 输入磁盘大小40GB,点击next。
请添加图片描述
5. 直接点击Finish。
请添加图片描述
这样虚拟机就创建好了,但仅仅是创建好,还未完善配置。
6. 在使用虚拟机环境搭建k8s集群过程中,很多同学会因为虚拟机的ip地址相同的原因而导致集群创建失败,所以需要在VirtualBox的网络管理中心对Nat网络进行一下配置,点击管理→工具→Network Manager,老版本VirtualBox的Network Manager应该是在全局设定里,点击NAT Networks→创建,创建两个Nat网卡,注意一定要设置不同的ip地址,否则肯定会报错。
请添加图片描述
请添加图片描述
7. 找到刚刚创建的虚拟机master,鼠标右键点击设置
请添加图片描述
8. 这里可以看见刚刚为虚拟机赋予的所有属性,开始设置网络,这一步非常关键,直接决定后面虚拟机之间是否能够通讯,需要设置两张网卡,一张Host-Only网卡用于和主机之间进行通讯,一张Nat网络网卡用于访问公网,注意两台虚拟机选择不同的Nat网卡。
请添加图片描述
请添加图片描述
9. 打开网络设置,查看虚拟机网卡的网关,找到网络适配器页面→找到VirtualBox Host-Only网卡→右键点击状态→点击详情→找到网关地址,找个小本本记录下来,后面配置虚拟机ip地址网段要和网关一致,我这里的虚拟机网卡网关为192.168.56.10,故将两台虚拟机的Host-Only网卡的ip地址分别设置为192.168.56.50,192.168.56.51(在后续步骤进行设置)。
请添加图片描述
10. 现在可以打开虚拟机了,让新建的虚拟机先跑一会儿,过程有点多,很多步骤就不给出图片了,选择虚拟机镜像→点击重启。
11. 选择Install CentOS 7→设置语言,为了更好的兼容性建议选择英文,点击continue→设置日期时间,选择Asia, Shanghai,点击Done。
请添加图片描述
12. 点击INSTALLATION DESTINATION磁盘设置→选择一开始创建的40GB的磁盘,点击Done。
请添加图片描述
13. 点击KDUMP,取消勾选Enable kdump。
请添加图片描述
14. 点击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。
请添加图片描述
15. 点击Begin Installation→设置root账户(超级管理员)密码,太简单的话比如‘123456’需要点击两次Done→设置普通用户账户密码,同设置root用户,也可以选择不创建普通用户→进度条拉满之后点击Finish configuration→点击Reboot,虚拟机启动前的配置圆满完成。
请添加图片描述
16. 启动虚拟机,使用命令ip addr可以发现之前修改的enp0s3网卡的ip 192.168.1.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
请添加图片描述
请添加图片描述
17. 检测虚拟机网络是否畅通,可以使用最简单的ping方式,这里需要ping三个对象 ping www.baidu.com, ping 主机ip,ping 另一台虚拟机,三者都ping通说明虚拟机网络环境畅通,可以愉快的进行下一步了
请添加图片描述
五、通过SSH工具连接虚拟机
使用MobaXterm连接虚拟机,在完成虚拟机网络配置后,就可以通过MobaXterm连接虚拟机了,这样做可以非常便于上传文件,修改配置等操作。点击Session→SSH→在Remote host处输入虚拟机ip地址→Specify username输入用户名称→port 22→Session name 给当前Session取一个别名→点击OK,在输入参数无误的情况下会自动连接虚拟机并提示输入密码,输入当前用户的密码无误后即完成了虚拟机的远程连接。
请添加图片描述
请添加图片描述
六、安装Docker
容器运行时环境还是使用大家熟知的Docker,只是在k8s v1.24以后需要额外安装cri-dockerd, k8s才能够正常识别到Docker。这里也可以使用其它容器运行时工具,比如containerd, CRI-O等可以根据个人喜好使用,只是截至目前Docker在国内占的比重依然可以说是一枝独秀。安装Docker的方式有很多种,这是使用最简单的方式使用yum安装
-
在做一切之前,请先更新yum源,这可能会花费一点时间。
$ sudo yum update -y
2. 卸载旧版Docker,如果是新安装的虚拟机这一步就可以忽略了。
$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
3. 设置存储库,这里直接使用官方源不需要更换为国内源。
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
4. 安装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!
5. 启动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.
6. 通过运行映像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)
请添加图片描述
$ 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
2. 解压下载好的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%]
3. 重载系统守护进程→设置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相关组件镜像失败等情况……基本上一顿操作下来,能踩的坑都会踩一遍。解决网络问题实际有两种方法:
-
连接代理 (vpn),很多外企都会提供代理用以访问google和公司内网,如果有代理的话,能够避免99%的坑。但是绝大多数人没有这个条件,对于程序猿,个人建议还是准备一个这个东西,由于其它原因这里不做教学,在本节最后会介绍添加代理的位置。 -
更换国内源,这个也是普遍的做法,但是很多时候不能做到完全畅通,要么是教程时间太久,源已经失效,要么是没有把所有需要换源的地方都换掉。
闲话聊到这里,下面开始实践:
(一)、安装kubectl
kubectl是kubernetes的命令行工具,是操作、检查集群的重要组件。这里通过 curl 方式来安装 kubectl最新发行版v1.27.4。
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
2. 下载校验文件,验证 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
3. 安装 kubectl。
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
4. 测试安装是否成功和安装的版本,安装成功会返回一个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.4", GitCommit:"fa3d7990104d7c1f16943a67f11b154b71f6a132", GitTreeState:"clean", BuildDate:"2023-07-19T12:20:54Z", GoVersion:"go1.20.6", 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 # 查看所有开放的端口
2. 禁用SELinux。这一步必不可少,只有禁用SELinux之后容器才可以访问系统资源。
$ sudo setenforce 0
$ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
3. 安装 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
4. 执行安装,结果输出以下内容即为安装成功。
$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
Installed:
kubeadm.x86_64 0:1.27.4-0 kubectl.x86_64 0:1.27.4-0 kubelet.x86_64 0:1.27.4-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!
5. 设置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。
-
关闭swap分区,这里分为临时关闭和永久关闭,虚拟机环境推荐永久关闭,因为会经常开关机,反之云环境推荐临时关闭。
$ swapoff -a # 临时关闭swap分区
$ vi /etc/fstab # 永久关闭swap分区,注释掉fstab中包含swap的这一行即可
# /dev/mapper/centos-swap swap swap defaults 0 0
$ reboot #重启使其生效
2. 安装runc,这是Kubernetes必须要的运行环境。这里下载之后上传到server。
请添加图片描述
$ 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
3. 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组件状态
4. 检查hostname,node节点则对应修改为相应名称
$ cat /etc/hostname
k8s-master
$ vi /etc/hosts
192.168.56.50 k8s-master
192.168.56.51 k8s-node1
5. 转发 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 地址段,暂时不清楚的可以先不管就用这个值。
2. 安装配置网络插件——这里使用flannel,将kube-flannel.yml文件下载并上传到server上。
请添加图片描述
*这一步有大坑,我在官方没有找到相应的说明。因为我们这里使用到了两张网卡enp0s3和enp0s8,enp0s3是Host-Only网卡ip是不变的,enp0s8是Nat网卡并设置为了dhcp模式ip是会变的。如果不修改kube-flannel.yml直接apply的话,会导致flanneld无法将包发到正确的网卡,简单来说就是在一个pod中无法ping通另一台node中的pod。这里我们需要让flanneld包发到enp0s3去,数据包才能正常的经过
flannel
进行传送。那么具体怎么操作呢:需要修改kube-flannel.yml,添加–iface=enp0s3进行指定。参数位置如下:
container:
......
command:
- /opt/bin/flanneld
arg:
- --ip-masq
- --kube-subnet-mgr
- --iface=enp0s3
最后apply kube-flannel.yml文件。
$ 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
2. 执行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.
3. 在任意节点执行 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通http://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
2. 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" # 不需要走代理的地址,一般加上本地地址。
3. 执行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 # 手动一个一个拉取镜像
其他步骤均参照国内普通环境安装即可。
最后一次更新:2023年7月20日17:45, Kubernetes官方以于2023年7月20日凌晨更新至v1.27.4。
来源:https://zhuanlan.zhihu.com/p/641521752
原文始发于微信公众号(运维贼船):Kubernetes最新版2023.07v1.27.4安装和集群搭建保姆级教程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/176606.html