赞
踩
本篇博客用于记录初步学习k8s后,学习部署集群的部署过程。
本次环境部署,采用VMware虚拟机来部署,配置为2C4G。3台master,3台node,2台负载均衡器,共8台机器来部署k8s高可用集群。操作系统都是CentOS7.6版本,详细机器配置和IP地址规划如下:
机器IP | 机器角色 |
---|---|
192.168.31.183 | master01 |
192.168.31.185 | master02 |
192.168.31.247 | master03 |
192.168.31.211 | node01 |
192.168.31.117 | node02 |
192.168.31.135 | node03 |
192.168.31.54 | loadbalance01 |
192.168.31.206 | loadbalance02 |
192.168.31.200 | VIP(test.k8s.local) |
说明:这些IP是通过VMware桥接到物理网络上,自动获取的IP地址,如果已经有规划很连续的IP地址那更好,怎么部署方便怎么来。
给所有机器修改主机名
[root@MiWiFi-RM1800-srv ~]# hostnamectl set-hostname master01 [root@MiWiFi-RM1800-srv ~]# [root@MiWiFi-RM1800-srv ~]# hostnamectl set-hostname master02 [root@MiWiFi-RM1800-srv ~]# [root@MiWiFi-RM1800-srv ~]# hostnamectl set-hostname master03 [root@MiWiFi-RM1800-srv ~]# [root@MiWiFi-RM1800-srv ~]# hostnamectl set-hostname node01 [root@MiWiFi-RM1800-srv ~]# [root@MiWiFi-RM1800-srv ~]# hostnamectl set-hostname node02 [root@MiWiFi-RM1800-srv ~]# [root@MiWiFi-RM1800-srv ~]# hostnamectl set-hostname node03 [root@MiWiFi-RM1800-srv ~]# [root@MiWiFi-RM1800-srv ~]# hostnamectl set-hostname loadbalance01 [root@MiWiFi-RM1800-srv ~]# [root@MiWiFi-RM1800-srv ~]# hostnamectl set-hostname loadbalance02 [root@MiWiFi-RM1800-srv ~]#
这里以master01作为跳板,通过master01能免密远程登陆到其他各个节点中去。
(1)生成ssh公私钥对:
[root@master01 ~]# [root@master01 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:Hmp6qL/ryDepWDfA5eUDeiwGX91NgBx2XP5wOhGKsFo root@master01 The key's randomart image is: +---[RSA 2048]----+ | ..o+oo+ | | =o+.= . | |. E + o = . | | + O + * | | O + o S o . | | . + + . . | | . ooo . | | + o=+. | |. =**= | +----[SHA256]-----+ [root@master01 ~]# [root@master01 ~]#
(2)将公钥分发至其余各节点中:
[root@master01 ~]# [root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.31.183 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" The authenticity of host '192.168.31.183 (192.168.31.183)' can't be established. ECDSA key fingerprint is SHA256:qwIzbDzkrM4yl2g74l+/DqRoCXcUz3QVCfEK23CFg6c. ECDSA key fingerprint is MD5:09:17:ba:5b:07:20:ac:22:48:e4:5a:6b:cc:26:60:cb. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.31.183's password: Permission denied, please try again. root@192.168.31.183's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.31.183'" and check to make sure that only the key(s) you wanted were added. [root@master01 ~]# [root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.31.185 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" The authenticity of host '192.168.31.185 (192.168.31.185)' can't be established. ECDSA key fingerprint is SHA256:qwIzbDzkrM4yl2g74l+/DqRoCXcUz3QVCfEK23CFg6c. ECDSA key fingerprint is MD5:09:17:ba:5b:07:20:ac:22:48:e4:5a:6b:cc:26:60:cb. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.31.185's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.31.185'" and check to make sure that only the key(s) you wanted were added. [root@master01 ~]# [root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.31.247 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" The authenticity of host '192.168.31.247 (192.168.31.247)' can't be established. ECDSA key fingerprint is SHA256:qwIzbDzkrM4yl2g74l+/DqRoCXcUz3QVCfEK23CFg6c. ECDSA key fingerprint is MD5:09:17:ba:5b:07:20:ac:22:48:e4:5a:6b:cc:26:60:cb. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.31.247's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.31.247'" and check to make sure that only the key(s) you wanted were added. [root@master01 ~]# [root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.31.211 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" The authenticity of host '192.168.31.211 (192.168.31.211)' can't be established. ECDSA key fingerprint is SHA256:qwIzbDzkrM4yl2g74l+/DqRoCXcUz3QVCfEK23CFg6c. ECDSA key fingerprint is MD5:09:17:ba:5b:07:20:ac:22:48:e4:5a:6b:cc:26:60:cb. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.31.211's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.31.211'" and check to make sure that only the key(s) you wanted were added. [root@master01 ~]# [root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.31.117 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" The authenticity of host '192.168.31.117 (192.168.31.117)' can't be established. ECDSA key fingerprint is SHA256:qwIzbDzkrM4yl2g74l+/DqRoCXcUz3QVCfEK23CFg6c. ECDSA key fingerprint is MD5:09:17:ba:5b:07:20:ac:22:48:e4:5a:6b:cc:26:60:cb. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.31.117's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.31.117'" and check to make sure that only the key(s) you wanted were added. [root@master01 ~]# [root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.31.135 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" The authenticity of host '192.168.31.135 (192.168.31.135)' can't be established. ECDSA key fingerprint is SHA256:qwIzbDzkrM4yl2g74l+/DqRoCXcUz3QVCfEK23CFg6c. ECDSA key fingerprint is MD5:09:17:ba:5b:07:20:ac:22:48:e4:5a:6b:cc:26:60:cb. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.31.135's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.31.135'" and check to make sure that only the key(s) you wanted were added. [root@master01 ~]# [root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.31.54 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" The authenticity of host '192.168.31.54 (192.168.31.54)' can't be established. ECDSA key fingerprint is SHA256:qwIzbDzkrM4yl2g74l+/DqRoCXcUz3QVCfEK23CFg6c. ECDSA key fingerprint is MD5:09:17:ba:5b:07:20:ac:22:48:e4:5a:6b:cc:26:60:cb. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.31.54's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.31.54'" and check to make sure that only the key(s) you wanted were added. [root@master01 ~]# [root@master01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.31.206 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" The authenticity of host '192.168.31.206 (192.168.31.206)' can't be established. ECDSA key fingerprint is SHA256:qwIzbDzkrM4yl2g74l+/DqRoCXcUz3QVCfEK23CFg6c. ECDSA key fingerprint is MD5:09:17:ba:5b:07:20:ac:22:48:e4:5a:6b:cc:26:60:cb. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.31.206's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.31.206'" and check to make sure that only the key(s) you wanted were added. [root@master01 ~]# [root@master01 ~]#
在所有机器上都需要配置hosts文件。这里在master01上配置好,然后复制到每一台节点上去即可。
(1)在master01上配置hosts文件:
[root@master01 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.183 master01
192.168.31.185 master02
192.168.31.247 master03
192.168.31.211 node01
192.168.31.117 node02
192.168.31.135 node03
192.168.31.54 loadbalance01
192.168.31.206 loadbalance02
192.168.31.200 test.k8s.local
(2)将hosts复制到其余机器上:
[root@master01 ~]# [root@master01 ~]# scp /etc/hosts root@master02:/etc/ hosts 100% 394 426.1KB/s 00:00 [root@master01 ~]# scp /etc/hosts root@master03:/etc/ hosts 100% 394 225.1KB/s 00:00 [root@master01 ~]# scp /etc/hosts root@node01:/etc/ hosts 100% 394 392.2KB/s 00:00 [root@master01 ~]# scp /etc/hosts root@node02:/etc/ hosts 100% 394 393.6KB/s 00:00 [root@master01 ~]# scp /etc/hosts root@node03:/etc/ hosts 100% 394 395.0KB/s 00:00 [root@master01 ~]# scp /etc/hosts root@loadbalance01:/etc/ hosts 100% 394 422.6KB/s 00:00 [root@master01 ~]# scp /etc/hosts root@loadbalance02:/etc/ hosts 100% 394 408.0KB/s 00:00 [root@master01 ~]# [root@master01 ~]#
对所有机器关闭防火墙以及selinux
(1)关闭防火墙
[root@master01 ~]# systemctl stop firewalld && 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@master02 ~]# systemctl stop firewalld && 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@master03 ~]# systemctl stop firewalld && 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@node01 ~]# systemctl stop firewalld && 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@node02 ~]# systemctl stop firewalld && 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@node03 ~]# systemctl stop firewalld && 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@loadbalance01 ~]# systemctl stop firewalld && 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@loadbalance02 ~]# systemctl stop firewalld && systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
(2)关闭selinux:
临时关闭:(每台机器都需要关闭)
[root@master01 ~]# setenforce 0 [root@master01 ~]# getenforce Permissive [root@master02 ~]# setenforce 0 [root@master02 ~]# getenforce Permissive [root@master03 ~]# setenforce 0 [root@master03 ~]# getenforce Permissive [root@node01 ~]# setenforce 0 [root@node01 ~]# getenforce Permissive [root@node02 ~]# setenforce 0 [root@node02 ~]# getenforce Permissive [root@node03 ~]# setenforce 0 [root@node03 ~]# getenforce Permissive [root@loadbalance01 ~]# setenforce 0 [root@loadbalance01 ~]# getenforce Permissive [root@loadbalance02 ~]# setenforce 0 [root@loadbalance02 ~]# getenforce Permissive
永久关闭:(需要重启机器,每台机器都需要做。这里先不重启,等后面升级完内核之后一起重启)
[root@master01 ~]# vim /etc/selinux/config ..... ..... SELINUX=disabled //这里将SELINUX的值从inforcing改为disabled ..... [root@master01 ~]# scp /etc/selinux/config root@master02:/etc/selinux/ config 100% 542 976.1KB/s 00:00 [root@master01 ~]# scp /etc/selinux/config root@master03:/etc/selinux/ config 100% 542 1.1MB/s 00:00 [root@master01 ~]# [root@master01 ~]# scp /etc/selinux/config root@node01:/etc/selinux/ config 100% 542 930.1KB/s 00:00 [root@master01 ~]# scp /etc/selinux/config root@node02:/etc/selinux/ config 100% 542 1.0MB/s 00:00 [root@master01 ~]# scp /etc/selinux/config root@node03:/etc/selinux/ config 100% 542 1.0MB/s 00:00 [root@master01 ~]# scp /etc/selinux/config root@loadbalance01:/etc/selinux/ config 100% 542 852.9KB/s 00:00 [root@master01 ~]# scp /etc/selinux/config root@loadbalance02:/etc/selinux/ config 100% 542 1.0MB/s 00:00 [root@master01 ~]#
对于集群来说,需要保证集群内的每个节点的时间都要保持一致,否则集群很容易发生脑裂行为。
时间同步有两种方式,一个是NTP服务,另一个是chronyd服务。这里,我们选择通过chronyd服务来同步时间。此处我们直接把每台机器都与互联网时间(ntp.aliyun.com)进行同步。
(1)在所有节点上安装chronyd服务:(此处我只写一台机器的安装,其余机器安装chronyd服务和这个一样。)
[root@master01 ~]# yum -y install chrony Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.bupt.edu.cn * extras: mirrors.bupt.edu.cn * updates: mirrors.bupt.edu.cn Resolving Dependencies --> Running transaction check ---> Package chrony.x86_64 0:3.4-1.el7 will be installed --> Processing Dependency: libseccomp.so.2()(64bit) for package: chrony-3.4-1.el7.x86_64 --> Running transaction check ---> Package libseccomp.x86_64 0:2.3.1-4.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ========================================================================================================================== Package Arch Version Repository Size ========================================================================================================================== Installing: chrony x86_64 3.4-1.el7 base 251 k Installing for dependencies: libseccomp x86_64 2.3.1-4.el7 base 56 k Transaction Summary ========================================================================================================================== Install 1 Package (+1 Dependent package) Total download size: 307 k Installed size: 788 k Downloading packages: (1/2): libseccomp-2.3.1-4.el7.x86_64.rpm | 56 kB 00:00:00 (2/2): chrony-3.4-1.el7.x86_64.rpm | 251 kB 00:00:01 -------------------------------------------------------------------------------------------------------------------------- Total 229 kB/s | 307 kB 00:00:01 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : libseccomp-2.3.1-4.el7.x86_64 1/2 Installing : chrony-3.4-1.el7.x86_64 2/2 Verifying : libseccomp-2.3.1-4.el7.x86_64 1/2 Verifying : chrony-3.4-1.el7.x86_64 2/2 Installed: chrony.x86_64 0:3.4-1.el7 Dependency Installed: libseccomp.x86_64 0:2.3.1-4.el7 Complete! [root@master01 ~]#
(2)在master01上配置chronyd服务:
[root@master01 ~]# vim /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst //将这几行server注释掉
#server 1.centos.pool.ntp.org iburst //将这几行server注释掉
#server 2.centos.pool.ntp.org iburst //将这几行server注释掉
#server 3.centos.pool.ntp.org iburst //将这几行server注释掉
server ntp.aliyun.com iburst //在上述行后面添加这一行,将同步时间的源指向阿里云的ntp服务器。
......
(3)将master01上的/etc/chrony.conf文件复制到其余各个节点
[root@master01 ~]# scp /etc/chrony.conf root@master02:/etc/ chrony.conf 100% 1142 2.1MB/s 00:00 [root@master01 ~]# scp /etc/chrony.conf root@master03:/etc/ chrony.conf 100% 1142 1.7MB/s 00:00 [root@master01 ~]# scp /etc/chrony.conf root@node01:/etc/ chrony.conf 100% 1142 1.2MB/s 00:00 [root@master01 ~]# scp /etc/chrony.conf root@node02:/etc/ chrony.conf 100% 1142 2.0MB/s 00:00 [root@master01 ~]# scp /etc/chrony.conf root@node03:/etc/ chrony.conf 100% 1142 1.5MB/s 00:00 [root@master01 ~]# [root@master01 ~]# scp /etc/chrony.conf root@loadbalance01:/etc/ chrony.conf 100% 1142 1.9MB/s 00:00 [root@master01 ~]# scp /etc/chrony.conf root@loadbalance02:/etc/ chrony.conf 100% 1142 1.7MB/s 00:00 [root@master01 ~]#
(4)在每个节点上启动chronyd服务
[root@master01 ~]# systemctl start chronyd && systemctl enable chronyd [root@master01 ~]# [root@master02 ~]# systemctl start chronyd && systemctl enable chronyd [root@master02 ~]# [root@master03 ~]# systemctl start chronyd && systemctl enable chronyd [root@master03 ~]# [root@node01 ~]# systemctl start chronyd && systemctl enable chronyd [root@node01 ~]# [root@node02 ~]# systemctl start chronyd && systemctl enable chronyd [root@node02 ~]# [root@node03 ~]# systemctl start chronyd && systemctl enable chronyd [root@node03 ~]# [root@loadbalance01 ~]# systemctl start chronyd && systemctl enable chronyd [root@loadbalance01 ~]# [root@loadbalance02 ~]# systemctl start chronyd && systemctl enable chronyd [root@loadbalance02 ~]#
在master01上查看:
[root@master01 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203.107.6.88 2 6 77 22 -209us[ +31us] +/- 28ms
[root@master01 ~]#
看到有* ,就说明没问题了
在k8s集群初始化阶段,如果系统swap启用后,初始化会报错,我们先提前把swap关闭掉。这里只需要关闭k8s的6台节点的swap即可,负载均衡机器可以不用关。
(1)临时关闭:
[root@master01 ~]# swapoff -a
[root@master02 ~]# swapoff -a
[root@master03 ~]# swapoff -a
[root@node01 ~]# swapoff -a
[root@node02 ~]# swapoff -a
[root@node03 ~]# swapoff -a
(2)永久关闭:(永久关闭需要配置系统/etc/fstable文件,然后重启系统生效。这里我们先不重启,等到后面升级完系统内核之后再重启)
[root@master01 ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Jul 12 21:27:09 2022
#
# 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=981d46e6-8dc0-4db9-8769-1c419db45ad8 /boot xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0 //将此行注释掉即可
然后在每台k8s节点上都需要做这个操作。此处就不再演示后面的过程。
k8s需要用到网桥转发功能,另外对于k8s而言,在部署了calico网络之后,需要支持ipvs功能才可以。所以此处需要加载网桥转发模块和ipvs模块。(这仅限于个人理解,可能不全面)
(1)临时加载:
[root@master01 ~]# modprobe br_netfilter
[root@master01 ~]# modprobe -- ip_vs
[root@master01 ~]# modprobe -- ip_vs_rr
[root@master01 ~]# modprobe -- ip_vs_wrr
[root@master01 ~]# modprobe -- ip_vs_sh
[root@master01 ~]# modprobe -- nf_conntrack
查看是否加载成功:
[root@master01 ~]# lsmod | grep br_net
br_netfilter 22256 0
bridge 151336 1 br_netfilter
[root@master01 ~]#
[root@master01 ~]# lsmod | grep ip_vs
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145497 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 133095 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
[root@master01 ~]#
每台k8s节点都需要加载,此处不再演示后面机器加载过程。
(2)永久加载:(永久加载模块,即需要在/etc/modules-load.d/下创建以.conf结尾的模块文件,将上述模块保存至此文件中,重启系统即可生效。此处先不重启,等后面升级完内核之后再重启)
[root@master01 ~]# vim /etc/modules-load.d/k8s.conf
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
将此文件复制到其余各k8s节点中:
[root@master01 ~]# scp /etc/modules-load.d/k8s.conf root@master02:/etc/modules-load.d/
k8s.conf 100% 60 81.5KB/s 00:00
[root@master01 ~]# scp /etc/modules-load.d/k8s.conf root@master03:/etc/modules-load.d/
k8s.conf 100% 60 83.1KB/s 00:00
[root@master01 ~]# scp /etc/modules-load.d/k8s.conf root@node01:/etc/modules-load.d/
k8s.conf 100% 60 57.4KB/s 00:00
[root@master01 ~]# scp /etc/modules-load.d/k8s.conf root@node02:/etc/modules-load.d/
k8s.conf 100% 60 95.7KB/s 00:00
[root@master01 ~]# scp /etc/modules-load.d/k8s.conf root@node03:/etc/modules-load.d/
k8s.conf 100% 60 77.4KB/s 00:00
[root@master01 ~]#
(3)在各k8s节点上安装ipvsadm、ipset:
[root@master01 ~]# yum -y install ipvsadm ipset Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.bupt.edu.cn * extras: mirrors.bupt.edu.cn * updates: mirrors.bupt.edu.cn base | 3.6 kB 00:00:00 docker-ce-stable | 3.5 kB 00:00:00 elrepo | 3.0 kB 00:00:00 extras | 2.9 kB 00:00:00 updates | 2.9 kB 00:00:00 Resolving Dependencies --> Running transaction check ---> Package ipset.x86_64 0:6.38-2.el7 will be updated ---> Package ipset.x86_64 0:7.1-1.el7 will be an update --> Processing Dependency: ipset-libs(x86-64) = 7.1-1.el7 for package: ipset-7.1-1.el7.x86_64 --> Processing Dependency: libipset.so.13(LIBIPSET_4.8)(64bit) for package: ipset-7.1-1.el7.x86_64 --> Processing Dependency: libipset.so.13(LIBIPSET_2.0)(64bit) for package: ipset-7.1-1.el7.x86_64 --> Processing Dependency: libipset.so.13()(64bit) for package: ipset-7.1-1.el7.x86_64 ---> Package ipvsadm.x86_64 0:1.27-8.el7 will be installed --> Running transaction check ---> Package ipset-libs.x86_64 0:6.38-2.el7 will be updated ---> Package ipset-libs.x86_64 0:7.1-1.el7 will be an update --> Finished Dependency Resolution Dependencies Resolved ========================================================================================================================== Package Arch Version Repository Size ========================================================================================================================== Installing: ipvsadm x86_64 1.27-8.el7 base 45 k Updating: ipset x86_64 7.1-1.el7 base 39 k Updating for dependencies: ipset-libs x86_64 7.1-1.el7 base 64 k Transaction Summary ========================================================================================================================== Install 1 Package Upgrade 1 Package (+1 Dependent package) Total download size: 147 k Downloading packages: Delta RPMs disabled because /usr/bin/applydeltarpm not installed. (1/3): ipvsadm-1.27-8.el7.x86_64.rpm | 45 kB 00:00:00 (2/3): ipset-7.1-1.el7.x86_64.rpm | 39 kB 00:00:00 (3/3): ipset-libs-7.1-1.el7.x86_64.rpm | 64 kB 00:00:00 -------------------------------------------------------------------------------------------------------------------------- Total 361 kB/s | 147 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Updating : ipset-libs-7.1-1.el7.x86_64 1/5 Updating : ipset-7.1-1.el7.x86_64 2/5 Installing : ipvsadm-1.27-8.el7.x86_64 3/5 Cleanup : ipset-6.38-2.el7.x86_64 4/5 Cleanup : ipset-libs-6.38-2.el7.x86_64 5/5 Verifying : ipvsadm-1.27-8.el7.x86_64 1/5 Verifying : ipset-7.1-1.el7.x86_64 2/5 Verifying : ipset-libs-7.1-1.el7.x86_64 3/5 Verifying : ipset-libs-6.38-2.el7.x86_64 4/5 Verifying : ipset-6.38-2.el7.x86_64 5/5 Installed: ipvsadm.x86_64 0:1.27-8.el7 Updated: ipset.x86_64 0:7.1-1.el7 Dependency Updated: ipset-libs.x86_64 0:7.1-1.el7 Complete! [root@master01 ~]#
此处只演示一台机器安装,其余机器不再演示安装过程。
k8s需要将系统的如下3个参数设置为1,即开启这3个功能:
net.bridge.bridge-nf-call-ip6tables
net.bridge.bridge-nf-call-iptables
net.ipv4.ip_forward
将这3个参数保存至配置文件中,让其永久生效。
[root@master01 ~]# vim /etc/modules-load.d/k8s-forward.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[root@master01 ~]# sysctl -p /etc/sysctl.d/k8s-forward.conf //执行此命令,让其生效
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
将这个文件复制到各k8s节点中:
[root@master01 ~]# scp /etc/sysctl.d/k8s-forward.conf root@master02:/etc/sysctl.d/
k8s-forward.conf 100% 103 176.8KB/s 00:00
[root@master01 ~]# scp /etc/sysctl.d/k8s-forward.conf root@master03:/etc/sysctl.d/
k8s-forward.conf 100% 103 148.5KB/s 00:00
[root@master01 ~]# scp /etc/sysctl.d/k8s-forward.conf root@node01:/etc/sysctl.d/
k8s-forward.conf 100% 103 128.1KB/s 00:00
[root@master01 ~]# scp /etc/sysctl.d/k8s-forward.conf root@node02:/etc/sysctl.d/
k8s-forward.conf 100% 103 215.3KB/s 00:00
[root@master01 ~]# scp /etc/sysctl.d/k8s-forward.conf root@node03:/etc/sysctl.d/
k8s-forward.conf 100% 103 184.6KB/s 00:00
[root@master01 ~]#
复制完成后,在剩余的几台k8s节点中执行sysctl -p /etc/sysctl.d/k8s-forward.conf命令让其生效,此处不再演示后面的过程。
CentOS系统默认的内核版本是3.10,对于k8s-v1.24版本来说,在生产环境上能部署,能运行,但是在使用k8s期间会出现很多问题,即不稳定因数。为了能在生产环境中稳定运行,对于1.24版本而言,对于CentOS系统而言,需要升级系统内核。而elrepo内核目前已经更新到了5版本。所以本次就用它来升级系统内核。
而对于elrepo而言,它的官网是这个地址:http://elrepo.org/tiki/HomePage 可直接按照官网的步骤来升级即可。考虑到国内墙的因素,在安装内核的rpm包时很慢,所以这里换成了清华大学的开源镜像站。我们这里选择kernel-ml-5.19.5-1.el7.elrepo.x86_64.rpm这个版本的内核。
(1)在/etc/yum.repos.d/下创建一个repo文件:
[root@master01 yum.repos.d]# vim /etc/yum.repos.d/elrepo.repo
[elrepo]
name=elrepo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/x86_64/
gpgcheck=0
enabled=1
(2)安装kernel-ml:
[root@master01 yum.repos.d]# yum -y install kernel-ml Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.bupt.edu.cn * extras: mirrors.bupt.edu.cn * updates: mirrors.bupt.edu.cn Resolving Dependencies --> Running transaction check ---> Package kernel-ml.x86_64 0:5.19.5-1.el7.elrepo will be installed --> Finished Dependency Resolution Dependencies Resolved ========================================================================================================================== Package Arch Version Repository Size ========================================================================================================================== Installing: kernel-ml x86_64 5.19.5-1.el7.elrepo elrepo 59 M Transaction Summary ========================================================================================================================== Install 1 Package Total download size: 59 M Installed size: 276 M Downloading packages: kernel-ml-5.19.5-1.el7.elrepo.x86_64.rpm | 59 MB 00:01:34 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : kernel-ml-5.19.5-1.el7.elrepo.x86_64 1/1 Verifying : kernel-ml-5.19.5-1.el7.elrepo.x86_64 1/1 Installed: kernel-ml.x86_64 0:5.19.5-1.el7.elrepo Complete! [root@master01 yum.repos.d]#
(3)设置默认启动内核为新内核:
[root@master01 yum.repos.d]# cat /boot/grub2/grub.cfg | grep menuentry //查看系统可用内核
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
menuentry_id_option=""
export menuentry_id_option
menuentry 'CentOS Linux (5.19.5-1.el7.elrepo.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-1bf51c00-7358-43e0-9ea5-a17744d255ab' {
menuentry 'CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-1bf51c00-7358-43e0-9ea5-a17744d255ab' {
menuentry 'CentOS Linux (0-rescue-938f9c4b9e594d3bb395864ff21e1f2d) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-938f9c4b9e594d3bb395864ff21e1f2d-advanced-1bf51c00-7358-43e0-9ea5-a17744d255ab' {
[root@master01 yum.repos.d]#
[root@master01 yum.repos.d]# grub2-set-default 'CentOS Linux (5.19.5-1.el7.elrepo.x86_64) 7 (Core)' //设置系统启动为新内核启动
(3)重启系统:
[root@master01 yum.repos.d]# init 6
(4)查看当前内核版本:
[root@master01 ~]# uname -a
Linux master01 5.19.5-1.el7.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Mon Aug 29 08:55:53 EDT 2022 x86_64 x86_64 x86_64 GNU/Linux
[root@master01 ~]#
到此,机器内核就升级成功了。后面所有k8s节点都需要升级内核,此处不再详细演示升级过程。
负载均衡有很多种方式,这里选择haproxy+keepalived组合来构建负载均衡。
(1)在两台负载均衡机器(loadbalance01、loadbalance02)上安装haproxy:
[root@loadbalance01 ~]# yum -y install haproxy Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: ftp.sjtu.edu.cn * extras: mirrors.ustc.edu.cn * updates: mirrors.ustc.edu.cn Resolving Dependencies --> Running transaction check ---> Package haproxy.x86_64 0:1.5.18-9.el7_9.1 will be installed --> Finished Dependency Resolution Dependencies Resolved ========================================================================================================================== Package Arch Version Repository Size ========================================================================================================================== Installing: haproxy x86_64 1.5.18-9.el7_9.1 updates 835 k Transaction Summary ========================================================================================================================== Install 1 Package Total download size: 835 k Installed size: 2.6 M Downloading packages: haproxy-1.5.18-9.el7_9.1.x86_64.rpm | 835 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : haproxy-1.5.18-9.el7_9.1.x86_64 1/1 Verifying : haproxy-1.5.18-9.el7_9.1.x86_64 1/1 Installed: haproxy.x86_64 0:1.5.18-9.el7_9.1 Complete! [root@loadbalance01 ~]# [root@loadbalance02 ~]# yum -y install haproxy Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.njupt.edu.cn Resolving Dependencies --> Running transaction check ---> Package haproxy.x86_64 0:1.5.18-9.el7_9.1 will be installed --> Finished Dependency Resolution Dependencies Resolved ========================================================================================================================== Package Arch Version Repository Size ========================================================================================================================== Installing: haproxy x86_64 1.5.18-9.el7_9.1 updates 835 k Transaction Summary ========================================================================================================================== Install 1 Package Total download size: 835 k Installed size: 2.6 M Downloading packages: haproxy-1.5.18-9.el7_9.1.x86_64.rpm | 835 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : haproxy-1.5.18-9.el7_9.1.x86_64 1/1 Verifying : haproxy-1.5.18-9.el7_9.1.x86_64 1/1 Installed: haproxy.x86_64 0:1.5.18-9.el7_9.1 Complete! [root@loadbalance02 ~]#
(2)在loadbalance01上配置haproxy:
[root@loadbalance01 ~]# vim /etc/haproxy/haproxy.cfg #--------------------------------------------------------------------- # Example configuration for a possible web application. See the # full configuration options online. # # http://haproxy.1wt.eu/download/1.4/doc/configuration.txt # #--------------------------------------------------------------------- #--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global # option httplog option dontlognull # option http-server-close # option forwardfor except 127.0.0.0/8 # option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend main *:6443 mode tcp default_backend k8s #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- #backend static # balance roundrobin # server static 127.0.0.1:4331 check #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend k8s mode tcp balance roundrobin server master01 192.168.31.183:6443 check server master02 192.168.31.185:6443 check server master03 192.168.31.247:6443 check # server app4 127.0.0.1:5004 check
(3)将loadbalance01上的haproxy.cfg复制到loadbalance02上:
[root@loadbalance01 ~]# scp /etc/haproxy/haproxy.cfg root@loadbalance02:/etc/haproxy/
root@loadbalance02's password:
haproxy.cfg 100% 3008 4.2MB/s 00:00
[root@loadbalance01 ~]#
(4)两台节点上启动haproxy服务:
[root@loadbalance01 ~]# systemctl start haproxy && systemctl enable haproxy
Created symlink from /etc/systemd/system/multi-user.target.wants/haproxy.service to /usr/lib/systemd/system/haproxy.service.
[root@loadbalance01 ~]#
[root@loadbalance02 haproxy]# systemctl restart haproxy && systemctl enable haproxy
Created symlink from /etc/systemd/system/multi-user.target.wants/haproxy.service to /usr/lib/systemd/system/haproxy.service.
[root@loadbalance02 haproxy]#
(5)查看haproxy服务的状态:
[root@loadbalance02 haproxy]# systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-08-30 18:57:18 CST; 1min 16s ago
Main PID: 18084 (haproxy-systemd)
CGroup: /system.slice/haproxy.service
├─18084 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
├─18086 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
└─18090 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Aug 30 18:57:18 loadbalance02 systemd[1]: Started HAProxy Load Balancer.
Aug 30 18:57:18 loadbalance02 haproxy-systemd-wrapper[18084]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -...-Ds
Hint: Some lines were ellipsized, use -l to show in full.
[root@loadbalance02 haproxy]#
可以看到,haproxy的服务是正常的。到此,haproxy部署完毕。
keepalived作为负载均衡组合,为k8s提供一个VIP的访问入口,并且采用主备运行的方式。正常时VIP在主节点上,一旦主节点异常后,VIP会自动漂移至备节点,继续提供服务。
(1)在两台负载均衡机器(loadbalance01、loadbalance02)上安装keepalived软件包:
[root@loadbalance01 ~]# yum -y install keepalived Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: ftp.sjtu.edu.cn * extras: mirrors.ustc.edu.cn * updates: mirrors.ustc.edu.cn Resolving Dependencies --> Running transaction check ---> Package keepalived.x86_64 0:1.3.5-19.el7 will be installed --> Processing Dependency: ipset-libs >= 7.1 for package: keepalived-1.3.5-19.el7.x86_64 --> Processing Dependency: libnetsnmpmibs.so.31()(64bit) for package: keepalived-1.3.5-19.el7.x86_64 --> Processing Dependency: libnetsnmpagent.so.31()(64bit) for package: keepalived-1.3.5-19.el7.x86_64 --> Processing Dependency: libnetsnmp.so.31()(64bit) for package: keepalived-1.3.5-19.el7.x86_64 --> Running transaction check ---> Package ipset-libs.x86_64 0:6.38-2.el7 will be updated --> Processing Dependency: ipset-libs(x86-64) = 6.38-2.el7 for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11()(64bit) for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11(LIBIPSET_1.0)(64bit) for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11(LIBIPSET_2.0)(64bit) for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11(LIBIPSET_3.0)(64bit) for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11(LIBIPSET_4.5)(64bit) for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11(LIBIPSET_4.6)(64bit) for package: ipset-6.38-2.el7.x86_64 ---> Package ipset-libs.x86_64 0:7.1-1.el7 will be an update ---> Package net-snmp-agent-libs.x86_64 1:5.7.2-49.el7_9.2 will be installed --> Processing Dependency: libsensors.so.4()(64bit) for package: 1:net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64 ---> Package net-snmp-libs.x86_64 1:5.7.2-49.el7_9.2 will be installed --> Running transaction check ---> Package ipset.x86_64 0:6.38-2.el7 will be updated ---> Package ipset.x86_64 0:7.1-1.el7 will be an update ---> Package lm_sensors-libs.x86_64 0:3.4.0-8.20160601gitf9185e5.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ========================================================================================================================== Package Arch Version Repository Size ========================================================================================================================== Installing: keepalived x86_64 1.3.5-19.el7 base 332 k Installing for dependencies: lm_sensors-libs x86_64 3.4.0-8.20160601gitf9185e5.el7 base 42 k net-snmp-agent-libs x86_64 1:5.7.2-49.el7_9.2 updates 707 k net-snmp-libs x86_64 1:5.7.2-49.el7_9.2 updates 752 k Updating for dependencies: ipset x86_64 7.1-1.el7 base 39 k ipset-libs x86_64 7.1-1.el7 base 64 k Transaction Summary ========================================================================================================================== Install 1 Package (+3 Dependent packages) Upgrade ( 2 Dependent packages) Total download size: 1.9 M Downloading packages: Delta RPMs disabled because /usr/bin/applydeltarpm not installed. (1/6): ipset-7.1-1.el7.x86_64.rpm | 39 kB 00:00:00 (2/6): lm_sensors-libs-3.4.0-8.20160601gitf9185e5.el7.x86_64.rpm | 42 kB 00:00:00 (3/6): ipset-libs-7.1-1.el7.x86_64.rpm | 64 kB 00:00:00 (4/6): keepalived-1.3.5-19.el7.x86_64.rpm | 332 kB 00:00:00 (5/6): net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64.rpm | 707 kB 00:00:00 (6/6): net-snmp-libs-5.7.2-49.el7_9.2.x86_64.rpm | 752 kB 00:00:01 -------------------------------------------------------------------------------------------------------------------------- Total 1.4 MB/s | 1.9 MB 00:00:01 Running transaction check Running transaction test Transaction test succeeded Running transaction Updating : ipset-libs-7.1-1.el7.x86_64 1/8 Installing : 1:net-snmp-libs-5.7.2-49.el7_9.2.x86_64 2/8 Installing : lm_sensors-libs-3.4.0-8.20160601gitf9185e5.el7.x86_64 3/8 Installing : 1:net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64 4/8 Installing : keepalived-1.3.5-19.el7.x86_64 5/8 Updating : ipset-7.1-1.el7.x86_64 6/8 Cleanup : ipset-6.38-2.el7.x86_64 7/8 Cleanup : ipset-libs-6.38-2.el7.x86_64 8/8 Verifying : 1:net-snmp-libs-5.7.2-49.el7_9.2.x86_64 1/8 Verifying : ipset-7.1-1.el7.x86_64 2/8 Verifying : keepalived-1.3.5-19.el7.x86_64 3/8 Verifying : ipset-libs-7.1-1.el7.x86_64 4/8 Verifying : lm_sensors-libs-3.4.0-8.20160601gitf9185e5.el7.x86_64 5/8 Verifying : 1:net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64 6/8 Verifying : ipset-libs-6.38-2.el7.x86_64 7/8 Verifying : ipset-6.38-2.el7.x86_64 8/8 Installed: keepalived.x86_64 0:1.3.5-19.el7 Dependency Installed: lm_sensors-libs.x86_64 0:3.4.0-8.20160601gitf9185e5.el7 net-snmp-agent-libs.x86_64 1:5.7.2-49.el7_9.2 net-snmp-libs.x86_64 1:5.7.2-49.el7_9.2 Dependency Updated: ipset.x86_64 0:7.1-1.el7 ipset-libs.x86_64 0:7.1-1.el7 Complete! [root@loadbalance01 ~]# [root@loadbalance02 ~]# yum -y install keepalived Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.njupt.edu.cn Resolving Dependencies --> Running transaction check ---> Package keepalived.x86_64 0:1.3.5-19.el7 will be installed --> Processing Dependency: ipset-libs >= 7.1 for package: keepalived-1.3.5-19.el7.x86_64 --> Processing Dependency: libnetsnmpmibs.so.31()(64bit) for package: keepalived-1.3.5-19.el7.x86_64 --> Processing Dependency: libnetsnmpagent.so.31()(64bit) for package: keepalived-1.3.5-19.el7.x86_64 --> Processing Dependency: libnetsnmp.so.31()(64bit) for package: keepalived-1.3.5-19.el7.x86_64 --> Running transaction check ---> Package ipset-libs.x86_64 0:6.38-2.el7 will be updated --> Processing Dependency: ipset-libs(x86-64) = 6.38-2.el7 for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11()(64bit) for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11(LIBIPSET_1.0)(64bit) for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11(LIBIPSET_2.0)(64bit) for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11(LIBIPSET_3.0)(64bit) for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11(LIBIPSET_4.5)(64bit) for package: ipset-6.38-2.el7.x86_64 --> Processing Dependency: libipset.so.11(LIBIPSET_4.6)(64bit) for package: ipset-6.38-2.el7.x86_64 ---> Package ipset-libs.x86_64 0:7.1-1.el7 will be an update ---> Package net-snmp-agent-libs.x86_64 1:5.7.2-49.el7_9.2 will be installed --> Processing Dependency: libsensors.so.4()(64bit) for package: 1:net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64 ---> Package net-snmp-libs.x86_64 1:5.7.2-49.el7_9.2 will be installed --> Running transaction check ---> Package ipset.x86_64 0:6.38-2.el7 will be updated ---> Package ipset.x86_64 0:7.1-1.el7 will be an update ---> Package lm_sensors-libs.x86_64 0:3.4.0-8.20160601gitf9185e5.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ========================================================================================================================== Package Arch Version Repository Size ========================================================================================================================== Installing: keepalived x86_64 1.3.5-19.el7 base 332 k Installing for dependencies: lm_sensors-libs x86_64 3.4.0-8.20160601gitf9185e5.el7 base 42 k net-snmp-agent-libs x86_64 1:5.7.2-49.el7_9.2 updates 707 k net-snmp-libs x86_64 1:5.7.2-49.el7_9.2 updates 752 k Updating for dependencies: ipset x86_64 7.1-1.el7 base 39 k ipset-libs x86_64 7.1-1.el7 base 64 k Transaction Summary ========================================================================================================================== Install 1 Package (+3 Dependent packages) Upgrade ( 2 Dependent packages) Total download size: 1.9 M Downloading packages: Delta RPMs disabled because /usr/bin/applydeltarpm not installed. (1/6): ipset-7.1-1.el7.x86_64.rpm | 39 kB 00:00:00 (2/6): ipset-libs-7.1-1.el7.x86_64.rpm | 64 kB 00:00:00 (3/6): lm_sensors-libs-3.4.0-8.20160601gitf9185e5.el7.x86_64.rpm | 42 kB 00:00:00 (4/6): keepalived-1.3.5-19.el7.x86_64.rpm | 332 kB 00:00:00 (5/6): net-snmp-libs-5.7.2-49.el7_9.2.x86_64.rpm | 752 kB 00:00:00 (6/6): net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64.rpm | 707 kB 00:00:00 -------------------------------------------------------------------------------------------------------------------------- Total 2.0 MB/s | 1.9 MB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Updating : ipset-libs-7.1-1.el7.x86_64 1/8 Installing : 1:net-snmp-libs-5.7.2-49.el7_9.2.x86_64 2/8 Installing : lm_sensors-libs-3.4.0-8.20160601gitf9185e5.el7.x86_64 3/8 Installing : 1:net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64 4/8 Installing : keepalived-1.3.5-19.el7.x86_64 5/8 Updating : ipset-7.1-1.el7.x86_64 6/8 Cleanup : ipset-6.38-2.el7.x86_64 7/8 Cleanup : ipset-libs-6.38-2.el7.x86_64 8/8 Verifying : 1:net-snmp-libs-5.7.2-49.el7_9.2.x86_64 1/8 Verifying : ipset-7.1-1.el7.x86_64 2/8 Verifying : keepalived-1.3.5-19.el7.x86_64 3/8 Verifying : ipset-libs-7.1-1.el7.x86_64 4/8 Verifying : lm_sensors-libs-3.4.0-8.20160601gitf9185e5.el7.x86_64 5/8 Verifying : 1:net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64 6/8 Verifying : ipset-libs-6.38-2.el7.x86_64 7/8 Verifying : ipset-6.38-2.el7.x86_64 8/8 Installed: keepalived.x86_64 0:1.3.5-19.el7 Dependency Installed: lm_sensors-libs.x86_64 0:3.4.0-8.20160601gitf9185e5.el7 net-snmp-agent-libs.x86_64 1:5.7.2-49.el7_9.2 net-snmp-libs.x86_64 1:5.7.2-49.el7_9.2 Dependency Updated: ipset.x86_64 0:7.1-1.el7 ipset-libs.x86_64 0:7.1-1.el7 Complete! [root@loadbalance02 ~]#
(2)配置keepalived:
loadbalance01上:
[root@loadbalance01 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc # smtp_server 192.168.200.1 # smtp_connect_timeout 30 router_id k8s01 # vrrp_skip_check_adv_addr # vrrp_strict vrrp_mcast_group4 224.0.0.18 vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 2 weight 20 } vrrp_instance K8S { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.31.200/24 dev ens33 } track_script { chk_haproxy } }
loadbalance02上:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc # smtp_server 192.168.200.1 # smtp_connect_timeout 30 router_id k8s02 # vrrp_skip_check_adv_addr # vrrp_strict vrrp_mcast_group4 224.0.0.18 vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 2 weight 20 } vrrp_instance K8S { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.31.200/24 dev ens33 } track_script { chk_haproxy } }
(3)启动keepalived服务:
[root@loadbalance01 ~]# systemctl start keepalived && systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@loadbalance01 ~]#
[root@loadbalance02 ~]# systemctl start keepalived && systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@loadbalance02 ~]#
启动完成后,在loadbalance01节点上查看IP地址,会看到有VIP配置在ens33这块网卡上:
[root@loadbalance01 ~]# ip a s 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:0c:29:e1:20:87 brd ff:ff:ff:ff:ff:ff inet 192.168.31.54/24 brd 192.168.31.255 scope global noprefixroute dynamic ens33 valid_lft 26969sec preferred_lft 26969sec inet 192.168.31.200/24 scope global secondary ens33 //这个IP就是VIP valid_lft forever preferred_lft forever inet6 fe80::d3e7:1100:3607:f1a0/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:e1:20:91 brd ff:ff:ff:ff:ff:ff inet 192.168.20.70/24 brd 192.168.20.255 scope global noprefixroute ens37 valid_lft forever preferred_lft forever inet6 fe80::2681:d86f:ca5:a70f/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@loadbalance01 ~]#
到此,keepalived就配置完了。
为了验证keepalived没问题,我们做一个小测试:
正常情况下,当keepalived主节点上的haproxy服务或者进程down掉后,VIP会漂移至keepalived备节点。反之就不正常。
在loadbalance01上停掉haproxy服务,然后查看VIP的漂移情况:
[root@loadbalance01 ~]# systemctl stop haproxy [root@loadbalance01 ~]# ip a s 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:0c:29:e1:20:87 brd ff:ff:ff:ff:ff:ff inet 192.168.31.54/24 brd 192.168.31.255 scope global noprefixroute dynamic ens33 valid_lft 26717sec preferred_lft 26717sec inet6 fe80::d3e7:1100:3607:f1a0/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:e1:20:91 brd ff:ff:ff:ff:ff:ff inet 192.168.20.70/24 brd 192.168.20.255 scope global noprefixroute ens37 valid_lft forever preferred_lft forever inet6 fe80::2681:d86f:ca5:a70f/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@loadbalance01 ~]# [root@loadbalance02 ~]# ip a s 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:0c:29:fd:b5:92 brd ff:ff:ff:ff:ff:ff inet 192.168.31.206/24 brd 192.168.31.255 scope global noprefixroute dynamic ens33 valid_lft 26841sec preferred_lft 26841sec inet 192.168.31.200/24 scope global secondary ens33 valid_lft forever preferred_lft forever inet6 fe80::c383:8583:d760:5646/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:fd:b5:9c brd ff:ff:ff:ff:ff:ff inet 192.168.20.80/24 brd 192.168.20.255 scope global noprefixroute ens37 valid_lft forever preferred_lft forever inet6 fe80::8286:ed3d:b49d:79db/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@loadbalance02 ~]#
由此可看出,当keepalived主节点上的haproxy服务停止掉后,VIP正常漂移至备节点了。
恢复haproxy,查看VIP的还原情况:
[root@loadbalance01 ~]# systemctl start haproxy [root@loadbalance01 ~]# ip a s 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:0c:29:e1:20:87 brd ff:ff:ff:ff:ff:ff inet 192.168.31.54/24 brd 192.168.31.255 scope global noprefixroute dynamic ens33 valid_lft 26601sec preferred_lft 26601sec inet 192.168.31.200/24 scope global secondary ens33 valid_lft forever preferred_lft forever inet6 fe80::d3e7:1100:3607:f1a0/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:e1:20:91 brd ff:ff:ff:ff:ff:ff inet 192.168.20.70/24 brd 192.168.20.255 scope global noprefixroute ens37 valid_lft forever preferred_lft forever inet6 fe80::2681:d86f:ca5:a70f/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@loadbalance01 ~]# [root@loadbalance02 ~]# ip a s 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:0c:29:fd:b5:92 brd ff:ff:ff:ff:ff:ff inet 192.168.31.206/24 brd 192.168.31.255 scope global noprefixroute dynamic ens33 valid_lft 26727sec preferred_lft 26727sec inet6 fe80::c383:8583:d760:5646/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:fd:b5:9c brd ff:ff:ff:ff:ff:ff inet 192.168.20.80/24 brd 192.168.20.255 scope global noprefixroute ens37 valid_lft forever preferred_lft forever inet6 fe80::8286:ed3d:b49d:79db/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@loadbalance02 ~]#
可以看到,当keepalived的主节点上的haproxy服务启动后,VIP漂移回来了。
到此,整个负载均衡器就配置完了。
说到容器,我们会想到docker,因为docker是目前最主流的容器管理工具。docker社区对docker的支持力度也很高。所以在之前的k8s版本中,默认的容器运行时都是docker。因为它功能更丰富,使用更方便,并且被全球范围内广大的运维和开发者熟知。但是自k8s-v1.24版本开始,k8s抛弃了docker,即不再将docker作为其默认的容器运行时来工作,而将容器运行时换成了containerd。所以对于1.24及以后的k8s版本,部署集群时的容器应该要向containerd靠拢。
对于1.24版本的k8s部署,如果使用docker作为容器运行时,则在部署集群前,需要安装cri-dockerd,这个插件就是通过cri接口将docker和k8是连接起来。如果使用containerd作为容器运行时,则不需要安装额外的插件就可正常部署。
这里我们选择containerd。
对于containerd而言,可选择二进制安装。我一般习惯用yum安装。在docker的镜像仓库中就有containerd包,我们可以直接docker仓库配置好,然后在每台k8s集群节点中安装containerd就行了。
(1)配置docker仓库:(每台k8s节点上配置)
这里我们选择阿里云的官方开源镜像站。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
(2)安装containerd:(每台k8s节点上配置)
[root@master01 ~]# yum -y install containerd Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.bupt.edu.cn * extras: mirrors.bupt.edu.cn * updates: mirrors.bupt.edu.cn Resolving Dependencies --> Running transaction check ---> Package containerd.io.x86_64 0:1.6.8-3.1.el7 will be installed --> Processing Dependency: container-selinux >= 2:2.74 for package: containerd.io-1.6.8-3.1.el7.x86_64 --> Running transaction check ---> Package container-selinux.noarch 2:2.119.2-1.911c772.el7_8 will be installed --> Processing Dependency: policycoreutils-python for package: 2:container-selinux-2.119.2-1.911c772.el7_8.noarch --> Running transaction check ---> Package policycoreutils-python.x86_64 0:2.5-34.el7 will be installed --> Processing Dependency: policycoreutils = 2.5-34.el7 for package: policycoreutils-python-2.5-34.el7.x86_64 --> Processing Dependency: setools-libs >= 3.3.8-4 for package: policycoreutils-python-2.5-34.el7.x86_64 --> Processing Dependency: libsemanage-python >= 2.5-14 for package: policycoreutils-python-2.5-34.el7.x86_64 --> Processing Dependency: audit-libs-python >= 2.1.3-4 for package: policycoreutils-python-2.5-34.el7.x86_64 --> Processing Dependency: python-IPy for package: policycoreutils-python-2.5-34.el7.x86_64 --> Processing Dependency: libqpol.so.1(VERS_1.4)(64bit) for package: policycoreutils-python-2.5-34.el7.x86_64 --> Processing Dependency: libqpol.so.1(VERS_1.2)(64bit) for package: policycoreutils-python-2.5-34.el7.x86_64 --> Processing Dependency: libcgroup for package: policycoreutils-python-2.5-34.el7.x86_64 --> Processing Dependency: libapol.so.4(VERS_4.0)(64bit) for package: policycoreutils-python-2.5-34.el7.x86_64 --> Processing Dependency: checkpolicy for package: policycoreutils-python-2.5-34.el7.x86_64 --> Processing Dependency: libqpol.so.1()(64bit) for package: policycoreutils-python-2.5-34.el7.x86_64 --> Processing Dependency: libapol.so.4()(64bit) for package: policycoreutils-python-2.5-34.el7.x86_64 --> Running transaction check ---> Package audit-libs-python.x86_64 0:2.8.5-4.el7 will be installed --> Processing Dependency: audit-libs(x86-64) = 2.8.5-4.el7 for package: audit-libs-python-2.8.5-4.el7.x86_64 ---> Package checkpolicy.x86_64 0:2.5-8.el7 will be installed ---> Package libcgroup.x86_64 0:0.41-21.el7 will be installed ---> Package libsemanage-python.x86_64 0:2.5-14.el7 will be installed ---> Package policycoreutils.x86_64 0:2.5-29.el7 will be updated ---> Package policycoreutils.x86_64 0:2.5-34.el7 will be an update ---> Package python-IPy.noarch 0:0.75-6.el7 will be installed ---> Package setools-libs.x86_64 0:3.3.8-4.el7 will be installed --> Running transaction check ---> Package audit-libs.x86_64 0:2.8.4-4.el7 will be updated --> Processing Dependency: audit-libs(x86-64) = 2.8.4-4.el7 for package: audit-2.8.4-4.el7.x86_64 ---> Package audit-libs.x86_64 0:2.8.5-4.el7 will be an update --> Running transaction check ---> Package audit.x86_64 0:2.8.4-4.el7 will be updated ---> Package audit.x86_64 0:2.8.5-4.el7 will be an update --> Finished Dependency Resolution Dependencies Resolved ========================================================================================================================== Package Arch Version Repository Size ========================================================================================================================== Installing: containerd.io x86_64 1.6.8-3.1.el7 docker-ce-stable 33 M Installing for dependencies: audit-libs-python x86_64 2.8.5-4.el7 base 76 k checkpolicy x86_64 2.5-8.el7 base 295 k container-selinux noarch 2:2.119.2-1.911c772.el7_8 extras 40 k libcgroup x86_64 0.41-21.el7 base 66 k libsemanage-python x86_64 2.5-14.el7 base 113 k policycoreutils-python x86_64 2.5-34.el7 base 457 k python-IPy noarch 0.75-6.el7 base 32 k setools-libs x86_64 3.3.8-4.el7 base 620 k Updating for dependencies: audit x86_64 2.8.5-4.el7 base 256 k audit-libs x86_64 2.8.5-4.el7 base 102 k policycoreutils x86_64 2.5-34.el7 base 917 k Transaction Summary ========================================================================================================================== Install 1 Package (+8 Dependent packages) Upgrade ( 3 Dependent packages) Total download size: 36 M Downloading packages: Delta RPMs disabled because /usr/bin/applydeltarpm not installed. (1/12): audit-libs-2.8.5-4.el7.x86_64.rpm | 102 kB 00:00:00 (2/12): container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm | 40 kB 00:00:00 (3/12): libcgroup-0.41-21.el7.x86_64.rpm | 66 kB 00:00:00 (4/12): audit-2.8.5-4.el7.x86_64.rpm | 256 kB 00:00:00 (5/12): audit-libs-python-2.8.5-4.el7.x86_64.rpm | 76 kB 00:00:00 (6/12): checkpolicy-2.5-8.el7.x86_64.rpm | 295 kB 00:00:00 (7/12): libsemanage-python-2.5-14.el7.x86_64.rpm | 113 kB 00:00:00 (8/12): python-IPy-0.75-6.el7.noarch.rpm | 32 kB 00:00:00 (9/12): policycoreutils-2.5-34.el7.x86_64.rpm | 917 kB 00:00:01 (10/12): setools-libs-3.3.8-4.el7.x86_64.rpm | 620 kB 00:00:01 (11/12): policycoreutils-python-2.5-34.el7.x86_64.rpm | 457 kB 00:00:01 warning: /var/cache/yum/x86_64/7/docker-ce-stable/packages/containerd.io-1.6.8-3.1.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 621e9f35: NOKEY Public key for containerd.io-1.6.8-3.1.el7.x86_64.rpm is not installed (12/12): containerd.io-1.6.8-3.1.el7.x86_64.rpm | 33 MB 00:00:22 -------------------------------------------------------------------------------------------------------------------------- Total 1.6 MB/s | 36 MB 00:00:22 Retrieving key from https://mirrors.aliyun.com/docker-ce/linux/centos/gpg Importing GPG key 0x621E9F35: Userid : "Docker Release (CE rpm) <docker@docker.com>" Fingerprint: 060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35 From : https://mirrors.aliyun.com/docker-ce/linux/centos/gpg Running transaction check Running transaction test Transaction test succeeded Running transaction Updating : audit-libs-2.8.5-4.el7.x86_64 1/15 Updating : policycoreutils-2.5-34.el7.x86_64 2/15 Installing : audit-libs-python-2.8.5-4.el7.x86_64 3/15 Installing : setools-libs-3.3.8-4.el7.x86_64 4/15 Installing : libcgroup-0.41-21.el7.x86_64 5/15 Installing : checkpolicy-2.5-8.el7.x86_64 6/15 Installing : python-IPy-0.75-6.el7.noarch 7/15 Installing : libsemanage-python-2.5-14.el7.x86_64 8/15 Installing : policycoreutils-python-2.5-34.el7.x86_64 9/15 Installing : 2:container-selinux-2.119.2-1.911c772.el7_8.noarch 10/15 setsebool: SELinux is disabled. Installing : containerd.io-1.6.8-3.1.el7.x86_64 11/15 Updating : audit-2.8.5-4.el7.x86_64 12/15 Cleanup : policycoreutils-2.5-29.el7.x86_64 13/15 Cleanup : audit-2.8.4-4.el7.x86_64 14/15 Cleanup : audit-libs-2.8.4-4.el7.x86_64 15/15 Verifying : audit-libs-2.8.5-4.el7.x86_64 1/15 Verifying : audit-2.8.5-4.el7.x86_64 2/15 Verifying : containerd.io-1.6.8-3.1.el7.x86_64 3/15 Verifying : policycoreutils-2.5-34.el7.x86_64 4/15 Verifying : libsemanage-python-2.5-14.el7.x86_64 5/15 Verifying : 2:container-selinux-2.119.2-1.911c772.el7_8.noarch 6/15 Verifying : python-IPy-0.75-6.el7.noarch 7/15 Verifying : checkpolicy-2.5-8.el7.x86_64 8/15 Verifying : policycoreutils-python-2.5-34.el7.x86_64 9/15 Verifying : audit-libs-python-2.8.5-4.el7.x86_64 10/15 Verifying : libcgroup-0.41-21.el7.x86_64 11/15 Verifying : setools-libs-3.3.8-4.el7.x86_64 12/15 Verifying : policycoreutils-2.5-29.el7.x86_64 13/15 Verifying : audit-libs-2.8.4-4.el7.x86_64 14/15 Verifying : audit-2.8.4-4.el7.x86_64 15/15 Installed: containerd.io.x86_64 0:1.6.8-3.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 libcgroup.x86_64 0:0.41-21.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 Dependency Updated: audit.x86_64 0:2.8.5-4.el7 audit-libs.x86_64 0:2.8.5-4.el7 policycoreutils.x86_64 0:2.5-34.el7 Complete! [root@master01 ~]#
其他节点就不演示安装过程了。
(3)在master01上生成默认的containerd配置文件:
[root@master01 ~]# containerd config default > /etc/containerd/config.toml
(4)修改配置文件参数:
[root@master01 ~]# vim /etc/containerd/config.toml
......
......
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6" //此处由于国内防火墙限制,将此处的仓库修改成阿里云的仓库。
......
......
SystemdCgroup = false //将此处cgroups驱动从false修改为true,因为k8s1.24默认的驱动是systemd,容器运行时的驱动需要和k8s的驱动匹配。
......
......
(5)将步骤4中的配置文件复制到其余各k8s节点:
[root@master01 ~]# scp /etc/containerd/config.toml root@master02:/etc/containerd/
config.toml 100% 7029 7.8MB/s 00:00
[root@master01 ~]# scp /etc/containerd/config.toml root@master03:/etc/containerd/
config.toml 100% 7029 8.0MB/s 00:00
[root@master01 ~]# scp /etc/containerd/config.toml root@node01:/etc/containerd/
config.toml 100% 7029 8.1MB/s 00:00
[root@master01 ~]# scp /etc/containerd/config.toml root@node02:/etc/containerd/
config.toml 100% 7029 8.6MB/s 00:00
[root@master01 ~]# scp /etc/containerd/config.toml root@node03:/etc/containerd/
config.toml 100% 7029 7.7MB/s 00:00
[root@master01 ~]#
(6)k8s各节点启动containerd服务:
[root@master01 ~]# systemctl start containerd && systemctl enable containerd Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /usr/lib/systemd/system/containerd.service. [root@master01 ~]# [root@master02 ~]# systemctl start containerd && systemctl enable containerd Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /usr/lib/systemd/system/containerd.service. [root@master02 ~]# [root@master03 ~]# systemctl start containerd && systemctl enable containerd Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /usr/lib/systemd/system/containerd.service. [root@master03 ~]# [root@node01 ~]# systemctl start containerd && systemctl enable containerd Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /usr/lib/systemd/system/containerd.service. [root@node01 ~]# [root@node02 ~]# systemctl start containerd && systemctl enable containerd Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /usr/lib/systemd/system/containerd.service. [root@node02 ~]# [root@node03 ~]# systemctl start containerd && systemctl enable containerd Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /usr/lib/systemd/system/containerd.service. [root@node03 ~]#
到此,containerd就安装完了。
拉一个镜像测试一下:
[root@master01 ~]# ctr images pull docker.io/library/nginx:latest docker.io/library/nginx:latest: resolved |++++++++++++++++++++++++++++++++++++++| index-sha256:b95a99feebf7797479e0c5eb5ec0bdfa5d9f504bc94da550c2f58e839ea6914f: exists |++++++++++++++++++++++++++++++++++++++| manifest-sha256:89020cd33be2767f3f894484b8dd77bc2e5a1ccc864350b92c53262213257dfc: exists |++++++++++++++++++++++++++++++++++++++| layer-sha256:7247f6e5c182559e2f7c010c11506802a0259958577a6e64c31b5b8f7cb0b286: exists |++++++++++++++++++++++++++++++++++++++| layer-sha256:ca1981974b581a41cc58598a6b51580d317ac61590be75a8a63fa479e53890da: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:d4019c921e20447eea3c9658bd0780a7e3771641bf29b85f222ec3f54c11a84f: exists |++++++++++++++++++++++++++++++++++++++| layer-sha256:7cb804d746d48520f1c0322fcda93249b96b4ed0bbd7f9912b2eb21bd8da6b43: exists |++++++++++++++++++++++++++++++++++++++| layer-sha256:e7a561826262f279acf3a671b2d5684a86a8dbc48dc88e4cb65305ba4b08cae1: exists |++++++++++++++++++++++++++++++++++++++| config-sha256:2b7d6430f78d432f89109b29d88d4c36c868cdbf15dc31d2132ceaa02b993763: exists |++++++++++++++++++++++++++++++++++++++| layer-sha256:7a6db449b51b92eac5c81cdbd82917785343f1664b2be57b22337b0a40c5b29d: done |++++++++++++++++++++++++++++++++++++++| elapsed: 288.8s total: 53.2 M (188.5 KiB/s) unpacking linux/amd64 sha256:b95a99feebf7797479e0c5eb5ec0bdfa5d9f504bc94da550c2f58e839ea6914f... done: 2.066439248s [root@master01 ~]# [root@master01 ~]# ctr images ls REF TYPE DIGEST SIZE PLATFORMS LABELS docker.io/library/nginx:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:b95a99feebf7797479e0c5eb5ec0bdfa5d9f504bc94da550c2f58e839ea6914f 54.1 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x - [root@master01 ~]#
可以看到nginx镜像成功的从docker hub上拉取下来了。到此,containerd容器部署成功,功能也正常。
这里我们选择通过k8s官方自带的kubeadm工具来部署k8s集群。选择阿里云开源镜像站来安装这3个工具。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@master01 ~]# yum -y install kubeadm-1.24.2 kubectl-1.24.2 kubelet-1.24.2 --nogpgcheck
在每台k8s节点上都配置好阿里云的镜像仓库,然后安装kubeadm、kubectl、kubelet这三个工具。此处不再演示后面机器安装过程。
在每台k8s机器上启动kubelet服务。
[root@master01 ~]# systemctl start kubelet && systemctl enable kubelet Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service. [root@master01 ~]# [root@master02 ~]# systemctl start kubelet && systemctl enable kubelet Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service. [root@master02 ~]# [root@master03 ~]# systemctl start kubelet && systemctl enable kubelet Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service. [root@master03 ~]# [root@node01 ~]# systemctl start kubelet && systemctl enable kubelet Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service. [root@node01 ~]# [root@node02 ~]# systemctl start kubelet && systemctl enable kubelet Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service. [root@node02 ~]# [root@node03 ~]# systemctl start kubelet && systemctl enable kubelet Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service. [root@node03 ~]#
在上一步安装完k8s的这3个工具之后,cri-tools工具包也作为依赖包一起安装上去了。其中crictl命令就是由cri-tools工具包提供的。
但是运行crictl命令时,提示警告:
[root@master01 ~]# crictl version
WARN[0000] runtime connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.
ERRO[0000] unable to determine runtime API version: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory"
Version: 0.1.0
RuntimeName: containerd
RuntimeVersion: 1.6.8
RuntimeApiVersion: v1
[root@master01 ~]#
这是因为默认的crictl工具的cri接口指向的是dockershim,而在1.24版本中已经没有了dockershim接口,所以我们得配置一下,将接口修改为containerd接口
[root@master01 ~]# vim /etc/crictl.yaml //在/etc/下新建一个crictl.yaml文件
runtime-endpoint: unix:///var/run/dockershim.sock //这是官方提供的默认接口配置,将这里修改为var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/dockershim.sock //同上,修改接口配置
timeout: 2
debug: true //把debug功能给关闭掉,修改为true
pull-image-on-create: false
上述配置修改完成后如下:
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 2
debug: false
pull-image-on-create: false
运行crictl命令:
[root@master01 ~]# crictl version
Version: 0.1.0
RuntimeName: containerd
RuntimeVersion: 1.6.8
RuntimeApiVersion: v1
[root@master01 ~]#
可以看到,没有警告了。
接下来将这个文件复制到其他k8s节点上的/etc/下:
[root@master01 ~]# scp /etc/crictl.yaml root@master02:/etc/
crictl.yaml 100% 172 246.0KB/s 00:00
[root@master01 ~]# scp /etc/crictl.yaml root@master03:/etc/
crictl.yaml 100% 172 203.6KB/s 00:00
[root@master01 ~]# scp /etc/crictl.yaml root@node01:/etc/
crictl.yaml 100% 172 249.8KB/s 00:00
[root@master01 ~]# scp /etc/crictl.yaml root@node02:/etc/
crictl.yaml 100% 172 282.2KB/s 00:00
[root@master01 ~]# scp /etc/crictl.yaml root@node03:/etc/
crictl.yaml 100% 172 191.5KB/s 00:00
[root@master01 ~]#
到此,crictl命令就配置完成了,其余节点可以正常使用此命令了。
在初始化时,kubeadm会从k8s.gcr.io这个站点上去拉取镜像。如果提前把这些组件镜像都拉取下来了,那在初始化时就不需要再去拉取了。当然,如果不提前拉取下来的话也没事,初始化时会自动拉取下来,这个看个人选择。这里我们提前拉取下来。
另外:k8s.gcr.io这个站点是谷歌官方镜像站点,在国内网络环境中是无法拉取到的,需要通过科学上网的方式来拉取镜像。这里我选择通过阿里云提供的谷歌镜像仓库来拉取镜像。阿里云谷歌镜像仓库:registry.cn-hangzhou.aliyuncs.com/google_containers
在每台k8s节点上拉取组件镜像,选择1.24.2的版本:
[root@master01 ~]# kubeadm config images list --kubernetes-version 1.24.2 //查看1.24.2版本的所有组件镜像及其版本 k8s.gcr.io/kube-apiserver:v1.24.2 k8s.gcr.io/kube-controller-manager:v1.24.2 k8s.gcr.io/kube-scheduler:v1.24.2 k8s.gcr.io/kube-proxy:v1.24.2 k8s.gcr.io/pause:3.7 k8s.gcr.io/etcd:3.5.3-0 k8s.gcr.io/coredns/coredns:v1.8.6 [root@master01 ~]# [root@master01 ~]# kubeadm config images pull --kubernetes-version 1.24.2 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers //拉取1.24.2版本的所有组件镜像 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.3-0 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 [root@master01 ~]# [root@master02 ~]# kubeadm config images pull --kubernetes-version 1.24.2 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.3-0 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 [root@master02 ~]# [root@master03 ~]# kubeadm config images pull --kubernetes-version 1.24.2 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.3-0 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 [root@master03 ~]# [root@node01 ~]# kubeadm config images pull --kubernetes-version 1.24.2 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.3-0 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 [root@node01 ~]# [root@node02 ~]# kubeadm config images pull --kubernetes-version 1.24.2 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.3-0 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 [root@node02 ~]# [root@node03 ~]# kubeadm config images pull --kubernetes-version 1.24.2 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.2 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.3-0 [config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 [root@node03 ~]#
使用kubeadm初始化k8s集群有两种方式:
这里我们选择生成配置文件来初始化集群。
(1)这里以master01作为初始化节点,生成k8s默认配置文件;
[root@master01 ~]# kubeadm config print init-defaults --component-configs KubeProxyConfiguration,KubeletConfiguration > /root/init.yaml
[root@master01 ~]#
[root@master01 ~]# ls
anaconda-ks.cfg init.yaml
[root@master01 ~]#
说明:使用 kubeadm config print init-defaults > /root/init.yaml也可以,只是上面那条命令输出的配置信息更详细而已。
(2)配置init.yaml文件:
[root@master01 ~]# vim init.yaml apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.31.183 //此处修改为初始化节点的IP地址,即哪台节点初始化就填写哪台节点的IP. bindPort: 6443 nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock //此处修改容器运行时的sock,如果是containerd的话默认无需修改。 imagePullPolicy: IfNotPresent //默认无需修改。如果本地有镜像不想使用仓库的话可以修改为Never。 name: master01 //此处一般情况下可修改为初始化节点的主机名。我这里就是如此。 taints: null --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd: local: dataDir: /var/lib/etcd imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers //此处修改仓库为阿里云的仓库地址,如果是外网环境则无需修改 kind: ClusterConfiguration kubernetesVersion: 1.24.2 //此处修改k8s的版本为1.24.2 controlPlaneEndpoint: test.k8s.local:6443 //此处需要添加这个参数,并将其的值设置为VIP:6443或者域名:6443,两者都可以,我这里使用的是VIP对应的域名。 networking: dnsDomain: cluster.local serviceSubnet: 10.1.0.0/16 //此处修改与否无所谓,如果有自己的网络规划,那就修改 podSubnet: 172.16.0.0/16 //此处修改与否无所谓,如果有自己的网络规划,那就修改 scheduler: {} --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 bindAddress: 0.0.0.0 bindAddressHardFail: false clientConnection: acceptContentTypes: "" burst: 0 contentType: "" kubeconfig: /var/lib/kube-proxy/kubeconfig.conf qps: 0 clusterCIDR: "" configSyncPeriod: 0s conntrack: maxPerCore: null min: null tcpCloseWaitTimeout: null tcpEstablishedTimeout: null detectLocal: bridgeInterface: "" interfaceNamePrefix: "" detectLocalMode: "" enableProfiling: false healthzBindAddress: "" hostnameOverride: "" iptables: masqueradeAll: false masqueradeBit: null minSyncPeriod: 0s syncPeriod: 0s ipvs: excludeCIDRs: null minSyncPeriod: 0s scheduler: "" strictARP: false syncPeriod: 0s tcpFinTimeout: 0s tcpTimeout: 0s udpTimeout: 0s kind: KubeProxyConfiguration metricsBindAddress: "" mode: "ipvs" //此处默认不修改也行,我这里修改为了ipvs模式。 nodePortAddresses: null oomScoreAdj: null portRange: "" showHiddenMetricsForVersion: "" udpIdleTimeout: 0s winkernel: enableDSR: false forwardHealthCheckVip: false networkName: "" rootHnsEndpointName: "" sourceVip: "" --- apiVersion: kubelet.config.k8s.io/v1beta1 authentication: anonymous: enabled: false webhook: cacheTTL: 0s enabled: true x509: clientCAFile: /etc/kubernetes/pki/ca.crt authorization: mode: Webhook webhook: cacheAuthorizedTTL: 0s cacheUnauthorizedTTL: 0s cgroupDriver: systemd //此处设置cgroups的值为systemd,与容器运行时containerd的cgroups保持一致。k8s-1.24版本默认就是systemd,所以此处无需修改 clusterDNS: - 10.1.0.10 clusterDomain: cluster.local cpuManagerReconcilePeriod: 0s evictionPressureTransitionPeriod: 0s fileCheckFrequency: 0s healthzBindAddress: 127.0.0.1 healthzPort: 10248 httpCheckFrequency: 0s imageMinimumGCAge: 0s kind: KubeletConfiguration logging: flushFrequency: 0 options: json: infoBufferSize: "0" verbosity: 0 memorySwap: {} nodeStatusReportFrequency: 0s nodeStatusUpdateFrequency: 0s rotateCertificates: true runtimeRequestTimeout: 0s shutdownGracePeriod: 0s shutdownGracePeriodCriticalPods: 0s staticPodPath: /etc/kubernetes/manifests streamingConnectionIdleTimeout: 0s syncFrequency: 0s volumeStatsAggPeriod: 0s
说明:本人也是初学者,对里面的很多参数都不明白,我只修改了我认为需要修改的部分,之前在网上找了一些答案,有些需要修改证书的部分,这里我没有修改。我个人觉得除了上述需要修改的部分之外,其余的保持默认即可。
上述准备工作都准备好后,接下来开始初始化k8s集群。
在初始化节点上操作,我这里就在master01上操作:
[root@master01 ~]# [root@master01 ~]# kubeadm init --config init.yaml --upload-certs [init] Using Kubernetes version: v1.24.2 [preflight] Running pre-flight checks [preflight] Pulling images required for setting up a Kubernetes cluster [preflight] This might take a minute or two, depending on the speed of your internet connection [preflight] You can also perform this action in beforehand using 'kubeadm config images pull' [certs] Using certificateDir folder "/etc/kubernetes/pki" [certs] Generating "ca" certificate and key [certs] Generating "apiserver" certificate and key [certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master01 test.k8s.local] and IPs [10.1.0.1 192.168.31.183] [certs] Generating "apiserver-kubelet-client" certificate and key [certs] Generating "front-proxy-ca" certificate and key [certs] Generating "front-proxy-client" certificate and key [certs] Generating "etcd/ca" certificate and key [certs] Generating "etcd/server" certificate and key [certs] etcd/server serving cert is signed for DNS names [localhost master01] and IPs [192.168.31.183 127.0.0.1 ::1] [certs] Generating "etcd/peer" certificate and key [certs] etcd/peer serving cert is signed for DNS names [localhost master01] and IPs [192.168.31.183 127.0.0.1 ::1] [certs] Generating "etcd/healthcheck-client" certificate and key [certs] Generating "apiserver-etcd-client" certificate and key [certs] Generating "sa" key and public key [kubeconfig] Using kubeconfig folder "/etc/kubernetes" [kubeconfig] Writing "admin.conf" kubeconfig file [kubeconfig] Writing "kubelet.conf" kubeconfig file [kubeconfig] Writing "controller-manager.conf" kubeconfig file [kubeconfig] Writing "scheduler.conf" kubeconfig file [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Starting the kubelet [control-plane] Using manifest folder "/etc/kubernetes/manifests" [control-plane] Creating static Pod manifest for "kube-apiserver" [control-plane] Creating static Pod manifest for "kube-controller-manager" [control-plane] Creating static Pod manifest for "kube-scheduler" [etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests" [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s [apiclient] All control plane components are healthy after 9.536906 seconds [upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace [kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster [upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace [upload-certs] Using certificate key: 861bfee64f09ab362d5dcfa9275138b12269235a3d38348023563889fe8d960d [mark-control-plane] Marking the node master01 as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers] [mark-control-plane] Marking the node master01 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule node-role.kubernetes.io/control-plane:NoSchedule] [bootstrap-token] Using token: abcdef.0123456789abcdef [bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles [bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes [bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials [bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token [bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster [bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace [kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key [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/ You can now join any number of the control-plane node running the following command on each as root: kubeadm join test.k8s.local:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:e5808eb8dff8994dac64135375842ab5aea3c979901b325be559ae0b23002681 \ --control-plane --certificate-key 861bfee64f09ab362d5dcfa9275138b12269235a3d38348023563889fe8d960d Please note that the certificate-key gives access to cluster sensitive data, keep it secret! As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use "kubeadm init phase upload-certs --upload-certs" to reload certs afterward. Then you can join any number of worker nodes by running the following on each as root: kubeadm join test.k8s.local:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:e5808eb8dff8994dac64135375842ab5aea3c979901b325be559ae0b23002681 [root@master01 ~]#
根据上面的初始化输出日志中可以看到:
当看到 “Your Kubernetes control-plane has initialized successfully!” ,就说明在master01上已经初始化成功了。
接下来,按照提示中的日志信息,配置master01的kubectl命令:
[root@master01 ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@master01 ~]#
[root@master01 ~]#
[root@master01 ~]# pwd
/root
[root@master01 ~]#
[root@master01 ~]# mkdir -p .kube
[root@master01 ~]# cp -i /etc/kubernetes/admin.conf .kube/config
[root@master01 ~]# ll .kube/
total 8
-rw------- 1 root root 5638 Aug 31 14:47 config
[root@master01 ~]#
配置环境变量:
[root@master01 ~]# vim .bashrc
......
......
export KUBECONFIG=/etc/kubernetes/admin.conf //在文件末尾添加
[root@master01 ~]# source .bashrc //让其生效
[root@master01 ~]#
配置完成后,使用kubectl命令查看节点状态:
[root@master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 NotReady control-plane 9m36s v1.24.2
[root@master01 ~]#
可以看到,目前master01节点的状态处于NotReady状态,为什么会是这个状态呢,是因为还没有安装网络插件。当网络插件安装完成后,master01节点的状态就会从NotReady转变成Ready状态。
这里我们选择安装calico网络。
calico官方网站在这里:https://projectcalico.docs.tigera.io/getting-started/kubernetes/self-managed-onprem/onpremises
按照官方网站上的官方文档步骤安装即可。
(1)从官网上下载calico.yaml文件,即网络配置清单:
[root@VM-12-14-centos ~]# curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico-typha.yaml -o calico.yaml
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 233k 100 233k 0 0 21950 0 0:00:10 0:00:10 --:--:-- 21350
[root@VM-12-14-centos ~]#
[root@VM-12-14-centos ~]# ls calico.yaml
calico.yaml
[root@VM-12-14-centos ~]#
这里由于我本地网络原因,使用官方提供的URL无法下载,所以我使用了我的公有云环境来下载这个文件,下载完成后,将这个文件下载到本地,然后上传至master01上即可。
(2)修改网络配置清单:
[root@master01 ~]# vim calico.yaml
......
......
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
......
......
说明:对于calico网络而言,其使用的默认网段是192.168.0.0/16,对于CIDR而言,官方给出的解释如下:
官方给出的解释是:如果使用的就是192.168.0.0/16,无需更改网络,如果使用kubeadm部署,并且使用的是其他网络,也不用更改,calico在部署时会自动检测CIDR。但是如果是使用其他平台或者工具来初始化k8s集群,则需要修改网络。
那此处我们也不做更改,按照官方的解释,在部署calico时会自动检测我们的pod网络为172.16.0.0/16。
如果需要自定义,则根据自行需要去修改此配置文件,我这里都保持默认。
(3)应用网络清单:
[root@master01 ~]# kubectl apply -f /root/calico.yaml poddisruptionbudget.policy/calico-kube-controllers created poddisruptionbudget.policy/calico-typha created serviceaccount/calico-kube-controllers created serviceaccount/calico-node created configmap/calico-config created customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created clusterrole.rbac.authorization.k8s.io/calico-node created clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created clusterrolebinding.rbac.authorization.k8s.io/calico-node created service/calico-typha created daemonset.apps/calico-node created deployment.apps/calico-kube-controllers created deployment.apps/calico-typha created [root@master01 ~]#
到此,网络插件就部署完成了。接下来,master01会拉取calico镜像,然后部署pod,当这一切都完成后,通过kubectl命令去查看节点状态:
[root@master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 93m v1.24.2
[root@master01 ~]#
可以看到master01节点的状态已经变成Ready状态了。
这里我们剩下master02和master03两台控制节点,现在要将这两台控制节点添加至集群中。
[root@master02 ~]# kubeadm join test.k8s.local:6443 --token abcdef.0123456789abcdef \ > --discovery-token-ca-cert-hash sha256:e5808eb8dff8994dac64135375842ab5aea3c979901b325be559ae0b23002681 \ > --control-plane --certificate-key 861bfee64f09ab362d5dcfa9275138b12269235a3d38348023563889fe8d960d [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' [preflight] Running pre-flight checks before initializing the new control plane instance [preflight] Pulling images required for setting up a Kubernetes cluster [preflight] This might take a minute or two, depending on the speed of your internet connection [preflight] You can also perform this action in beforehand using 'kubeadm config images pull' [download-certs] Downloading the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace [certs] Using certificateDir folder "/etc/kubernetes/pki" [certs] Generating "apiserver" certificate and key [certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master02 test.k8s.local] and IPs [10.1.0.1 192.168.31.185] [certs] Generating "apiserver-kubelet-client" certificate and key [certs] Generating "front-proxy-client" certificate and key [certs] Generating "etcd/server" certificate and key [certs] etcd/server serving cert is signed for DNS names [localhost master02] and IPs [192.168.31.185 127.0.0.1 ::1] [certs] Generating "apiserver-etcd-client" certificate and key [certs] Generating "etcd/peer" certificate and key [certs] etcd/peer serving cert is signed for DNS names [localhost master02] and IPs [192.168.31.185 127.0.0.1 ::1] [certs] Generating "etcd/healthcheck-client" certificate and key [certs] Valid certificates and keys now exist in "/etc/kubernetes/pki" [certs] Using the existing "sa" key [kubeconfig] Generating kubeconfig files [kubeconfig] Using kubeconfig folder "/etc/kubernetes" [kubeconfig] Writing "admin.conf" kubeconfig file [kubeconfig] Writing "controller-manager.conf" kubeconfig file [kubeconfig] Writing "scheduler.conf" kubeconfig file [control-plane] Using manifest folder "/etc/kubernetes/manifests" [control-plane] Creating static Pod manifest for "kube-apiserver" [control-plane] Creating static Pod manifest for "kube-controller-manager" [control-plane] Creating static Pod manifest for "kube-scheduler" [check-etcd] Checking that the etcd cluster is healthy [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... [etcd] Announced new etcd member joining to the existing etcd cluster [etcd] Creating static Pod manifest for "etcd" [etcd] Waiting for the new etcd member to join the cluster. This can take up to 40s The 'update-status' phase is deprecated and will be removed in a future release. Currently it performs no operation [mark-control-plane] Marking the node master02 as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers] [mark-control-plane] Marking the node master02 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule node-role.kubernetes.io/control-plane:NoSchedule] This node has joined the cluster and a new control plane instance was created: * Certificate signing request was sent to apiserver and approval was received. * The Kubelet was informed of the new secure connection details. * Control plane label and taint were applied to the new node. * The Kubernetes control plane instances scaled up. * A new etcd member was added to the local/stacked etcd cluster. To start administering your cluster from this node, 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 Run 'kubectl get nodes' to see this node join the cluster. [root@master02 ~]# [root@master02 ~]# mkdir -p .kube [root@master02 ~]# cp -i /etc/kubernetes/admin.conf .kube/config [root@master02 ~]# ll .kube/config -rw------- 1 root root 5638 Aug 31 16:22 .kube/config [root@master02 ~]# [root@master02 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready control-plane 104m v1.24.2 master02 NotReady control-plane 66s v1.24.2 [root@master03 ~]# kubeadm join test.k8s.local:6443 --token abcdef.0123456789abcdef \ > --discovery-token-ca-cert-hash sha256:e5808eb8dff8994dac64135375842ab5aea3c979901b325be559ae0b23002681 \ > --control-plane --certificate-key e27b2c2001d6f8276c5452515acf65cdd54127627eae029c8600e692f5cb9434 [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' [preflight] Running pre-flight checks before initializing the new control plane instance [preflight] Pulling images required for setting up a Kubernetes cluster [preflight] This might take a minute or two, depending on the speed of your internet connection [preflight] You can also perform this action in beforehand using 'kubeadm config images pull' [download-certs] Downloading the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace [certs] Using certificateDir folder "/etc/kubernetes/pki" [certs] Generating "etcd/server" certificate and key [certs] etcd/server serving cert is signed for DNS names [localhost master03] and IPs [192.168.31.247 127.0.0.1 ::1] [certs] Generating "etcd/peer" certificate and key [certs] etcd/peer serving cert is signed for DNS names [localhost master03] and IPs [192.168.31.247 127.0.0.1 ::1] [certs] Generating "etcd/healthcheck-client" certificate and key [certs] Generating "apiserver-etcd-client" certificate and key [certs] Generating "apiserver" certificate and key [certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master03 test.k8s.local] and IPs [10.1.0.1 192.168.31.247] [certs] Generating "apiserver-kubelet-client" certificate and key [certs] Generating "front-proxy-client" certificate and key [certs] Valid certificates and keys now exist in "/etc/kubernetes/pki" [certs] Using the existing "sa" key [kubeconfig] Generating kubeconfig files [kubeconfig] Using kubeconfig folder "/etc/kubernetes" [kubeconfig] Writing "admin.conf" kubeconfig file [kubeconfig] Writing "controller-manager.conf" kubeconfig file [kubeconfig] Writing "scheduler.conf" kubeconfig file [control-plane] Using manifest folder "/etc/kubernetes/manifests" [control-plane] Creating static Pod manifest for "kube-apiserver" [control-plane] Creating static Pod manifest for "kube-controller-manager" [control-plane] Creating static Pod manifest for "kube-scheduler" [check-etcd] Checking that the etcd cluster is healthy [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... [etcd] Announced new etcd member joining to the existing etcd cluster [etcd] Creating static Pod manifest for "etcd" [etcd] Waiting for the new etcd member to join the cluster. This can take up to 40s The 'update-status' phase is deprecated and will be removed in a future release. Currently it performs no operation [mark-control-plane] Marking the node master03 as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers] [mark-control-plane] Marking the node master03 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule node-role.kubernetes.io/control-plane:NoSchedule] This node has joined the cluster and a new control plane instance was created: * Certificate signing request was sent to apiserver and approval was received. * The Kubelet was informed of the new secure connection details. * Control plane label and taint were applied to the new node. * The Kubernetes control plane instances scaled up. * A new etcd member was added to the local/stacked etcd cluster. To start administering your cluster from this node, 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 Run 'kubectl get nodes' to see this node join the cluster. [root@master03 ~]# [root@master03 ~]# mkdir -p .kube [root@master03 ~]# cp -i /etc/kubernetes/admin.conf .kube/config [root@master03 ~]# ll .kube/config -rw------- 1 root root 5642 Aug 31 17:57 .kube/config [root@master03 ~]#
说明:在将master03节点添加至集群时,由于超时,导致之前的证书不可用,后面在已经初始化好了的控制节点上执行 “kubeadm init phase upload-certs --upload-certs” 跟新了证书,并将原有初始化命令中的证书替换为新的证书之后才将master03加入集群中。
到此,控制节点就添加完毕了。
这里将node01、node02、node03都添加至集群中去。
[root@node01 ~]# kubeadm join test.k8s.local:6443 --token abcdef.0123456789abcdef \ > --discovery-token-ca-cert-hash sha256:e5808eb8dff8994dac64135375842ab5aea3c979901b325be559ae0b23002681 [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. [root@node02 ~]# kubeadm join test.k8s.local:6443 --token abcdef.0123456789abcdef \ > --discovery-token-ca-cert-hash sha256:e5808eb8dff8994dac64135375842ab5aea3c979901b325be559ae0b23002681 [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. [root@node03 ~]# kubeadm join test.k8s.local:6443 --token abcdef.0123456789abcdef \ > --discovery-token-ca-cert-hash sha256:e5808eb8dff8994dac64135375842ab5aea3c979901b325be559ae0b23002681 [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.
在控制节点上查看所有节点状态:
[root@master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 3h31m v1.24.2
master02 Ready control-plane 108m v1.24.2
master03 Ready control-plane 12m v1.24.2
node01 Ready <none> 3m55s v1.24.2
node02 Ready <none> 3m12s v1.24.2
node03 Ready <none> 2m53s v1.24.2
[root@master01 ~]#
到此,所有node节点就添加到集群中去了。
node节点默认情况下是无法执行kubectl命令的,为了方便运行和管理,我们这里配置一下node节点的kubectl命令,这个步骤不是必要的。
将master01上的/root/.kube目录整体复制到3台node节点上去:
[root@master01 ~]# scp -r .kube root@node01:/root/ config 100% 5638 3.9MB/s 00:00 1ef8d4ac67cfe377cb785b047f880eaa 100% 471 275.0KB/s 00:00 5df247d6fae725450d1a7ee91b226aa3 100% 4232 3.4MB/s 00:00 a32d123dc92e912912d8fb2245c1ca14 100% 1153 928.7KB/s 00:00 fbcd7d7a8c57f448f8bdce522bdb52f5 100% 1324 1.5MB/s 00:00 470b73fdf54ff009c4672d4597baf7b0 100% 2531 2.5MB/s 00:00 a56404c52bc11a79e37cdf3cdf28eab8 100% 925 1.0MB/s 00:00 802d5446bbc98ecad76d460ad3779cfe 100% 659 726.0KB/s 00:00 b37b933cae84962917e65a9d268d2193 100% 650 696.3KB/s 00:00 f14c93da8741734aa6e7564f1e70633b 100% 636 745.4KB/s 00:00 593f58602047370c87c89d1fced9f50b 100% 623 695.0KB/s 00:00 3346ed91eaed45fc058b13325792f3ff 100% 796 1.0MB/s 00:00 743223a773f82cbc08bb47c8b6227bed 100% 772 851.0KB/s 00:00 b85b8b75ebdd81ed7e9954e5b3255543 100% 843 722.7KB/s 00:00 5933660946488900043010001319fa6d 100% 1038 1.5MB/s 00:00 0ff88ea1d3029770832841dc65b995a8 100% 1249 755.2KB/s 00:00 fafafa2f3233d7352594a94c438cb5c4 100% 1611 1.3MB/s 00:00 a345a621db82d2be90dd1f9214a64119 100% 536 495.4KB/s 00:00 479486fab926eca5569777289e46f5d8 100% 636 558.8KB/s 00:00 adcffc60aa284ab300431765a7d0b2bd 100% 1153 1.1MB/s 00:00 87bcd940e05514802e8fe41150682ff0 100% 871 725.6KB/s 00:00 676403b75b8d08e100c473696e6540c3 100% 843 936.6KB/s 00:00 9e3592efeea035176e6c27b91f7acd4f 100% 987 783.6KB/s 00:00 4aaf5895ed430f3e5f1ee0a1bf692283 100% 838 813.3KB/s 00:00 7e39391da245d0659ab51e9ccf3fa767 100% 631 657.3KB/s 00:00 f3769aebc450e8ff25482ee0fdb8afde 100% 641 827.0KB/s 00:00 4aa1c59d82b2536dd0f69e3dd4dce0c9 100% 637 742.9KB/s 00:00 2d0a5180bafe99b457acd5680b55372d 100% 1079 1.3MB/s 00:00 4a19e97af0f5967927bbf130a510267c 100% 789 452.7KB/s 00:00 3c53b0f4682ef619eaeb7f9ee1b3396b 100% 6535 1.8MB/s 00:00 d14624dc4e6329a5a78d4ecb6203c4b8 100% 984 827.9KB/s 00:00 790bca15e979cc785e59f5a808d9c53a 100% 642 581.5KB/s 00:00 10e839af326ca6d661db1ec8359d6f05 100% 838 924.3KB/s 00:00 638673934fe86293f2499d98b5b65837 100% 2887KB 117.6MB/s 00:00 servergroups.json 100% 4015 1.0MB/s 00:00 serverresources.json 100% 819 891.4KB/s 00:00 serverresources.json 100% 819 1.3MB/s 00:00 serverresources.json 100% 990 789.7KB/s 00:00 serverresources.json 100% 2196 2.0MB/s 00:00 serverresources.json 100% 591 899.0KB/s 00:00 serverresources.json 100% 325 469.1KB/s 00:00 serverresources.json 100% 316 432.0KB/s 00:00 serverresources.json 100% 1276 2.3MB/s 00:00 serverresources.json 100% 302 349.7KB/s 00:00 serverresources.json 100% 307 425.0KB/s 00:00 serverresources.json 100% 289 262.2KB/s 00:00 serverresources.json 100% 462 548.7KB/s 00:00 serverresources.json 100% 704 1.1MB/s 00:00 serverresources.json 100% 438 626.9KB/s 00:00 serverresources.json 100% 745 884.7KB/s 00:00 serverresources.json 100% 509 502.5KB/s 00:00 serverresources.json 100% 509 709.7KB/s 00:00 serverresources.json 100% 504 828.4KB/s 00:00 serverresources.json 100% 504 606.8KB/s 00:00 serverresources.json 100% 915 1.1MB/s 00:00 serverresources.json 100% 202 254.6KB/s 00:00 serverresources.json 100% 302 475.5KB/s 00:00 serverresources.json 100% 297 320.7KB/s 00:00 serverresources.json 100% 537 793.9KB/s 00:00 serverresources.json 100% 653 1.0MB/s 00:00 serverresources.json 100% 303 535.6KB/s 00:00 serverresources.json 100% 308 514.6KB/s 00:00 serverresources.json 100% 455 635.6KB/s 00:00 serverresources.json 100% 6221 9.5MB/s 00:00 serverresources.json 100% 650 909.7KB/s 00:00 [root@master01 ~]# [root@master01 ~]# scp -r .kube root@node02:/root/ config 100% 5638 5.5MB/s 00:00 1ef8d4ac67cfe377cb785b047f880eaa 100% 471 404.0KB/s 00:00 5df247d6fae725450d1a7ee91b226aa3 100% 4232 4.8MB/s 00:00 a32d123dc92e912912d8fb2245c1ca14 100% 1153 1.6MB/s 00:00 fbcd7d7a8c57f448f8bdce522bdb52f5 100% 1324 1.9MB/s 00:00 470b73fdf54ff009c4672d4597baf7b0 100% 2531 3.5MB/s 00:00 a56404c52bc11a79e37cdf3cdf28eab8 100% 925 1.2MB/s 00:00 802d5446bbc98ecad76d460ad3779cfe 100% 659 649.4KB/s 00:00 b37b933cae84962917e65a9d268d2193 100% 650 804.5KB/s 00:00 f14c93da8741734aa6e7564f1e70633b 100% 636 529.7KB/s 00:00 593f58602047370c87c89d1fced9f50b 100% 623 1.0MB/s 00:00 3346ed91eaed45fc058b13325792f3ff 100% 796 1.3MB/s 00:00 743223a773f82cbc08bb47c8b6227bed 100% 772 1.2MB/s 00:00 b85b8b75ebdd81ed7e9954e5b3255543 100% 843 1.5MB/s 00:00 5933660946488900043010001319fa6d 100% 1038 1.5MB/s 00:00 0ff88ea1d3029770832841dc65b995a8 100% 1249 2.0MB/s 00:00 fafafa2f3233d7352594a94c438cb5c4 100% 1611 2.2MB/s 00:00 a345a621db82d2be90dd1f9214a64119 100% 536 791.3KB/s 00:00 479486fab926eca5569777289e46f5d8 100% 636 793.5KB/s 00:00 adcffc60aa284ab300431765a7d0b2bd 100% 1153 414.4KB/s 00:00 87bcd940e05514802e8fe41150682ff0 100% 871 1.0MB/s 00:00 676403b75b8d08e100c473696e6540c3 100% 843 1.2MB/s 00:00 9e3592efeea035176e6c27b91f7acd4f 100% 987 1.5MB/s 00:00 4aaf5895ed430f3e5f1ee0a1bf692283 100% 838 1.3MB/s 00:00 7e39391da245d0659ab51e9ccf3fa767 100% 631 871.3KB/s 00:00 f3769aebc450e8ff25482ee0fdb8afde 100% 641 795.7KB/s 00:00 4aa1c59d82b2536dd0f69e3dd4dce0c9 100% 637 391.2KB/s 00:00 2d0a5180bafe99b457acd5680b55372d 100% 1079 1.3MB/s 00:00 4a19e97af0f5967927bbf130a510267c 100% 789 1.2MB/s 00:00 3c53b0f4682ef619eaeb7f9ee1b3396b 100% 6535 6.1MB/s 00:00 d14624dc4e6329a5a78d4ecb6203c4b8 100% 984 308.5KB/s 00:00 790bca15e979cc785e59f5a808d9c53a 100% 642 572.5KB/s 00:00 10e839af326ca6d661db1ec8359d6f05 100% 838 884.0KB/s 00:00 638673934fe86293f2499d98b5b65837 100% 2887KB 93.8MB/s 00:00 servergroups.json 100% 4015 4.2MB/s 00:00 serverresources.json 100% 819 753.9KB/s 00:00 serverresources.json 100% 819 1.0MB/s 00:00 serverresources.json 100% 990 1.2MB/s 00:00 serverresources.json 100% 2196 2.5MB/s 00:00 serverresources.json 100% 591 737.0KB/s 00:00 serverresources.json 100% 325 384.4KB/s 00:00 serverresources.json 100% 316 388.1KB/s 00:00 serverresources.json 100% 1276 1.1MB/s 00:00 serverresources.json 100% 302 281.3KB/s 00:00 serverresources.json 100% 307 497.4KB/s 00:00 serverresources.json 100% 289 496.4KB/s 00:00 serverresources.json 100% 462 796.1KB/s 00:00 serverresources.json 100% 704 1.1MB/s 00:00 serverresources.json 100% 438 564.2KB/s 00:00 serverresources.json 100% 745 752.4KB/s 00:00 serverresources.json 100% 509 584.6KB/s 00:00 serverresources.json 100% 509 741.8KB/s 00:00 serverresources.json 100% 504 852.9KB/s 00:00 serverresources.json 100% 504 728.2KB/s 00:00 serverresources.json 100% 915 1.2MB/s 00:00 serverresources.json 100% 202 198.9KB/s 00:00 serverresources.json 100% 302 356.9KB/s 00:00 serverresources.json 100% 297 331.5KB/s 00:00 serverresources.json 100% 537 590.9KB/s 00:00 serverresources.json 100% 653 685.8KB/s 00:00 serverresources.json 100% 303 326.6KB/s 00:00 serverresources.json 100% 308 358.5KB/s 00:00 serverresources.json 100% 455 568.6KB/s 00:00 serverresources.json 100% 6221 5.3MB/s 00:00 serverresources.json 100% 650 792.4KB/s 00:00 [root@master01 ~]# scp -r .kube root@node03:/root/ config 100% 5638 5.5MB/s 00:00 1ef8d4ac67cfe377cb785b047f880eaa 100% 471 464.3KB/s 00:00 5df247d6fae725450d1a7ee91b226aa3 100% 4232 5.7MB/s 00:00 a32d123dc92e912912d8fb2245c1ca14 100% 1153 1.4MB/s 00:00 fbcd7d7a8c57f448f8bdce522bdb52f5 100% 1324 1.9MB/s 00:00 470b73fdf54ff009c4672d4597baf7b0 100% 2531 3.6MB/s 00:00 a56404c52bc11a79e37cdf3cdf28eab8 100% 925 1.5MB/s 00:00 802d5446bbc98ecad76d460ad3779cfe 100% 659 384.7KB/s 00:00 b37b933cae84962917e65a9d268d2193 100% 650 830.0KB/s 00:00 f14c93da8741734aa6e7564f1e70633b 100% 636 1.1MB/s 00:00 593f58602047370c87c89d1fced9f50b 100% 623 668.6KB/s 00:00 3346ed91eaed45fc058b13325792f3ff 100% 796 1.1MB/s 00:00 743223a773f82cbc08bb47c8b6227bed 100% 772 1.0MB/s 00:00 b85b8b75ebdd81ed7e9954e5b3255543 100% 843 964.7KB/s 00:00 5933660946488900043010001319fa6d 100% 1038 1.3MB/s 00:00 0ff88ea1d3029770832841dc65b995a8 100% 1249 1.7MB/s 00:00 fafafa2f3233d7352594a94c438cb5c4 100% 1611 2.1MB/s 00:00 a345a621db82d2be90dd1f9214a64119 100% 536 950.4KB/s 00:00 479486fab926eca5569777289e46f5d8 100% 636 546.1KB/s 00:00 adcffc60aa284ab300431765a7d0b2bd 100% 1153 350.4KB/s 00:00 87bcd940e05514802e8fe41150682ff0 100% 871 930.7KB/s 00:00 676403b75b8d08e100c473696e6540c3 100% 843 1.1MB/s 00:00 9e3592efeea035176e6c27b91f7acd4f 100% 987 1.6MB/s 00:00 4aaf5895ed430f3e5f1ee0a1bf692283 100% 838 1.2MB/s 00:00 7e39391da245d0659ab51e9ccf3fa767 100% 631 826.9KB/s 00:00 f3769aebc450e8ff25482ee0fdb8afde 100% 641 946.4KB/s 00:00 4aa1c59d82b2536dd0f69e3dd4dce0c9 100% 637 915.5KB/s 00:00 2d0a5180bafe99b457acd5680b55372d 100% 1079 1.6MB/s 00:00 4a19e97af0f5967927bbf130a510267c 100% 789 1.1MB/s 00:00 3c53b0f4682ef619eaeb7f9ee1b3396b 100% 6535 7.7MB/s 00:00 d14624dc4e6329a5a78d4ecb6203c4b8 100% 984 1.7MB/s 00:00 790bca15e979cc785e59f5a808d9c53a 100% 642 971.0KB/s 00:00 10e839af326ca6d661db1ec8359d6f05 100% 838 1.1MB/s 00:00 638673934fe86293f2499d98b5b65837 100% 2887KB 86.5MB/s 00:00 servergroups.json 100% 4015 976.3KB/s 00:00 serverresources.json 100% 819 1.0MB/s 00:00 serverresources.json 100% 819 1.2MB/s 00:00 serverresources.json 100% 990 1.5MB/s 00:00 serverresources.json 100% 2196 2.0MB/s 00:00 serverresources.json 100% 591 580.2KB/s 00:00 serverresources.json 100% 325 157.4KB/s 00:00 serverresources.json 100% 316 330.3KB/s 00:00 serverresources.json 100% 1276 1.9MB/s 00:00 serverresources.json 100% 302 264.3KB/s 00:00 serverresources.json 100% 307 492.5KB/s 00:00 serverresources.json 100% 289 224.2KB/s 00:00 serverresources.json 100% 462 577.7KB/s 00:00 serverresources.json 100% 704 766.7KB/s 00:00 serverresources.json 100% 438 537.4KB/s 00:00 serverresources.json 100% 745 846.1KB/s 00:00 serverresources.json 100% 509 459.1KB/s 00:00 serverresources.json 100% 509 646.6KB/s 00:00 serverresources.json 100% 504 558.4KB/s 00:00 serverresources.json 100% 504 798.4KB/s 00:00 serverresources.json 100% 915 1.2MB/s 00:00 serverresources.json 100% 202 203.1KB/s 00:00 serverresources.json 100% 302 454.4KB/s 00:00 serverresources.json 100% 297 418.5KB/s 00:00 serverresources.json 100% 537 591.1KB/s 00:00 serverresources.json 100% 653 710.6KB/s 00:00 serverresources.json 100% 303 357.6KB/s 00:00 serverresources.json 100% 308 393.6KB/s 00:00 serverresources.json 100% 455 148.3KB/s 00:00 serverresources.json 100% 6221 8.3MB/s 00:00 serverresources.json 100% 650 908.9KB/s 00:00 [root@master01 ~]#
在node01上运行kubectl命令:
[root@node01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 3h36m v1.24.2
master02 Ready control-plane 113m v1.24.2
master03 Ready control-plane 18m v1.24.2
node01 Ready <none> 9m9s v1.24.2
node02 Ready <none> 8m26s v1.24.2
node03 Ready <none> 8m7s v1.24.2
[root@node01 ~]#
到此,一个测试版的k8s高可用环境就部署好了。至于k8s的web界面功能,这个我这里不部署了,个人更喜欢用命令行模式。
这里运行一个nginx pod来测试一下:
(1)创建一个名称空间为testpod:
[root@master01 ~]# kubectl create namespace testpod
namespace/testpod created
[root@master01 ~]#
(2)创建一个nginx控制器,通过控制器来创建pod:
在/root/下创建一个yaml文件,通过配置文件来创建控制器和pod
[root@master01 ~]# vim /root/nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 hostPort: 20080 [root@master01 ~]# kubectl apply -f ./nginx.yaml deployment.apps/nginx-deployment created [root@master01 ~]# [root@master01 ~]# kubectl describe deployment //此处表示查看创建的控制器信息 Name: nginx-deployment Namespace: default CreationTimestamp: Wed, 31 Aug 2022 18:52:19 +0800 Labels: <none> Annotations: deployment.kubernetes.io/revision: 1 Selector: app=nginx Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:latest Port: 80/TCP Host Port: 20080/TCP Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: nginx-deployment-66455f9788 (1/1 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 45s deployment-controller Scaled up replica set nginx-deployment-66455f9788 to 1 [root@master01 ~]# [root@master01 ~]# kubectl get pods //此处表示查看默认名称空间中的pod NAME READY STATUS RESTARTS AGE nginx-deployment-66455f9788-kj494 1/1 Running 0 82s [root@master01 ~]# [root@master01 ~]# kubectl describe pod nginx-deployment-66455f9788-kj494 //此处表示查看某个pod的详细信息 Name: nginx-deployment-66455f9788-kj494 Namespace: default Priority: 0 Node: node02/192.168.31.117 Start Time: Wed, 31 Aug 2022 18:52:19 +0800 Labels: app=nginx pod-template-hash=66455f9788 Annotations: cni.projectcalico.org/containerID: d2c93f5951740348b849f10c4f04ea0a3323b19e42f8650e8722e915434f8ad9 cni.projectcalico.org/podIP: 172.16.140.65/32 cni.projectcalico.org/podIPs: 172.16.140.65/32 Status: Running IP: 172.16.140.65 IPs: IP: 172.16.140.65 Controlled By: ReplicaSet/nginx-deployment-66455f9788 Containers: nginx: Container ID: containerd://9ec095b2b47fcd39b5131b23cd874a6c12f8bda17c731c291fc0a00fad4d68c1 Image: nginx:latest Image ID: docker.io/library/nginx@sha256:b95a99feebf7797479e0c5eb5ec0bdfa5d9f504bc94da550c2f58e839ea6914f Port: 80/TCP Host Port: 20080/TCP State: Running Started: Wed, 31 Aug 2022 18:52:25 +0800 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-c9n87 (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: kube-api-access-c9n87: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 107s default-scheduler Successfully assigned default/nginx-deployment-66455f9788-kj494 to node02 Normal Pulling 107s kubelet Pulling image "nginx:latest" Normal Pulled 101s kubelet Successfully pulled image "nginx:latest" in 5.418997516s Normal Created 101s kubelet Created container nginx Normal Started 101s kubelet Started container nginx [root@master01 ~]#
通过上述信息可以看到,这个pod运行在node02上,node02的20080映射pod的80端口。在浏览器上访问这个pod:
可以看到,成功的访问到了nginx pod。
说明部署的k8s高可用集群没问题,后续可以正常去验证k8s的高级特性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。