cloud
cloud-native
云原生与 kubernetes
安装 Kubernetes
安装前准备

安装前准备

系统配置

⚠️

Master, Worker 1, Worker 2 节点配置

禁用防火墙

sudo ufw status
sudo ufw disable

创建 /etc/modules-load.d/containerd.conf 配置文件,确保在系统启动时自动加载所需的内核模块,以满足容器运行时的要求:

cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

执行以下命令使配置生效:

modprobe overlay
modprobe br_netfilter

CNI 配置

创建/etc/sysctl.d/99-kubernetes-cri.conf配置文件:

cat << EOF > /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
user.max_user_namespaces=28633
EOF

执行以下命令使配置生效:

sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
⚠️

在文件名/etc/sysctl.d/99-kubernetes-cri.conf中,“99” 代表文件的优先级或顺序。sysctl是Linux内核参数的配置工具,它可以通过修改/proc/sys/目录下的文件来设置内核参数。 在/etc/sysctl.d/目录中,可以放置一系列的配置文件,以便在系统启动时自动加载这些参数。这些配置文件按照文件名的字母顺序逐个加载。数字前缀用于指定加载的顺序,较小的数字表示较高的优先级。

开启ipvs

由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:

ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4

创建/etc/modules-load.d/ipvs.conf文件,保证在节点重启后能自动加载所需模块:

cat > /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
EOF

执行以下命令使配置立即生效:

modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh

使用lsmod | grep -e ip_vs -e nf_conntrack命令查看是否已经正确加载所需的内核模块。 接下来还需要确保各个节点上已经安装了ipset软件包,为了便于查看ipvs的代理规则,最好安装一下管理工具ipvsadm。

apt install -y ipset ipvsadm

NFS 共享存储配置

  1. 在 Master 上安装 NFS 服务器
  2. 在 Worker 1 / Worker 2 上挂载 NFS 共享目录 如果使用的云服务, 建议使用云平台自带的 nfs, 价格非常便宜而且可靠

[Master] 安装 / 配置 NFS 服务器

在主节点 Master 上安装 nfs-server

sudo apt install nfs-kernel-server

您可以运行cat命令sudo cat /proc/fs/nfsd/versions来验证正在运行的NFS版本。

root@master:~# sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2

[Master] NFS 配置共享目录

创建共享目录 /nfs

mkdir -p /nfs
chmod 777 /nfs

打开/etc/exports文件,输入以下内容来定义NFS共享。

/nfs *(rw,sync,no_subtree_check)

授权其他节点访问:在终端中输入以下命令以重新加载NFS配置文件。

sudo exportfs -a

[Master] 启动NFS服务器

在终端中输入以下命令以启动NFS服务。

sudo systemctl start nfs-kernel-server

[Worker 1] 验证安装结果

Worker 1 节点上验证

  1. 安装依赖
sudo apt install nfs-common
  1. 挂载目录
# 192.168.88.101 为 Master 的 ip

mkdir -p /mnt/nfs

mount 192.168.88.101:/nfs /mnt/nfs
  1. Worker 1 共享目录下创建文件进行验证
root@worker1:/mnt/nfs# echo 'hello, nfs!' > test.txt
  1. 检查 Master 目录数据
root@master:~# cd /nfs
root@master:/nfs# ls -l
total 4
-rw-r--r-- 1 nobody nogroup 12 May 10 15:11 test.txt
root@master:/nfs# cat test.txt
hello, nfs!

验证成功!!

[Worker 1, Worker 2] 挂载 NFS 并配置开机启动

Worker 1 / Worker 2 上分别挂载

  1. 安装依赖
sudo apt install nfs-common
  1. 您需要编辑/etc/fstab 文件并添加一行类似于以下内容的条目:
192.168.88.101:/nfs /mnt/nfs nfs default 0 0
  1. 重启 Worker 1 / Worker 2 并进行验证
Last login: Wed May 10 15:32:10 2023 from 192.168.88.1
root@worker1:~# df -h
Filesystem          Size  Used Avail Use% Mounted on
tmpfs               393M  1.1M  392M   1% /run
/dev/sda3            47G  6.7G   38G  16% /
tmpfs               2.0G     0  2.0G   0% /dev/shm
tmpfs               5.0M     0  5.0M   0% /run/lock
/dev/sda2           2.0G  134M  1.7G   8% /boot
192.168.88.101:/nfs   47G  6.8G   38G  16% /mnt/nfs
tmpfs               393M  4.0K  393M   1% /run/user/0
root@worker1:~# cd /mnt/nfs/
root@worker1:/mnt/nfs# ls -l
total 4
-rw-r--r-- 1 nobody nogroup 12 May 10 15:11 test.txt
root@worker1:/mnt/nfs# cat test.txt
hello, nfs!
root@worker1:/mnt/nfs#

禁用 Swap 交换分区

⚠️

Master, Worker 1, Worker 2 节点均要执行

临时生效 禁用当前 swap(如果尚未禁用)

sudo swapoff -a
  1. 编辑 /etc/fstab 找到类似下面这一行:
UUID=xxxx-xxxx-xxxx none swap sw 0 0

或者:

/dev/sdX none swap sw 0 0

将整行注释掉(在行首加 #):

# UUID=xxxx-xxxx-xxxx none swap sw 0 0

保存并关闭。

swappiness参数调整,修改/etc/sysctl.d/99-kubernetes-cri.conf添加下面一行:

swappiness参数调整,修改/etc/sysctl.d/99-kubernetes-cri.conf添加下面一行:

vm.swappiness=0

执行sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf使修改生效。

重启

调整文件描述符限制

# 临时设置(重启会丢失)
sudo sysctl -w vm.max_map_count=262144

# 永久设置
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

安装 helm

⚠️

Master 节点安装

版本对比

版本对比: https://helm.sh/zh/docs/topics/version_skew/ (opens in a new tab)

安装 helm v3.12.0

see https://helm.sh/zh/docs/intro/install/ (opens in a new tab)

添加仓库

wget https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz
tar -zxvf helm-v3.12.0-linux-amd64.tar.gz
mv linux-amd64/helm  /usr/local/bin/

执行helm list确认没有错误输出。

安装 Containerd

⚠️

Master, Worker 1, Worker 2 节点均要安装

下载最新版本的 Containerd, 截止到目前最新版本是 2.1.1

下载Containerd的二进制包, 需要注意cri-containerd-(cni-)-VERSION-OS-ARCH.tar.gz发行包自containerd 1.6版本起已经被弃用,

在某些 Linux 发行版上无法正常工作,并将在containerd 2.0版本中移除,这里下载containerd-x.tar.gz的发行包,后边在单独下载安装runc和CNI plugins:

wget https://github.com/containerd/containerd/releases/download/v2.1.1/containerd-2.1.1-linux-amd64.tar.gz

wget https://static.jansora.app/containerd-2.1.1-linux-amd64.tar.gz
> wget

将其解压缩到/usr/local下:

tar Cxzvf /usr/local containerd-2.1.1-linux-amd64.tar.gz

bin/
bin/containerd-shim-runc-v1
bin/containerd-shim-runc-v2
bin/containerd-stress
bin/containerd
bin/containerd-shim
bin/ctr

接下来从runc的github上单独下载安装runc,该二进制文件是静态构建的,并且应该适用于任何Linux发行版。

wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64

wget https://static.jansora.app/runc.amd64

install -m 755 runc.amd64 /usr/local/sbin/runc

接下来生成containerd的配置文件:

mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

根据文档Container runtimes中的内容,对于使用systemd作为init system的Linux的发行版, 使用systemd作为容器的cgroup driver可以确保服务器节点在资源紧张的情况更加稳定,因此这里配置各个节点上containerd的cgroup driver为systemd。

修改前面生成的配置文件/etc/containerd/config.toml

新版本可能此配置下已不存在,可忽略

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

再修改/etc/containerd/config.toml中的

[plugins."io.containerd.grpc.v1.cri"]
  ...
  # sandbox_image = "registry.k8s.io/pause:3.8"
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

如果你的containerd版本和操作系统和本文的一致, 也可以直接下载此文件, https://cdn.jansora.com/files/uPic/2023/09/21/config.toml (opens in a new tab)

为了通过systemd启动containerd,请还需要从 https://raw.githubusercontent.com/containerd/containerd/main/containerd.service (opens in a new tab) 下载containerd.service单元文件,并将其放置在 /etc/systemd/system/containerd.service中。 配置containerd开机启动,并启动containerd,执行以下命令:

vim /etc/systemd/system/containerd.service

# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target dbus.service

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable containerd --now

下载安装crictl工具:

wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.27.0/crictl-v1.27.0-linux-amd64.tar.gz
或 wget https://static.jansora.app/crictl-v1.27.0-linux-amd64.tar.gz

tar -zxvf crictl-v1.27.0-linux-amd64.tar.gz
install -m 755 crictl /usr/local/bin/crictl

使用crictl测试一下,确保可以打印出版本信息并且没有错误信息输出:

crictl --runtime-endpoint=unix:///run/containerd/containerd.sock  version

Version:  0.1.0
RuntimeName:  containerd
RuntimeVersion:  v2.1.1
RuntimeApiVersion:  v1

安装 kubeadm,kubectl,kubelet 1.33.1

⚠️

Master, Worker 1, Worker 2 节点均要安装

加入阿里云镜像源, 并安装


apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/deb/ /" |
    tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl


tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

安装 kubeadm,kubectl,kubelet 软件包 1.33.1 版本。

apt-get update


apt install kubeadm=1.33.1-1.1 kubelet=1.33.1-1.1 kubectl=1.33.1-1.1 -y

apt-mark hold kubelet kubeadm kubectl

上面的命令在安装kubeadm, kubectl, kubelet 时,会自动安装依赖项conntrack, cri-tools, ebtables, kubernetes-cni, soca

运行kubelet --help可以看到原来kubelet的绝大多数命令行flag参数都被DEPRECATED了,官方推荐我们使用--config指定配置文件,并在配置文件中指定原来这些flag所配置的内容。具体内容可以查看这里Set Kubelet parameters via a config file。最初Kubernetes这么做是为了支持动态Kubelet配置(Dynamic Kubelet Configuration),但动态Kubelet配置特性从k8s 1.22中已弃用,并在1.24中被移除。如果需要调整集群汇总所有节点kubelet的配置,还是推荐使用ansible等工具将配置分发到各个节点。