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

安装前准备

系统配置

⚠️

Master, Worker 1, Worker 2 节点配置

创建 /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 节点均要执行

编辑 /etc/fstab, 在 /swap.img 一行前面加 # 或者删除此行

# /swap.img     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使修改生效。

重启

安装 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, 截止到目前最新版本是 1.7.2

下载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/v1.7.2/containerd-1.7.2-linux-amd64.tar.gz

> wget

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

tar Cxzvf /usr/local containerd-1.7.2-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
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,执行以下命令:

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
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:  v1.7.2
RuntimeApiVersion:  v1

安装 kubeadm,kubectl,kubelet 1.28.2

⚠️

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

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

apt-get update
apt-get install -y apt-transport-https ca-certificates curl

curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -


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

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

apt-get update


apt install kubeadm=1.28.2-00 kubelet=1.28.2-00 kubectl=1.28.2-00

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等工具将配置分发到各个节点。

安装 Calico 网卡

部署Pod Network组件Calico

选择calico作为k8s的Pod网络组件,下面使用helm在k8s集群中安装calico。

下载tigera-operator的helm chart:

wget https://github.com/projectcalico/calico/releases/download/v3.26.0/tigera-operator-v3.26.0.tgz

查看这个chart的中可定制的配置:

helm show values tigera-operator-v3.26.0.tgz

imagePullSecrets: {}

installation:
  enabled: true
  kubernetesProvider: ""

apiServer:
  enabled: true

certs:
  node:
    key:
    cert:
    commonName:
  typha:
    key:
    cert:
    commonName:
    caBundle:

# Resource requests and limits for the tigera/operator pod.
resources: {}

# Tolerations for the tigera/operator pod.
tolerations:
- effect: NoExecute
  operator: Exists
- effect: NoSchedule
  operator: Exists

# NodeSelector for the tigera/operator pod.
nodeSelector:
  kubernetes.io/os: linux

# Custom annotations for the tigera/operator pod.
podAnnotations: {}

# Custom labels for the tigera/operator pod.
podLabels: {}

# Image and registry configuration for the tigera/operator pod.
tigeraOperator:
  image: tigera/operator
  version: v1.30.0
  registry: quay.io
calicoctl:
  image: docker.io/calico/ctl
  tag: v3.26.0

使用helm安装calico:

helm install calico tigera-operator-v3.26.0.tgz -n kube-system  --create-namespace

等待并确认所有pod处于Running状态:

监测 calico 以及集群状态

root@master:/mnt/nfs/share/kubernetes# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   12m   v1.28.2
root@master:/mnt/nfs/share/kubernetes# kubectl get pod -n kube-system | grep tigera-operator
tigera-operator-689d868448-b6ff8   1/1     Running   0          5m20s
root@master:/mnt/nfs/share/kubernetes# kubectl get pods -n calico-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-67ddfd6d9d-v9494   1/1     Running   0          5m20s
calico-node-m4w7j                          1/1     Running   0          5m20s
calico-typha-b4c9b5fd8-5w7dx               1/1     Running   0          5m20s
csi-node-driver-l6js2                      2/2     Running   0          5m20s

查看一下calico向k8s中添加的api资源:

kubectl api-resources | grep calico
bgpconfigurations                                                                 crd.projectcalico.org/v1               false        BGPConfiguration
bgpfilters                                                                        crd.projectcalico.org/v1               false        BGPFilter
bgppeers                                                                          crd.projectcalico.org/v1               false        BGPPeer
blockaffinities                                                                   crd.projectcalico.org/v1               false        BlockAffinity
caliconodestatuses                                                                crd.projectcalico.org/v1               false        CalicoNodeStatus
clusterinformations                                                               crd.projectcalico.org/v1               false        ClusterInformation
felixconfigurations                                                               crd.projectcalico.org/v1               false        FelixConfiguration
globalnetworkpolicies                                                             crd.projectcalico.org/v1               false        GlobalNetworkPolicy
globalnetworksets                                                                 crd.projectcalico.org/v1               false        GlobalNetworkSet
hostendpoints                                                                     crd.projectcalico.org/v1               false        HostEndpoint
ipamblocks                                                                        crd.projectcalico.org/v1               false        IPAMBlock
ipamconfigs                                                                       crd.projectcalico.org/v1               false        IPAMConfig
ipamhandles                                                                       crd.projectcalico.org/v1               false        IPAMHandle
ippools                                                                           crd.projectcalico.org/v1               false        IPPool
ipreservations                                                                    crd.projectcalico.org/v1               false        IPReservation
kubecontrollersconfigurations                                                     crd.projectcalico.org/v1               false        KubeControllersConfiguration
networkpolicies                                                                   crd.projectcalico.org/v1               true         NetworkPolicy
networksets                                                                       crd.projectcalico.org/v1               true         NetworkSet
bgpconfigurations                 bgpconfig,bgpconfigs                            projectcalico.org/v3                   false        BGPConfiguration
bgpfilters                                                                        projectcalico.org/v3                   false        BGPFilter
bgppeers                                                                          projectcalico.org/v3                   false        BGPPeer
blockaffinities                   blockaffinity,affinity,affinities               projectcalico.org/v3                   false        BlockAffinity
caliconodestatuses                caliconodestatus                                projectcalico.org/v3                   false        CalicoNodeStatus
clusterinformations               clusterinfo                                     projectcalico.org/v3                   false        ClusterInformation
felixconfigurations               felixconfig,felixconfigs                        projectcalico.org/v3                   false        FelixConfiguration
globalnetworkpolicies             gnp,cgnp,calicoglobalnetworkpolicies            projectcalico.org/v3                   false        GlobalNetworkPolicy
globalnetworksets                                                                 projectcalico.org/v3                   false        GlobalNetworkSet
hostendpoints                     hep,heps                                        projectcalico.org/v3                   false        HostEndpoint
ipamconfigurations                ipamconfig                                      projectcalico.org/v3                   false        IPAMConfiguration
ippools                                                                           projectcalico.org/v3                   false        IPPool
ipreservations                                                                    projectcalico.org/v3                   false        IPReservation
kubecontrollersconfigurations                                                     projectcalico.org/v3                   false        KubeControllersConfiguration
networkpolicies                   cnp,caliconetworkpolicy,caliconetworkpolicies   projectcalico.org/v3                   true         NetworkPolicy
networksets                       netsets                                         projectcalico.org/v3                   true         NetworkSet
profiles                                                                          projectcalico.org/v3                   false        Profile

这些api资源是属于calico的,因此不建议使用kubectl来管理,推荐按照calicoctl来管理这些api资源。 将calicoctl安装为kubectl的插件:

cd /usr/local/bin
curl -o kubectl-calico -O -L  "https://github.com/projectcalico/calicoctl/releases/download/v3.21.5/calicoctl-linux-amd64"
chmod +x kubectl-calico

验证插件正常工作:

kubectl calico -h

验证k8s DNS是否可用

kubectl run curl --image=radial/busyboxplus:curl -it
If you don't see a command prompt, try pressing enter.
[ root@curl:/ ]$

进入后执行nslookup kubernetes.default确认解析正常:

nslookup kubernetes.default
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
 
Name:      kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

配置Calico BGP

由于calico默认不会启用BGP,需要修改calico的clusterrole,添加-bpgfilter参数 tigera operator 3.26 bug 导致的问题

kubectl edit clusterrole calico-crds

编辑资源, 加上 -bpgfilter 如下图所示