Kubernetes

介绍

使用 kubeadm 安装 k8s 1.31.2

container runtime 选择 containerd或者cri-o

安装网络插件 calico,节点监控 Metrics-Server

环境

节点 系统 IP
master centos7.9 192.168.157.128
node1 centos7.9 192.168.157.129

基本配置

以下操作若无特殊说明,所有节点都进行操作

安装所需软件

1
2
3
4
5
# CentOS7 操作
yum -y install wget device-mapper-persistent-data lvm2 chrony sshpass ipvsadm ipset sysstat conntrack libseccomp curl

# Ubuntu 操作
sudo apt-get update && sudo apt-get install -y lvm2 chrony sshpass ipvsadm ipset sysstat conntrack apt-transport-https curl

关闭防火墙

在某些 Kubernetes 组件或插件中,可能会出现权限问题,特别是在运行旧版本时。关闭 SELinux 可以避免这些问题。

ubuntu 忽略

1
2
3
4
5
6
# 关闭防火墙
systemctl disable --now firewalld

# 关闭 SELinux
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=permissive#g' /etc/selinux/config

关闭 Swap

  • 保证资源隔离:Kubernetes 使用 cgroups 来限制每个容器的资源使用,如 CPU 和内存。如果启用 swap,容器可能会超过其分配的内存限制,通过 swap 占用更多的内存资源,导致不准确的资源隔离。
  • 稳定性:在启用 swap 时,可能会引起调度的不稳定,容器在高负载时容易被杀死,影响应用的性能和稳定性。
  • Kubelet 要求:Kubelet 默认会检查节点是否禁用了 swap,若未关闭,则会拒绝启动。为了避免这种情况,一般选择关闭 swap。
1
2
3
# 关闭交换分区
sudo sed -ri 's/.*swap.*/#&/' /etc/fstab
sudo swapoff -a && sysctl -w vm.swappiness=0

网络配置

用于指定不由 NetworkManager 管理的设备,可以将特定的接口排除在 NetworkManager 的管理范围之外,以便其他工具或进程可以独立地管理和配置这些接口。

ubuntu 忽略

1
2
3
4
5
6
7
8
9
10
11
cat > /etc/NetworkManager/conf.d/calico.conf << EOF 
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*
EOF

systemctl restart NetworkManager

# interface-name:cali*
# 表示以 "cali" 开头的接口名称被排除在 NetworkManager 管理之外。例如,"cali0", "cali1" 等接口不受 NetworkManager 管理。
# interface-name:tunl*
# 表示以 "tunl" 开头的接口名称被排除在 NetworkManager 管理之外。例如,"tunl0", "tunl1" 等接口不受 NetworkManager 管理。

进行时间同步

master 操作

将下方 192.168.157.0/24 换为你主机所在的网段

1
2
3
4
5
6
7
8
9
10
11
12
13
cat > /etc/chrony.conf << EOF 
pool ntp.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.157.0/24 # 网段范围内的主机与chrony进行时间同步
local stratum 10
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
EOF

systemctl restart chronyd ; systemctl enable chronyd

node 节点操作

将下方 192.168.157.128 修改为服务端节点

1
2
3
4
5
6
7
8
9
10
11
12
13
cat > /etc/chrony.conf << EOF 
pool 192.168.157.128 iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
EOF

systemctl restart chronyd ; systemctl enable chronyd
#使用客户端进行验证
chronyc sources -v

配置 ulimit

  • 限制文件描述符数量:Kubernetes 中的节点和容器可能需要打开大量文件描述符(例如日志文件、网络连接等)。如果未设置足够高的文件描述符限制,可能会导致 too many open files 错误,影响服务的正常运行。
  • 控制进程数:在高负载的环境下,可能会有大量进程启动(如微服务环境中的多个 pod),这时需要对进程数限制进行合理配置,以防止系统因进程数过多而崩溃。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ulimit -SHn 65535
cat >> /etc/security/limits.conf <<EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* seft memlock unlimited
* hard memlock unlimitedd
EOF

# soft nofile 655360
# soft表示软限制,nofile表示一个进程可打开的最大文件数,默认值为1024。这里的软限制设置为655360,即一个进程可打开的最大文件数为655360。

# hard nofile 131072
# hard表示硬限制,即系统设置的最大值。nofile表示一个进程可打开的最大文件数,默认值为4096。这里的硬限制设置为131072,即系统设置的最大文件数为131072。

# soft nproc 655350
# soft表示软限制,nproc表示一个用户可创建的最大进程数,默认值为30720。这里的软限制设置为655350,即一个用户可创建的最大进程数为655350。

# hard nproc 655350
# hard表示硬限制,即系统设置的最大值。nproc表示一个用户可创建的最大进程数,默认值为4096。这里的硬限制设置为655350,即系统设置的最大进程数为655350。

# seft memlock unlimited
# seft表示软限制,memlock表示一个进程可锁定在RAM中的最大内存,默认值为64 KB。这里的软限制设置为unlimited,即一个进程可锁定的最大内存为无限制。

# hard memlock unlimited
# hard表示硬限制,即系统设置的最大值。memlock表示一个进程可锁定在RAM中的最大内存,默认值为64 KB。这里的硬限制设置为unlimited,即系统设置的最大内存锁定为无限制。

升级内核至4.18版本以上(可选)

  • 增强的容器支持:内核 4.18 引入了对 cgroup v2eBPF 等特性的改进,这些特性能够优化 Kubernetes 的资源管理和监控。使用 cgroup v2 可以更好地隔离和管理容器资源,减少资源争用。
  • 性能优化:在高负载环境下,新内核引入的网络和存储优化可以显著提升 Kubernetes 集群的稳定性和性能。例如,IPVS 在 4.18 及更高版本中有更好的支持,可提高服务负载均衡的效率。
  • 安全增强:高版本内核包含一些安全补丁,有助于减少集群在面对现代漏洞(如 Meltdown、Spectre)时的风险,增强系统的整体安全性。

ubuntu忽略

1
2
3
4
# 添加启用源
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y
sed -i "s@mirrorlist@#mirrorlist@g" /etc/yum.repos.d/elrepo.repo
sed -i "s@elrepo.org/linux@mirrors.tuna.tsinghua.edu.cn/elrepo@g" /etc/yum.repos.d/elrepo.repo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 安装最新的内核
# 我这里选择的是稳定版 kernel-ml 如需更新长期维护版本 kernel-lt
yum -y --enablerepo=elrepo-kernel install kernel-ml

# 查看已安装那些内核
rpm -qa | grep kernel

# 查看默认内核
grubby --default-kernel

# 若不是最新的使用命令设置
grubby --set-default $(ls /boot/vmlinuz-* | grep elrepo)

# 重启生效
reboot

安装 ipvsadm

  • 高性能:IPVS(IP Virtual Server)相比默认的 iptables 模式在高并发场景下具有更好的性能,适合大型集群。

  • 低延迟:IPVS 使用 Linux 内核级别的负载均衡实现,延迟更低,支持轮询、最小连接数等多种调度算法,提升服务访问效率。

  • 管理和查看 IPVS 规则:虽然 IPVS 模式本身不依赖 ipvsadm 运行,但 ipvsadm 提供了查看和管理 IPVS 规则的功能。例如,可以通过 ipvsadm -Ln 命令列出当前的 IPVS 负载均衡规则,帮助运维人员排查网络问题。

  • 监控 IPVS 状态:可以查看当前连接数、路由等信息,便于调优和监控负载均衡状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
yum install ipvsadm ipset sysstat conntrack libseccomp -y
apt install ipvsadm ipset sysstat conntrack -y

cat >> /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF

# 重载模块
systemctl restart systemd-modules-load.service

# 检查配置
lsmod | grep -e ip_vs -e nf_conntrack


# ip_vs
# IPVS 是 Linux 内核中的一个模块,用于实现负载均衡和高可用性。它通过在前端代理服务器上分发传入请求到后端实际服务器上,提供了高性能和可扩展的网络服务。
#
# ip_vs_rr
# IPVS 的一种调度算法之一,使用轮询方式分发请求到后端服务器,每个请求按顺序依次分发。
#
# ip_vs_wrr
# IPVS 的一种调度算法之一,使用加权轮询方式分发请求到后端服务器,每个请求按照指定的权重比例分发。
#
# ip_vs_sh
# IPVS 的一种调度算法之一,使用哈希方式根据源 IP 地址和目标 IP 地址来分发请求。
#
# nf_conntrack
# 这是一个内核模块,用于跟踪和管理网络连接,包括 TCP、UDP 和 ICMP 等协议。它是实现防火墙状态跟踪的基础。
#
# ip_tables
# 这是一个内核模块,提供了对 Linux 系统 IP 数据包过滤和网络地址转换(NAT)功能的支持。
#
# ip_set
# 这是一个内核模块,扩展了 iptables 的功能,支持更高效的 IP 地址集合操作。
#
# xt_set
# 这是一个内核模块,扩展了 iptables 的功能,支持更高效的数据包匹配和操作。
#
# ipt_set
# 这是一个用户空间工具,用于配置和管理 xt_set 内核模块。
#
# ipt_rpfilter
# 这是一个内核模块,用于实现反向路径过滤,用于防止 IP 欺骗和 DDoS 攻击。
#
# ipt_REJECT
# 这是一个 iptables 目标,用于拒绝 IP 数据包,并向发送方发送响应,指示数据包被拒绝。
#
# ipip
# 这是一个内核模块,用于实现 IP 封装在 IP(IP-over-IP)的隧道功能。它可以在不同网络之间创建虚拟隧道来传输 IP 数据包。

修改内核参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720

net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384

net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.all.forwarding = 1
EOF

modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
sysctl --system

# 这些是Linux系统的一些参数设置,用于配置和优化网络、文件系统和虚拟内存等方面的功能。以下是每个参数的详细解释:
#
# 1. net.ipv4.ip_forward = 1
# - 这个参数启用了IPv4的IP转发功能,允许服务器作为网络路由器转发数据包。
#
# 2. net.bridge.bridge-nf-call-iptables = 1
# - 当使用网络桥接技术时,将数据包传递到iptables进行处理。
#
# 3. fs.may_detach_mounts = 1
# - 允许在挂载文件系统时,允许被其他进程使用。
#
# 4. vm.overcommit_memory=1
# - 该设置允许原始的内存过量分配策略,当系统的内存已经被完全使用时,系统仍然会分配额外的内存。
#
# 5. vm.panic_on_oom=0
# - 当系统内存不足(OOM)时,禁用系统崩溃和重启。
#
# 6. fs.inotify.max_user_watches=89100
# - 设置系统允许一个用户的inotify实例可以监控的文件数目的上限。
#
# 7. fs.file-max=52706963
# - 设置系统同时打开的文件数的上限。
#
# 8. fs.nr_open=52706963
# - 设置系统同时打开的文件描述符数的上限。
#
# 9. net.netfilter.nf_conntrack_max=2310720
# - 设置系统可以创建的网络连接跟踪表项的最大数量。
#
# 10. net.ipv4.tcp_keepalive_time = 600
# - 设置TCP套接字的空闲超时时间(秒),超过该时间没有活动数据时,内核会发送心跳包。
#
# 11. net.ipv4.tcp_keepalive_probes = 3
# - 设置未收到响应的TCP心跳探测次数。
#
# 12. net.ipv4.tcp_keepalive_intvl = 15
# - 设置TCP心跳探测的时间间隔(秒)。
#
# 13. net.ipv4.tcp_max_tw_buckets = 36000
# - 设置系统可以使用的TIME_WAIT套接字的最大数量。
#
# 14. net.ipv4.tcp_tw_reuse = 1
# - 启用TIME_WAIT套接字的重新利用,允许新的套接字使用旧的TIME_WAIT套接字。
#
# 15. net.ipv4.tcp_max_orphans = 327680
# - 设置系统可以同时存在的TCP套接字垃圾回收包裹数的最大数量。
#
# 16. net.ipv4.tcp_orphan_retries = 3
# - 设置系统对于孤立的TCP套接字的重试次数。
#
# 17. net.ipv4.tcp_syncookies = 1
# - 启用TCP SYN cookies保护,用于防止SYN洪泛攻击。
#
# 18. net.ipv4.tcp_max_syn_backlog = 16384
# - 设置新的TCP连接的半连接数(半连接队列)的最大长度。
#
# 19. net.ipv4.ip_conntrack_max = 65536
# - 设置系统可以创建的网络连接跟踪表项的最大数量。
#
# 20. net.ipv4.tcp_timestamps = 0
# - 关闭TCP时间戳功能,用于提供更好的安全性。
#
# 21. net.core.somaxconn = 16384
# - 设置系统核心层的连接队列的最大值。
#
# 22. net.ipv6.conf.all.disable_ipv6 = 0
# - 启用IPv6协议。
#
# 23. net.ipv6.conf.default.disable_ipv6 = 0
# - 启用IPv6协议。
#
# 24. net.ipv6.conf.lo.disable_ipv6 = 0
# - 启用IPv6协议。
#
# 25. net.ipv6.conf.all.forwarding = 1
# - 允许IPv6数据包转发。

# modprobe br_netfilter 该命令加载 br_netfilter 内核模块,该模块允许桥接接口的过滤功能(通常是处理网络包)。它是启用 Kubernetes 集群的容器网络功能(如网络策略)的必要模块,特别是在节点上使用桥接网络时。

# sysctl -p /etc/sysctl.d/k8s.conf
# 该命令应用 /etc/sysctl.d/k8s.conf 配置文件中的内核参数。通常,该文件包含与 Kubernetes 和容器网络相关的配置,类似于启用 IP 转发(net.ipv4.ip_forward)和其他网络优化设置。

# sysctl --system
# 该命令重新加载所有的 sysctl 配置文件,通常是 /etc/sysctl.conf 和 /etc/sysctl.d/ 目录下的所有配置文件。它应用系统级别的内核参数设置,以确保系统的内核配置符合预期。

所有节点配置 hosts 本地解析

修改 /etc/hosts 文件,新增节点

1
2
192.168.157.128 master
192.168.157.129 node1

配置容器

containerd 或者 cri-o 二选一

配置containerd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 下载所需应用包
wget https://github.com/containerd/containerd/releases/download/v1.7.18/cri-containerd-cni-1.7.18-linux-amd64.tar.gz
wget https://github.com/containernetworking/plugins/releases/download/v1.5.1/cni-plugins-linux-amd64-v1.5.1.tgz

# centos7 要升级libseccomp
yum -y install https://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64/getPackage/libseccomp-2.5.1-1.el8.x86_64.rpm

#创建cni插件所需目录
mkdir -p /etc/cni/net.d /opt/cni/bin
#解压cni二进制包
tar xf cni-plugins-linux-amd64-v*.tgz -C /opt/cni/bin/

#解压
tar -xzf cri-containerd-cni-*-linux-amd64.tar.gz -C /

#创建服务启动文件
cat > /etc/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target
EOF

配置内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 配置 Containerd 所需的模块
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

# 加载模块
systemctl restart systemd-modules-load.service

# 配置 Containerd 所需的内核
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# 加载内核
sysctl --system

修改默认配置

1
2
3
4
5
6
7
8
9
10
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml

# 修改 Containerd 的配置文件
sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml
cat /etc/containerd/config.toml | grep SystemdCgroup
sed -i "s#registry.k8s.io/pause:3.8#k8s.m.daocloud.io/pause:3.10#g" /etc/containerd/config.toml
cat /etc/containerd/config.toml | grep sandbox_image
sed -i "s#config_path\ \=\ \"\"#config_path\ \=\ \"/etc/containerd/certs.d\"#g" /etc/containerd/config.toml
cat /etc/containerd/config.toml | grep certs.d

配置加速器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 配置加速器
mkdir /etc/containerd/certs.d/docker.io -pv
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF

mkdir /etc/containerd/certs.d/registry.k8s.io -pv
cat > /etc/containerd/certs.d/registry.k8s.io/hosts.toml << EOF
server = "https://registry.k8s.io"
[host."https://k8s.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF

启动

1
2
3
4
5
6
7
# 启动并设置为开机启动
systemctl daemon-reload
systemctl enable --now containerd.service
systemctl stop containerd.service
systemctl start containerd.service
systemctl restart containerd.service
systemctl status containerd.service

配置CRI-O

配置内核

1
2
3
4
5
6
7
8
9
# 配置 CRI-O 所需的模块
cat > /etc/modules-load.d/crio.conf << EOF
overlay
br_netfilter
EOF

# 加载模块
modprobe overlay
systemctl restart systemd-modules-load.service

安装

1
2
3
4
5
6
7
8
VERSION=1.28
OS=CentOS_7

curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/devel:kubic:libcontainers:stable.repo

curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo

yum install -y cri-o

修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vi /etc/crio/crio.conf
# 修改 pause_image
pause_image = "k8s.m.daocloud.io/pause:3.10"

vi /etc/containers/registries.conf
# 修改 unqualified-search-registries
unqualified-search-registries = ["docker.m.daocloud.io", "k8s.m.daocloud.io"]

# 启动并设置为开机启动
systemctl daemon-reload
systemctl enable --now crio.service
systemctl stop crio.service
systemctl start crio.service
systemctl restart crio.service
systemctl status crio.service

配置安装源

Kubernetes 是一个开源系统,用于容器化应用的自动部署、扩缩和管理。它将构成应用的容器按逻辑单位进行分组以便于管理和发现。

由于 Kubernetes 官方变更了仓库的存储路径以及使用方式,如果需要使用 1.28 及以上版本,请使用 新版配置方法 进行配置。

centos

注意修改为自己需要的版本号

1
2
3
4
5
6
7
8
9
10
11
12
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/repodata/repomd.xml.key
EOF

yum update -y && yum install -y kubelet kubeadm kubectl

systemctl enable kubelet && systemctl start kubelet

修改镜像

coredns 镜像名在拉取的时候有名称问题,需要修改名称

如果使用 CRI-O,请使用 podman 更改镜像

1
2
3
4
5
6
7
8
9
# 查看最新版本有那些镜像
kubeadm config images list --image-repository k8s.m.daocloud.io

# 拉取镜像
ctr --namespace k8s.io images pull k8s.m.daocloud.io/coredns/coredns:v1.11.3
# 修改镜像名称
ctr --namespace k8s.io images tag k8s.m.daocloud.io/coredns/coredns:v1.11.3 k8s.m.daocloud.io/coredns:v1.11.3
# 查看镜像
ctr --namespace k8s.io images ls | grep coredns

修改初始化配置

master 节点操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 生成默认配置
kubeadm config print init-defaults > kubeadm.yaml

# 修改以下内容
localAPIEndpoint:
advertiseAddress: 192.168.157.128 # 修改为 master IP
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock # 如果为 containerd 则不需要修改,如果是 CRI-O,则修改为unix:///var/run/crio/crio.sock
name: master # 修改为 master 的主机名

imageRepository: k8s.m.daocloud.io # 修改镜像加速
kubernetesVersion: 1.31.2 # 修改镜像版本

podSubnet: 172.16.0.0/12 # 在 dnsDomain: cluster.local 下添加

# 在最末尾添加以下内容
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

初始化

master 节点上操作

1
2
3
4
5
6
7
8
9
10
# 初始化 k8s
kubeadm init --config=kubeadm.yaml

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

# 重新初始化
kubeadm reset

node 节点运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 在node上执行操作,将加入工作节点
cat > kubeadm-join-node.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
discovery:
bootstrapToken:
apiServerEndpoint: 192.168.157.128:6443 # 这里修改为master的ip加对应的绑定端口
token: "abcdef.0123456789abcdef" # 这里修改为master的k8s初始化配置文件中的token
caCertHashes:
- "sha256:e614d994febfbebd58d8c78df839532ddabb05b5f3466fdf0018546fc010c9a0"
# 请更改上面的认证信息,使之与你的集群中实际使用的令牌和 CA 证书匹配
nodeRegistration:
kubeletExtraArgs:
node-ip: 192.168.157.129 # 这里修改为node的IP
EOF

kubeadm join --config=kubeadm-join-node.yaml

配置 Calico

1
2
3
4
5
6
7
8
9
10
11
wget https://raw.githubusercontent.com/projectcalico/calico/refs/heads/master/manifests/calico-typha.yaml

vi calico-typha.yaml
# 修改 CALICO_IPV4POOL_CIDR 配置
- name: CALICO_IPV4POOL_CIDR
value: "172.16.0.0/12"

# 切换国内仓库
sed -i "s#docker.io/calico/#docker.m.daocloud.io/calico/#g" calico-typha.yaml

kubectl apply -f calico-typha.yaml

配置 Metrics-Server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

vim components.yaml
# 添加- --kubelet-insecure-tls
- args:
- --cert-dir=/tmp
- --secure-port=10250
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls

# 修改镜像地址
sed -i "s#registry.k8s.io#k8s.m.daocloud.io#g" components.yaml
cat components.yaml | grep image

kubectl apply -f components.yaml

kubectl top node

配置命令行自动补全功能

1
2
3
4
yum install bash-completion -y
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

HELM

介绍

Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。^12

Chart 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物。

Repository(仓库) 是用来存放和共享 charts 的地方。它就像 Perl 的 CPAN 档案库网络 或是 Fedora 的 软件包仓库,只不过它是供 Kubernetes 包所使用的。

Release 是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。以 MySQL chart为例,如果你想在你的集群中运行两个数据库,你可以安装该chart两次。每一个数据库都会拥有它自己的 releaserelease name

安装HELM

1
2
3
wget https://mirrors.huaweicloud.com/helm/v3.16.3/helm-v3.16.3-linux-amd64.tar.gz
tar xvf helm-*-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/

操作HELM

查找 charts

1
2
helm search hub [app_name] # 从 Artifact Hub 中查找并列出 helm charts。 Artifact Hub中存放了大量不同的仓库。
helm search repo [repo_name|app_name] # 从你添加(使用 helm repo add)到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索,无需连接互联网。

安装前自定义 chart

1
helm show values [app_name] # 可以查看 chart 中的可配置选项

你可以使用 YAML 格式的文件覆盖上述任意配置项,并在安装过程中使用该文件

1
2
echo '{mariadb.auth.database: user0db, mariadb.auth.username: user0}' > values.yaml
helm install -f values.yaml bitnami/wordpress --generate-name

上述命令将为 MariaDB 创建一个名称为 user0 的默认用户,并且授予该用户访问新建的 user0db 数据库的权限。chart 中的其他默认配置保持不变。--generate-name随机生成release名字

安装过程中有两种方式传递配置数据:

  • --values (或 -f):使用 YAML 文件覆盖配置。可以指定多次,优先使用最右边的文件。
  • --set:通过命令行的方式对指定项进行覆盖。

如果同时使用两种方式,则 --set 中的值会被合并到 --values 中,但是 --set 中的值优先级更高。在--set 中覆盖的内容会被被保存在 ConfigMap 中。可以通过 helm get values <release-name> 来查看指定 release 中 --set 设置的值。也可以通过运行 helm upgrade 并指定 --reset-values 字段来清除 --set 中设置的值。

追踪 release 的状态

1
helm status <release> -n <namespace>

更多安装方法

helm install 命令可以从多个来源进行安装:

  • chart 的仓库(如上所述)
  • 本地 chart 压缩包(helm install foo foo-0.1.1.tgz
  • 解压后的 chart 目录(helm install foo path/to/foo
  • 完整的 URL(helm install foo https://example.com/charts/foo-1.2.3.tgz

升级 release

当你想升级到 chart 的新版本,或是修改 release 的配置,你可以使用 helm upgrade 命令。

一次升级操作会使用已有的 release 并根据你提供的信息对其进行升级。由于 Kubernetes 的 chart 可能会很大而且很复杂,Helm 会尝试执行最小侵入式升级。即它只会更新自上次发布以来发生了更改的内容。

1
helm upgrade -f panda.yaml happy-panda bitnami/wordpress

happy-panda 这个 release 使用相同的 chart 进行升级,但是使用了一个新的 YAML 文件

可以使用 helm get values 命令来看看配置值是否真的生效了

1
helm get values happy-panda

失败时恢复

在一次发布过程中,发生了不符合预期的事情,也很容易通过 helm rollback [RELEASE] [REVISION] 命令回滚到之前的发布版本。

1
helm rollback happy-panda 1

上面这条命令将我们的 happy-panda 回滚到了它最初的版本。release 版本其实是一个增量修订(revision)。 每当发生了一次安装、升级或回滚操作,revision 的值就会加1。第一次 revision 的值永远是1。我们可以使用 helm history [RELEASE] 命令来查看一个特定 release 的修订版本号。

卸载 release

1
helm uninstall happy-panda

可以通过 helm list 命令看到当前部署的所有 release

1
helm list -n <namespace>

在 Helm 3 中,删除会移除 release 的记录。 如果你想保留删除记录,使用 helm uninstall --keep-history。使用 helm list --uninstalled 只会展示使用了 --keep-history 删除的 release。

helm list --all 会展示 Helm 保留的所有 release 记录,包括失败或删除的条目(指定了 --keep-history

使用仓库

Helm 3 不再附带一个默认的 chart 仓库。helm repo 提供了一组命令用于添加、列出和移除仓库。

1
2
3
4
helm repo list # 查看配置的仓库
helm repo add dev https://example.com/dev-charts # 添加新的仓库
helm repo update # 确保你的 Helm 客户端是最新的
helm repo remove # 移除仓库

Kubernetes Documentation | Kubernetes

cby-chen/Kubernetes: kubernetes (k8s) 二进制高可用安装

libseccomp-2.5.1-1.el8.x86_64.rpm Oracle Linux 8 Download

DaoCloud/public-image-mirror

kubernetes-new安装包下载_开源镜像站-阿里云

containerd/containerd: An open and reliable container runtime

containernetworking/plugins: Some reference and example networking plugins, maintained by the CNI team.

kubernetes-new-core-stable安装包下载_开源镜像站-阿里云

calico/manifests/calico-typha.yaml at master · projectcalico/calico

Index of helm-local

Installation | dashboard