云原生··By/蜜汁炒酸奶

使用 Kubeadm 安装 Kubernetes 集群

集群安装方式有三种 minikube, kubead, kind:

  • minikube 可以在单机环境下快速搭建可用的k8s集群,非常适合测试和本地开发。
  • 对于机器配置不够好的,可以自行尝试 kind 。
  • 对于机器性能不错的,建议用 kubeadm 。

这里介绍 基于 Debian 的发行版的 kubeadm 安装方式。其余系统的步骤大同小异,可直接看官网的安装教程

安装Kubeadm

1.准备工作

1.1 允许 iptables 检查桥接流量

$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

$ sudo sysctl --system
1
2
3
4
5
6
7
8
9
10

该步骤是 Kubernetes 官方安装指南中的步骤,有些简介教程中无此步骤,请自行选择尝试。

br_netfilter 模块用于做网桥的网络转发。

确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter

为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。

1.2 禁用 swap

kubernetes 在1.21.4 中仍需要关闭 swap 才能正常运行,虽然kubeadm init 时可以通过 --ignore-preflight-errors=Swap 忽略错误初始化成功,但最终运行时不关闭仍旧无法启动 kubernetes 相关服务。

  1. 临时关闭
$ sudo swapoff -a
1
  1. 永久关闭

编辑/etc/fstab,用# 注释里面涉及 swap 行

$ sudo vim /etc/fstab
1

永久关闭无效时,在启动脚本中添加临时关闭的语句,并赋予所有人执行权限即可。具体操作可见:
Linux关闭swap

1.2 安装运行时

自行安装Docker 或者 containerd

Docker安装官方地址

之前有写过一篇 Ubuntu 安装 Docker 的踩坑记录,各位有兴趣也可以看一下:
Ubuntu18安装Docker

当为Docker时,更新 Docker 的 cgroupdriver 为 systemd

$ sudo vi /etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

$ systemctl daemon-reload
$ systemctl restart docker
1
2
3
4
5
6
7
8

2.基于 Debian 的发行版

  1. 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
$ sudo apt-get update

$ sudo apt-get install -y apt-transport-https ca-certificates curl
1
2
3
  1. 下载 阿里的 公开签名秘钥
$ sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
1
失效部分 <blockcode>

2. 下载 Google Cloud 公开签名秘钥(可选)

由于国内环境问题,不是所有人都能下载下来,此步骤可以跳过。

$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
1
</blockcode>
  1. 添加 Kubernetes apt 仓库:
$ sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
1
2
3
失效部分
<blockcode>

此处用的国内中科大的源,也可自行更换自己的

$ sudo cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
 deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
EOF
1
2
3

若提示权限不足,可先创建 kubernetes.list,然后通过sudo chmod 777 kubernetes.list修改权限后再重试等方式实现。

更推荐通过如下方式(官方命令,已替换为中科大的源,此种不会提示权限问题):

$ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
1

4. 添加源所需签名秘钥

该key不同时期可能值不相同,报错缺失时,更换对应缺失的即可。

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B57C5C2836F4BEB

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FEEA9169307EA071
1
2
3

或者执行如下写法的添加,两种写法效果相同:

# 有几个PUBKEY执行几个
$ gpg --keyserver keyserver.ubuntu.com --recv-keys 8B57C5C2836F4BEB
$ gpg --export --armor 8B57C5C2836F4BEB | sudo apt-key add -

# 第二个缺失的key
$ gpg --keyserver keyserver.ubuntu.com --recv-keys FEEA9169307EA071
$ gpg --export --armor FEEA9169307EA071 | sudo apt-key add -
1
2
3
4
5
6
7

如果之后报如下类似错误,将上面语句中的key换成缺失的即可:

错误:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease   
  由于没有公钥,无法验证下列签名: NO_PUBKEY FEEA9169307EA071 NO_PUBKEY 8B57C5C2836F4BEB
1
2
</blockcode>
  1. 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
$ sudo apt-get update

$ sudo apt-get install -y kubelet=1.22.6-00 kubeadm=1.22.6-00 kubectl=1.22.6-00

$ sudo apt-mark hold kubelet kubeadm kubectl
1
2
3
4
5

这里指定了版本1.21.4的版本(更新为 1.22.6),若不指定则默认安装最新版本。更多可用版本列表,通过 sudo apt-cache policy kubelet 查看

Kubeadm_kubelet_01.png

3. 初始化集群

3.1 kubeadm init


# --kubernetes-version 需要设置成自己环境的版本号,
# --apiserver-advertise-address 需要设置成自己环境中的ip,ip地址可通过 ip a 或者 ifconfig -a 获得

$ sudo kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.6 \
--pod-network-cidr=192.168.0.0/16 \
--apiserver-advertise-address=192.168.0.132 
1
2
3
4
5
6
7
8
9

Kubeadm_kubelet_02.png
若之后出现某些问题,可通过journalctl -xeu kubelet 查看kubelet日志。

成功之后提示类似如下信息:

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.0.132:6443 --token d3wgb2.qscs1wq0wfb14mfm \
	 --discovery-token-ca-cert-hash sha256:d2d04a1ea07f9daec945bfdc9fe85ce7cc342e4f8d20e18d4c5d4d9bc2fbb177
1
2
3
4

如果需要在启动过程中启用containerd,请在“kubeadm init”过程中设置cri-socket参数:

kubeadm init \
 --image-repository registry.aliyuncs.com/google_containers \
 --kubernetes-version v1.22.6 \
 --pod-network-cidr=192.168.0.0/16 \
 --cri-socket /run/containerd/containerd.sock \
 --apiserver-advertise-address=192.168.0.132 
1
2
3
4
5
6

3.2 copy kubeconfig(可选)

要使非 root 用户可以运行 kubectl,运行以下命令:

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
1
2
3

如果不设置该配置,当使用kubectl get nodes 时,也可能会报如下错误:

connection to the server localhost:8080 was refused - did you specify the right host or port

3.3 允许master节点调度(可选)

通过设置污点来控制节点调度,如下可允许 master 调度:

$ kubectl taint nodes --all node-role.kubernetes.io/master-
1

若需禁用调度,可执行:

$ kubectl taint nodes k8s-master node-role.kubernetes.io/master=true:NoSchedule
1

默认情况下 master 上不会部署 pod ,当 pod 被调度上 master时会出现节点不允许部署 pod 的问题,作为测试环境可通过上面的方式允许部署。

卸载 kubeadm

有时需要安装其他版本的 kubeadm 等组件,可以通过如下方式卸载当前的

# 查找已安装的特定应用
$ dpkg --get-selections | grep kube

# 卸载查询到的应用
$ sudo apt-get --purge remove  kubeadm kubectl kubelet kubernetes-cni
1
2
3
4
5

Kubeadm_kubelet_dpkg_grep.png

清理必要的集群文件,便于重新初始化

$ kubeadm reset -f
$ sudo rm -rf ~/.kube/
$ sudo rm -rf /etc/kubernetes/
1
2
3
Preview
Loading comments...
0 条评论

No Data

example
Preview