K8s集群安装

K8s集群安装

一、准备环境

1.1虚拟机配置要求

​ 在VMware开通3台虚拟机,虚拟机配置均一样。新手不建议使用克隆,如使用克隆需记得需改其他虚拟机的MAC地址,否则网络不能互通。
在这里插入图片描述

1.2软件环境

软件版本
操作系统CentOS Linux release 7.9.2009 (Core)
DockerVersion: 25.0.2
kubernetes1.23

1.3网络规划

节点IP地址
k8smaster192.168.5.10
k8snode1192.168.5.11
k8snode2192.168.5.12
apiserver-advertise-address 集群通告地址(master 机器IP)192.168.5.10
service-cidr 集群内部虚拟网络,Pod统一访问入口10.96.0.0/12
pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致10.244.0.0/16
1.3.1修改3台VM虚拟机的主机名
[root@localhost ~]# hostnamectl set-hostname k8smaster

[root@localhost ~]# hostnamectl set-hostname k8snode1

[root@localhost ~]# hostnamectl set-hostname k8snode2

完成上述修改后,需要重启系统以使更改生效

[root@localhost ~]# reboot

查看主机名(以k8smaster为例)

[root@k8smaster ~]# cat /etc/hostname
k8smaster
1.3.2配置3台VM虚拟机的主机名解析
#在3台VM虚拟机的hosts文件中添加主机名和IP地址信息,便于主机名解析,以k8smaster为例
[root@k8smaster ~]# vim /etc/hosts
#添加内容如下
[root@k8smaster ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.5.10 k8smaster
192.168.5.11 k8snode1
192.168.5.12 k8snode2
1.3.3设置VM虚拟机之间联网并能相互ping通

打开vmware虚拟机,我们可以在选项栏的“编辑”下的“虚拟网络编辑器”中看到VMnet0(桥接模式)、VMnet1(仅主机模式)、VMnet8(NAT模式),其中VMnet0表示的是用于桥接模式下的虚拟交换机;VMnet1表示的是用于仅主机模式下的虚拟交换机;VMnet8表示的是用于NAT模式下的虚拟交换机。本此实验需3台虚拟机互通且联网,故选择VMnet8。3台虚拟机的网络适配器设置如下:

在这里插入图片描述
查看网关信息

在这里插入图片描述

1.3.4配置3台VM虚拟机的IP地址
1.3.4.1查看VM虚拟机的网卡信息

在这里插入图片描述

ens33上面没有IP地址信息,需要根据vmnet8的网卡信息进行设置

1.3.4.2配置ens33网卡参数(以k8smaster为例)

将ens33的地址获取方式切换为静态,设置为开机启动并配置网关、掩码、DNS等信息

[root@k8smaster ~]# cd /etc/sysconfig/network-scripts
[root@k8smaster network-scripts]# ls
ifcfg-ens33  ifdown-ipv6    ifdown-TeamPort  ifup-ippp   ifup-routes       kubectl
ifcfg-lo     ifdown-isdn    ifdown-tunnel    ifup-ipv6   ifup-sit          network-functions
ifdown       ifdown-post    ifup             ifup-isdn   ifup-Team         network-functions-ipv6
ifdown-bnep  ifdown-ppp     ifup-aliases     ifup-plip   ifup-TeamPort
ifdown-eth   ifdown-routes  ifup-bnep        ifup-plusb  ifup-tunnel
ifdown-ib    ifdown-sit     ifup-eth         ifup-post   ifup-wireless
ifdown-ippp  ifdown-Team    ifup-ib          ifup-ppp    init.ipv6-global
[root@k8smaster network-scripts]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
#配置信息如下
[root@k8smaster network-scripts]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
...... #未修改部分内容省略
BOOTPROTO=static
...... #未修改部分内容省略
ONBOOT=yes
IPADDR=192.168.5.10   #其他节点按规划表修改此IP地址
PREFIX=24
GATEWAY=192.168.5.2
DNS1=192.168.5.2

tips:

BOOTPROTO=static: 这指定了网络接口使用静态IP地址配置,而不是从DHCP服务器自动获取。

ONBOOT=yes: 这意味着在系统启动时,该网络接口将被激活。如果设置为no,则网络接口不会在启动时自动激活。

IPADDR=192.168.5.10: 这是分配给该网络接口的静态IP地址。

PREFIX=24: 这是子网掩码的前缀长度。PREFIX=24等价于子网掩码255.255.255.0。

GATEWAY=192.168.5.2: 这是用于该网络接口的默认网关的IP地址。

DNS1=192.168.5.2: 这是用于该网络接口的首选DNS服务器的IP地址。

1.3.4.3重启网络并查看网络状态
[root@k8smaster network-scripts]# systemctl restart network
[root@k8smaster network-scripts]# systemctl status network
● network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
   Active: active (exited) since Mon 2024-02-12 09:06:46 EST; 12s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 25348 ExecStop=/etc/rc.d/init.d/network stop (code=exited, status=0/SUCCESS)
  Process: 25568 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)

Feb 12 09:06:43 k8smaster systemd[1]: Stopped LSB: Bring up/down networking.
Feb 12 09:06:43 k8smaster systemd[1]: Starting LSB: Bring up/down networking...
Feb 12 09:06:45 k8smaster network[25568]: Bringing up loopback interface:  [  OK  ]
Feb 12 09:06:45 k8smaster network[25568]: Bringing up interface ens33:  Connection successfully .../4)
Feb 12 09:06:46 k8smaster network[25568]: [  OK  ]
Feb 12 09:06:46 k8smaster systemd[1]: Started LSB: Bring up/down networking.
Hint: Some lines were ellipsized, use -l to show in full.
#查看网卡IP信息
[root@k8smaster network-scripts]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:50:56:36:eb:6e brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.10/24 brd 192.168.5.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::ad31:e4c9:aeda:fd4d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

1.3.4.4测试节点上网能力
[root@k8smaster network-scripts]# ping www.baidu.com
PING www.a.shifen.com (183.2.172.42) 56(84) bytes of data.
64 bytes from 183.2.172.42 (183.2.172.42): icmp_seq=1 ttl=128 time=28.8 ms
64 bytes from 183.2.172.42 (183.2.172.42): icmp_seq=2 ttl=128 time=29.0 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 28.889/28.966/29.043/0.077 ms
1.3.4.5三个节点配置完成后,测试节点之间的互通性
[root@k8smaster network-scripts]# ping k8snode2 -c 4
PING k8snode2 (192.168.5.12) 56(84) bytes of data.
64 bytes from k8snode2 (192.168.5.12): icmp_seq=1 ttl=64 time=0.394 ms
64 bytes from k8snode2 (192.168.5.12): icmp_seq=2 ttl=64 time=0.258 ms
64 bytes from k8snode2 (192.168.5.12): icmp_seq=3 ttl=64 time=0.597 ms
64 bytes from k8snode2 (192.168.5.12): icmp_seq=4 ttl=64 time=0.546 ms

--- k8snode2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.258/0.448/0.597/0.135 ms

1.4安装辅助软件

1.4.1安装vim(3节点均安装)
[root@k8smaster ~]# yum install vim -y
1.4.2 安装图形化界面(主节点)
1.4.2.1安装图形用户接口X Window System
[root@k8smaster ~]# yum groupinstall "X Window System"
Loaded plugins: fastestmirror
....
Complete!
1.4.2.2安装GNOME桌面
[root@k8smaster ~]# yum groupinstall "GNOME Desktop"
Loaded plugins: fastestmirror
...
Complete!
1.4.2.3测试可视化桌面
#进入可视化桌面
[root@k8smaster ~]# startx

1.5同步时间(3节点均设置)

[root@k8smaster ~]# systemctl start chronyd
[root@k8smaster ~]# systemctl enable chronyd
[root@k8smaster ~]# date
Mon Feb 12 09:49:34 EST 2024

1.6禁用selinux和关闭firewalld服务(3节点均设置)

1.6.1禁用selinux(3节点均设置)
[root@k8smaster ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config #重启后生效

sed 是一个流编辑器,用于对输入流(例如文件或管道)进行基本的文本转换。

-i:这个选项告诉sed直接在文件中进行编辑,而不是只输出修改后的结果到标准输出(通常是终端)。
‘s/enforcing/disabled/’:这是一个sed的替换命令。s代表替换操作,enforcing是要被替换的文本,disabled是替换后的文本。因此,这个命令会将文件中的所有enforcing文本替换为disabled。
/etc/selinux/config:这是要被编辑的文件的路径。/etc/selinux/config文件通常包含SELinux(Security-Enhanced Linux)的配置信息。

1.6.2关闭firewalld服务(3节点均设置)
[root@k8smaster ~]# systemctl stop firewalld
[root@k8smaster ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@k8smaster ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

Feb 12 16:27:02 k8snode3 systemd[1]: Starting firewalld - dynamic firewall daemon...
Feb 12 16:27:03 k8snode3 systemd[1]: Started firewalld - dynamic firewall daemon.
Feb 12 16:27:03 k8snode3 firewalld[702]: WARNING: AllowZoneDrifting is enabled. This is conside...now.
Feb 12 10:02:26 k8snode3 systemd[1]: Stopping firewalld - dynamic firewall daemon...
Feb 12 10:02:27 k8snode3 systemd[1]: Stopped firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.

1.7禁用swap分区(3节点均设置)

交换分区的配置。kubelet 的默认行为是在节点上检测到交换内存时无法启动。 kubelet 自 v1.22 起已开始支持交换分区。自 v1.28 起,仅针对 cgroup v2 支持交换分区; kubelet 的 NodeSwap 特性门控处于 Beta 阶段,但默认被禁用。
如果 kubelet 未被正确配置使用交换分区,则你必须禁用交换分区。 例如,sudo swapoff -a 将暂时禁用交换分区。要使此更改在重启后保持不变,请确保在如 /etc/fstab、systemd.swap 等配置文件中禁用交换分区,具体取决于你的系统如何配置。

#注释掉/dev/mapper/centos-swap swap 
[root@k8smaster ~]# vim /etc/fstab 

#修改后内容如下
[root@k8smaster ~]# cat /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Mon Feb 12 15:58:14 2024
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=5030d875-1ed9-4968-8fc3-3f4aef585655 /boot                   xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0  

#重启后生效
[root@k8smaster ~]# reboot   

/dev/mapper/centos-swap: 这是交换空间的设备文件路径。在 CentOS 中,如果使用了 LVM(Logical Volume Manager),那么交换空间可能是一个逻辑卷,它的路径通常在 /dev/mapper/ 目录下。这里的 centos-swap 是逻辑卷的名称。

swap: 第一个 swap 表明这个分区是一个交换分区。

swap: 第二个 swap 是该分区的类型,指定为交换分区。

defaults: 这是挂载选项,defaults 通常包括 rw(读写)、suid(允许 set-user-identifier 或 set-group-identifier 位)、dev(解释块特殊设备)、exec(允许执行二进制文件)、auto(自动挂载)、nouser(仅允许超级用户挂载)、和 async(异步 I/O)。

0: 这是文件系统检查的顺序。对于交换空间,这个数字通常是 0,表示不进行文件系统检查。

0: 这是 dump 备份的优先级。对于交换空间,这个数字也通常是 0,表示不备份。

1.8添加网桥过滤和地址转发功能(3节点均设置)

在Linux系统上配置内核参数,以便与Kubernetes集群兼容。具体步骤如下:

cat > /etc/sysctl.d/kubernetes.conf << EOF: 这个命令是用来创建或覆盖/etc/sysctl.d/kubernetes.conf文件,并将接下来的内容写入这个文件,直到遇到EOF为止。

net.bridge.bridge-nf-call-ip6tables = 1: 这个参数确保当桥接的数据包通过IPv6防火墙规则时,会调用ip6tables。这对于Kubernetes的网络桥接来说是必要的。
net.bridge.bridge-nf-call-iptables = 1: 这个参数确保当桥接的数据包通过IPv4防火墙规则时,会调用iptables。这对于Kubernetes的网络桥接来说是必要的。
net.ipv4.ip_forward = 1: 这个参数允许系统转发IPv4数据包。这对于Kubernetes的节点来说是必要的,因为节点需要转发Pod之间的流量。
EOF: 这个标记表示输入结束,所有在此之前的内容都将被写入到/etc/sysctl.d/kubernetes.conf文件中。

sysctl --system: 在将新的配置参数写入/etc/sysctl.d/kubernetes.conf文件后,执行这个命令将应用这些更改。sysctl --system会读取/etc/sysctl.d/目录下的所有配置文件,并应用其中定义的内核参数设置。

[root@k8smaster ~]# cat > /etc/sysctl.d/kubernetes.conf << EOF
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> net.ipv4.ip_forward = 1
> EOF

[root@k8smaster ~]# sysctl --system  
* Applying /usr/lib/sysctl.d/00-system.conf ...
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
kernel.kptr_restrict = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /usr/lib/sysctl.d/60-libvirtd.conf ...
fs.aio-max-nr = 1048576
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/kubernetes.conf ...
net.ipv4.ip_forward = 1
* Applying /etc/sysctl.conf ...

1.9docker安装(3节点均安装)

1.9.1添加 Docker CE的 YUM 仓库镜像地址
[root@k8smaster ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror, langpacks
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo

yum-config-manager 是 YUM 包管理器的一个工具,用于管理 YUM 仓库的配置文件。–add-repo 参数表示要添加一个新的 YUM 仓库。

http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 是阿里云的 Docker CE YUM 仓库的 URL。这个仓库包含了 Docker CE 的 RPM 包,使得用户可以通过 YUM 直接安装、更新和删除 Docker。

当执行这条命令后,YUM 会从给定的 URL 下载仓库的配置文件,并将其放置在 /etc/yum.repos.d/ 目录下。之后,你就可以使用 yum 命令来安装、更新 Docker CE 了。

1.9.2安装Docker CE
[root@k8smaster ~]# yum install docker-ce -y
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
........
Installed:
  docker-ce.x86_64 3:25.0.3-1.el7                                                                     

Dependency Installed:
  container-selinux.noarch 2:2.119.2-1.911c772.el7_8    containerd.io.x86_64 0:1.6.28-3.1.el7         
  docker-buildx-plugin.x86_64 0:0.12.1-1.el7            docker-ce-cli.x86_64 1:25.0.3-1.el7           
  docker-ce-rootless-extras.x86_64 0:25.0.3-1.el7       docker-compose-plugin.x86_64 0:2.24.5-1.el7   
  fuse-overlayfs.x86_64 0:0.7.2-6.el7_8                 fuse3-libs.x86_64 0:3.6.1-4.el7               
  slirp4netns.x86_64 0:0.4.3-4.el7_8                   

Complete!

相关依赖会自动安装

1.9.3设置docker开机启动
[root@k8smaster ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@k8smaster ~]# systemctl start docker
[root@k8smaster ~]# docker info
Client: Docker Engine - Community
 Version:    25.0.3
 Context:    default
.....
 Cgroup Driver: cgroupfs
......

Docker 在默认情况下使用的 Cgroup Driver 为 cgroupfs

1.9.4修改 Docker Cgroup Driver 为 systemd

在 Linux 上,控制组(CGroup)用于限制分配给进程的资源。

kubelet 和底层容器运行时都需要对接控制组来强制执行 为 Pod 和容器管理资源 并为诸如 CPU、内存这类资源设置请求和限制。若要对接控制组,kubelet 和容器运行时需要使用一个 cgroup 驱动。 关键的一点是 kubelet 和容器运行时需使用相同的 cgroup 驱动并且采用相同的配置,否则 kubelet 进程会失败。

由于 kubeadm 把 kubelet 视为一个系统服务来管理,所以对基于 kubeadm 的安装, 我们推荐使用 systemd 驱动,不推荐 cgroupfs 驱动。

1.9.4.1停止docker和docker.socket服务
[root@k8smaster ~]# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
  docker.socket
[root@k8smaster ~]# systemctl stop docker.socket
[root@k8smaster ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Tue 2024-02-13 08:04:49 EST; 29s ago
     Docs: https://docs.docker.com
  Process: 30910 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=0/SUCCESS)
 Main PID: 30910 (code=exited, status=0/SUCCESS)
.....
1.9.4.2修改启动参数
[root@k8smaster ~]# vim /etc/docker/daemon.json 
[root@k8smaster ~]# cat /etc/docker/daemon.json 
{ 	
  "exec-opts": ["native.cgroupdriver=systemd"], 	
  "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}

“exec-opts”: [“native.cgroupdriver=systemd”]:这个选项用于设置 Docker daemon 的执行选项。具体来说,它配置了 Docker 使用的 cgroup(控制组)驱动。“native.cgroupdriver=systemd” 表示 Docker 将使用 systemd 作为其 cgroup 驱动。

“registry-mirrors”: [“https://kn0t2bca.mirror.aliyuncs.com”]:这个选项用于配置 Docker 的镜像源镜像(mirror)。Docker 默认会从 Docker Hub 上拉取镜像,“https://kn0t2bca.mirror.aliyuncs.com” 是一个阿里云的 Docker 镜像源地址。当您尝试从 Docker Hub 或其他 registry 拉取镜像时,Docker 会首先尝试从这个镜像源拉取。如果镜像源中没有这个镜像,Docker 才会去原始的 registry 拉取。

1.9.4.3重启docker并检验是否生效
[root@k8smaster ~]# sudo systemctl daemon-reload
[root@k8smaster ~]# sudo systemctl restart docker
[root@k8smaster ~]# docker info
Client: Docker Engine - Community
 Version:    25.0.3
......
 Logging Driver: json-file
 Cgroup Driver: systemd
......

sudo systemctl daemon-reload 是一个用于重新加载 systemd 系统和服务管理守护程序(systemd daemon)配置的命令。当你修改了 systemd 的服务单元文件(通常以 .service 结尾)或者修改了 systemd 的配置文件后,需要运行这个命令来让 systemd 知道这些更改,并重新加载配置。如果不重新加载,可能导致docker无法正常启动。

二、部署Kubernetes集群

2.1切换kubernetes镜像源为国内源(3节点均设置)

[root@k8smaster ~]# cat > /etc/yum.repos.d/kubernetes.repo << EOF
> [kubernetes]
> name=Kubernetes
> baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
> enabled=1
> gpgcheck=0
> repo_gpgcheck=0
> gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
> EOF

在 Linux 系统中创建了一个名为 kubernetes.repo 的新文件在 /etc/yum.repos.d/ 目录下。这个文件是一个 YUM 仓库配置文件,用于指定 Kubernetes 的软件包源。这个文件的内容使得系统可以使用 yum 或 dnf(取决于你的系统版本)来安装 Kubernetes 相关的软件包。

下面是每一行的解释:

[kubernetes]:定义一个名为 kubernetes 的仓库。
name=Kubernetes:为这个仓库命名为 “Kubernetes”。
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64:指定仓库的基础 URL,这里使用的是阿里云的 Kubernetes 镜像。
enabled=1:启用这个仓库。
gpgcheck=0:不检查软件包的 GPG 签名。
repo_gpgcheck=0:不检查仓库的 GPG 签名。
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg:指定 GPG 密钥的 URL,但由于上面 gpgcheck 和 repo_gpgcheck 都设置为 0,所以这些密钥实际上不会被用来验证软件包的签名。
<< EOF 和 EOF 之间的内容是 Here Document 的内容,它们被用作 cat 命令的输入,以创建或覆盖 /etc/yum.repos.d/kubernetes.repo 文件。

2.2安装 kubeadm、kubelet 和 kubectl(3节点均设置)

需要在每台机器上安装以下的软件包:

kubeadm:用来初始化集群的指令。

kubelet:在集群中的每个节点上用来启动 Pod 和容器等。

kubectl:用来与集群通信的命令行工具。

[root@k8smaster ~]# yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.bfsu.edu.cn
 * updates: mirrors.aliyun.com
....
Installed:
  kubeadm.x86_64 0:1.23.0-0        kubectl.x86_64 0:1.23.0-0        kubelet.x86_64 0:1.23.0-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!

# 设置kubelet开机启动
[root@k8smaster ~]# systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.

# 确认一下是否正常启动
[root@k8smaster ~]# systemctl start kubelet
[root@k8smaster ~]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Wed 2024-02-14 02:59:04 EST; 2s ago
     Docs: https://kubernetes.io/docs/
 Main PID: 2488 (kubelet)
    Tasks: 11
   Memory: 94.0M
   CGroup: /system.slice/kubelet.service
           └─2488 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-...

2.3初始化 Kubernetes master 节点

2.3.1初始化Kubernetes control-plane
[root@k8smaster ~]# kubeadm init \
>   --apiserver-advertise-address=192.168.5.10 \
>   --image-repository registry.aliyuncs.com/google_containers \
>   --kubernetes-version v1.23.0 \
>   --service-cidr=10.96.0.0/12 \
>   --pod-network-cidr=10.244.0.0/16 \
>   --ignore-preflight-errors=all
[init] Using Kubernetes version: v1.23.0
......
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

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.5.10:6443 --token l6k6d5.stv3n0nksr43o7wb \
	--discovery-token-ca-cert-hash sha256:b84bd86ae00f3d9a84f6e0e12e636e078f81af3674f69a8ad0c6835b5af2cdd0 

参数解释:

–apiserver-advertise-address=192.168.5.10: 指定 API 服务器的监听地址。通常是 master 节点的 IP 地址。

–image-repository registry.aliyuncs.com/google_containers: 指定用于拉取 Kubernetes 镜像的仓库地址。这里使用的是阿里云上的 Google Containers 镜像仓库。

–kubernetes-version v1.23.0: 指定要安装的 Kubernetes 版本,这里是 v1.23.0。

–service-cidr=10.96.0.0/12: 指定服务(Service)的 CIDR(无类别域间路由)范围。这是 Kubernetes 用于分配集群内部服务 IP 地址的范围。

–pod-network-cidr=10.244.0.0/16: 指定 Pod 网络的 CIDR 范围。这是 Kubernetes 用于分配 Pod IP 地址的范围。具体的 Pod 网络解决方案(如 Calico、Flannel 等)将使用这个范围来配置网络。

–ignore-preflight-errors=all: 忽略所有预检查错误。通常,kubeadm init 在开始之前会执行一系列预检查,以确保系统配置符合 Kubernetes 的要求。使用这个选项会跳过这些检查,并可能导致不稳定的集群配置。在生产环境中,应该避免使用这个选项,除非你确定知道你在做什么,并且确实需要忽略这些检查。

这个命令执行完成后,kubeadm 会配置 Kubernetes 的各个组件,并生成一个 kubeconfig 文件,该文件包含了连接到集群所需的配置信息。通常,这个文件会被保存在 ~/.kube/config 路径下,并且会被设置为默认的 kubectl 配置。

这个命令只初始化了 master 节点。要创建一个完整的 Kubernetes 集群,还需要在 worker 节点上运行 kubeadm join 命令,以将这些节点加入到集群中。

2.3.2设置主节点Kubernetes 集群用户配置

设置Kubernetes 集群用户配置,以便用户能够使用 kubectl 命令与集群进行交互。

[root@k8smaster ~]# mkdir -p $HOME/.kube
[root@k8smaster ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8smaster ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

mkdir -p $HOME/.kube:
mkdir 命令用于创建一个目录。
-p 参数表示如果父目录不存在,那么会一并创建父目录。
H O M E / . k u b e 是 K u b e r n e t e s 配置文件存放的默认目录。 HOME/.kube 是 Kubernetes 配置文件存放的默认目录。 HOME/.kubeKubernetes配置文件存放的默认目录。HOME 是一个环境变量,它表示当前用户的主目录(home directory)的路径。这个主目录通常是用户存储个人文件和配置的地方,只有用户自己有权限访问(除非具有特殊的系统权限)。

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config:
cp 命令用于复制文件。
-i 参数在复制前会询问是否覆盖目标位置的已存在文件。
/etc/kubernetes/admin.conf 是 Kubernetes 集群的管理员配置文件,它包含了连接到集群所需的凭据。
$HOME/.kube/config 是目标位置,即将 admin.conf 文件复制到的位置。

sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config:
chown 命令用于更改文件的所有者和/或所属组。
$(id -u) 获取当前用户的用户ID。
$(id -g) 获取当前用户的组ID。
sudo 用于以超级用户权限执行命令,这是因为更改文件的所有者通常需要更高的权限。

#查看是否创建成功
[root@k8smaster ~]# cd $HOME/.kube/
[root@k8smaster .kube]# ls
config

2.4节点加入集群

节点是你的工作负载(容器和 Pod 等)运行的地方。要将新节点添加到集群,需对node1和node2执行以下操作:

2.4.1将master节点的admin.conf文件拷贝到其他节点
#拷贝到node1
[root@k8smaster ~]# scp /etc/kubernetes/admin.conf root@192.168.5.11:/etc/kubernetes
The authenticity of host '192.168.5.11 (192.168.5.11)' can't be established.
ECDSA key fingerprint is SHA256:kpq+K/qfDrJ.........JXvPqZr8B4XDEAcT2UdblbPg.
ECDSA key fingerprint is MD5:5b:96:94:8f:f7.........:1b:73:53:8e:4b:00:0f:b7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.5.11' (ECDSA) to the list of known hosts.
root@192.168.5.11's password: 
admin.conf 

#拷贝到node2
[root@k8smaster ~]# scp /etc/kubernetes/admin.conf root@192.168.5.12:/etc/kubernetes
2.4.2设置节点的Kubernetes 集群用户配置

两个节点均需要设置

#以node1为例,node2的操作相同
[root@k8snode1 ~]# mkdir -p $HOME/.kube
[root@k8snode1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8snode1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8snode1 ~]# cd /root/.kube/
[root@k8snode1 .kube]# ls
config
[root@k8snode1 .kube]# cat config 
apiVersion: v1
clusters:
- cluster:
..........
c0ZZN1BCVlVCWmRsYU12VkJna3VhNXA5S1E9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
2.4.3执行加入集群

默认token有效期为24小时,如没有过期请直接使用2.3.1章节里面的命令进行加入操作;当过期之后,该token就不可用了,这时就需要在主节点重新创建token,可以直接使用命令快捷生成:

[root@k8smaster ~]# kubeadm token create --print-join-command
kubeadm join 192.168.5.10:6443 --token ukrxek.wqyn3jooci7lrc7s --discovery-token-ca-cert-hash sha256:5807bdbaa3ac3933f281994c1000ade9dbad000cc664730f4daa13fd5d4bdbb7 

两个节点均需要执行以下操作

#以node1为例,node2的操作相同
[root@k8snode1 ~]# kubeadm join 192.168.5.10:6443 --token ukrxek.wqyn3jooci7lrc7s --discovery-token-ca-cert-hash sha256:5807bdbaa3ac3933f281994c1000ade9dbad000cc664730f4daa13fd5d4bdbb7
[preflight] Running pre-flight checks
	[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 25.0.3. Latest validated version: 20.10
[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.

2.5部署容器网络(本文在主节点上部署Calico)

2.5.1下载网络组件calico配置文件
[root@k8smaster ~]# wget https://docs.projectcalico.org/v3.19/manifests/calico.yaml
--2024-02-15 02:41:12--  https://docs.projectcalico.org/v3.19/manifests/calico.yaml
Resolving docs.projectcalico.org (docs.projectcalico.org)... 13.228.199.255, 46.137.195.11, 2406:da18:b3d:e200::64, ...
Connecting to docs.projectcalico.org (docs.projectcalico.org)|13.228.199.255|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 189916 (185K) [text/yaml]
Saving to: ‘calico.yaml’

100%[====================================================================================================================================================>] 189,916      543KB/s   in 0.3s   

2024-02-15 02:41:13 (543 KB/s) - ‘calico.yaml’ saved [189916/189916]

2.5.2修改配置文件
[root@k8smaster ~]# vim calico.yaml 
......
# The default IPv4 pool to create on startup if none exists. Pod IPs will be
            # chosen from this range. Changing this value after installation will have
            # no effect. This should fall within `--cluster-cidr`.
            # - name: CALICO_IPV4POOL_CIDR
            #   value: "192.168.0.0/16"
            # Disable file logging so `kubectl logs` works.
......

取消# - name: CALICO_IPV4POOL_CIDR的注释,CALICO_IPV4POOL_CIDR的value与前面kubeadm init的–pod-network-cidr的值一样。

[root@k8smaster ~]# cat calico.yaml 
# The default IPv4 pool to create on startup if none exists. Pod IPs will be
            # chosen from this range. Changing this value after installation will have
            # no effect. This should fall within `--cluster-cidr`.
            - name: CALICO_IPV4POOL_CIDR
              value: "10.244.0.0/16"
            # Disable file logging so `kubectl logs` works.
2.5.3部署calico并验证加入情况

执行calico.yaml文件

[root@k8smaster ~]# kubectl apply -f calico.yaml

查看通信情况

[root@k8smaster ~]# kubectl get pods -A
NAMESPACE     NAME                                     READY   STATUS    RESTARTS       AGE
default       nginx-deployment-85b98978db-fpdp4        1/1     Running   0              23h
default       nginx-deployment-85b98978db-vtt4j        1/1     Running   0              22h
default       nginx-deployment-85b98978db-z9zpw        1/1     Running   0              22h
kube-system   calico-kube-controllers-d4bfdcb9-5tpnl   1/1     Running   6 (63m ago)    2d19h
kube-system   calico-node-9fv9d                        1/1     Running   40 (63m ago)   3d
kube-system   calico-node-ntwg8                        1/1     Running   4 (44m ago)    3d
kube-system   calico-node-wq5t7                        1/1     Running   3 (42m ago)    3d
kube-system   coredns-6d8c4cb4d-r5hv4                  1/1     Running   1 (63m ago)    23h
kube-system   coredns-6d8c4cb4d-wbmdn                  1/1     Running   15 (63m ago)   2d19h
kube-system   etcd-k8smaster                           1/1     Running   13 (63m ago)   3d17h
kube-system   kube-apiserver-k8smaster                 1/1     Running   14 (63m ago)   3d17h
kube-system   kube-controller-manager-k8smaster        1/1     Running   74 (63m ago)   3d17h
kube-system   kube-proxy-467hx                         1/1     Running   4 (63m ago)    3d2h
kube-system   kube-proxy-pvp4j                         1/1     Running   3 (42m ago)    3d2h
kube-system   kube-proxy-xgd29                         1/1     Running   4 (44m ago)    3d2h
kube-system   kube-scheduler-k8smaster                 1/1     Running   70 (63m ago)   3d17h

验证加入情况

[root@k8snode1 ~]# kubectl get nodes
NAME        STATUS   ROLES                  AGE     VERSION
k8smaster   Ready    control-plane,master   3d16h   v1.23.0
k8snode1    Ready    <none>                 3d2h    v1.23.0
k8snode2    Ready    <none>                 3d2h    v1.23.0

node1和node2都为Ready状态,说明节点加入集群成功。

三、部署nginx验证集群

3.1在集群中暴露 Pod

[root@k8smaster test]# vim nginx.yaml 
[root@k8smaster test]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx 
[root@k8smaster test]# kubectl apply -f nginx.yaml
[root@k8smaster test]# kubectl get pods 
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-85b98978db-fpdp4   1/1     Running   0          23h
nginx-deployment-85b98978db-vtt4j   1/1     Running   0          23h

3.2创建 Service

[root@k8smaster test]# vim nginx-server.yaml
apiVersion: v1
kind: Service #可以通过不同的方式对k8s集群服务进行访问
metadata:
  name: nginx-service
spec:
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30001 #把k8s集群中运行应用的80端口映射到30001端口
      protocol: TCP
  type: NodePort
  selector:
    app: nginx        #标签要一致
[root@k8smaster test]# kubectl apply -f nginx-server.yaml 
service/nginx-service configured
[root@k8smaster test]# kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-85b98978db-fpdp4   1/1     Running   0          23h
pod/nginx-deployment-85b98978db-vtt4j   1/1     Running   0          23h

NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP        3d17h
service/nginx-service   NodePort    10.99.156.21   <none>        80:30001/TCP   2d23h

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   2/2     2            2           2d23h

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-85b98978db   2         2         2       2d23h

3.3访问service

通过2个节点任何一个ip + port,都可以访问到nginx

[root@k8smaster test]# curl 192.168.5.11:30001
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

图形界面浏览器访问

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值