K8s集群安装
K8s安装部署流程
K8s集群安装
一、准备环境
1.1虚拟机配置要求
在VMware开通3台虚拟机,虚拟机配置均一样。新手不建议使用克隆,如使用克隆需记得需改其他虚拟机的MAC地址,否则网络不能互通。
1.2软件环境
软件 | 版本 |
---|---|
操作系统 | CentOS Linux release 7.9.2009 (Core) |
Docker | Version: 25.0.2 |
kubernetes | 1.23 |
1.3网络规划
节点 | IP地址 |
---|---|
k8smaster | 192.168.5.10 |
k8snode1 | 192.168.5.11 |
k8snode2 | 192.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/.kube是Kubernetes配置文件存放的默认目录。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):
(id−u):(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>
图形界面浏览器访问
更多推荐
所有评论(0)