2.1 | kubernetes: 在裸机 Linux 上安装 k8s 集群

在开始安装 k8s 必要的软件前,最理想的环境是能够自由访问外网,所以需要先准备好代理,这样在安装被墙软件、拉取被墙的镜像时方便很多,不用为这种意义不大的事情纠结。

基础系统: Ubuntu Server 22.04
虚拟机软件:VMware Fusion
宿主机系统:macOS

重命名系统名称

1
2
hostnamectl set-hostname k8s-master
echo "127.0.0.1 $(hostname)" >> /etc/hosts

Ubuntu 22.04 必要软件安装

设置软件源

打开 /etc/apt/source.list,替换软件源为阿里云源,如下

1
2
3
4
5
6
7
8
9
10
11
12
cat << EOF | sudo tee /etc/apt/sources.list >/dev/null && sudo apt update 
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF

更新软件源

1
sudo apt update && sudo apt upgrade -y

zsh

1
2
3
4
5
6
7
8
sudo apt install -y zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# zsh-syntax-highlighting 命令是否正确
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

# zsh-autosuggestions 根据命令历史推荐
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

修改 zsh 配置文件

1
2
3
sed -i '2s/# //g' ~/.zshrc
sed -i 's/ZSH_THEME=.*/ZSH_THEME=ys/g' ~/.zshrc
sed -i 's/plugins=(git)/plugins=(git zsh-syntax-highlighting zsh-autosuggestions)/' ~/.zshrc

基础软件

常用小工具

1
2
3
4
sudo apt install -y \
apt-transport-https gnupg2 curl vim \
htop tree neofetch tldr tig make cmake \
golang-go nodejs

网络工具

1
2
3
sudo apt install -y \
net-tools bridge-utils iputils-ping iproute2 \
netcat telnet traceroute

sudo 免输入密码

1
2
sudo update-alternatives --config editor
sudo visudo

修改配置如下

1
%sudo   ALL=(ALL:ALL) NOPASSWD:ALL

或直接运行下面的命令

1
sudo sed -i '50s/ALL$/NOPASSWD:ALL/g' /etc/sudoers

Docker

配置 Docker 软件源

1
2
3
4
5
6
7
8
9
10
sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker 及 containerd

1
2
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

配置 Docker:/etc/docker/daemon.json

1
2
3
4
5
6
7
8
9
10
11
12
13
cat <<EOF | sudo tee /etc/docker/daemon.json >/dev/null
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com"
],
"exec-opts": [
"native.cgroupdriver=systemd"
]
}
EOF

普通用户使用 docker 命令 (可尝试 logout 后再 login)

1
sudo usermod -aG docker $USER

开启 TCP 访问

1
2
sudo sed -i '/^ExecStart=/s#$# -H tcp://0.0.0.0:2375#' /lib/systemd/system/docker.service
sudo systemctl daemon-reload && sudo systemctl restart docker

关闭 swap 分区

永久关闭

1
2
#/swapfile none swap sw 0 0
sudo vim /etc/fstab

暂时关闭,重启后失效

1
sudo swapoff -a

kubernetes 三件套

下载 gpg 密钥

1
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo tee /etc/apt/trusted.gpg.d/kubernetes-aliyun.gpg >/dev/null

添加 k8s 镜像源

1
2
3
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list >/dev/null
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

更新源列表

1
sudo apt update

下载 kubectl,kubeadm以及 kubelet

1
sudo apt install -y kubelet kubeadm kubectl kubernetes-cni

K8s 集群安装

配置 containerd

1
2
3
4
5
6
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
# 修改 /etc/etc/containerd/config.toml 默认镜像,改成国内或者私有镜像仓库地址
sudo sed -i "s/k8s.gcr.io/registry.aliyuncs.com\/google_containers/g" /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# 重启 containerd
sudo systemctl restart containerd

安装集群

1
2
3
4
sudo kubeadm init \
--cri-socket /run/containerd/containerd.sock \
--pod-network-cidr=10.244.0.0/16 \
--image-repository=registry.aliyuncs.com/google_containers
  • 10.244.0.0/16 的含义

对一个用 32 位二进制表示的 IP 地址,前 16 位位网络前缀,即不变的前缀,后面的 16 位是主机地址,是可变的。此处即 10.244 占 16 位,位网络前缀,不变。

  • --pod-network-cidr

指 pod 网络的 IP 地址范围

  • --service-cidr

指 svc 的虚拟 IP 地址范围,默认为 10.96.0.0/12

  • --apiserver-advertise-address

显式指定 apiserver 的 IP 地址

配置 kubectl

此时还不能通过 kubectl 访问,需要将配置文件拷贝到 $HOME/.kube 目录下

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

加入集群

在各个 Node 中执行 kubeadm join ...

  • 添加 Node 的语句如果堵塞,考虑验证 node 节点与 master 节点之间的连通性。
  • 添加 Node 节点完成后,在 master 节点,如果发现 node 节点的状态为 NotReady,还可以考虑查看 master 与各个 node 节点之间的连通性。

安装 CNI 插件

安装 CNI 插件,不然 NODE 会处于 NOT_READY 状态。

  • calico

    1
    kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
  • flannel

    1
    2
    kubectl apply -f \
    https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

这个 flannel 有坑,apply 之后,在 pod 中无法访问 k8s 的 api-server。原因可能是上面 apply 的 kube-flannel.yml 中的 flannel 子网段是 10.244.0.0/16

后面确实在文档中找到相关的说明,需要在跑 kubeadm init 的时候,指定 --pod-network-cidr=10.244.0.0/16,也就是和 flannel 指定的网段保持一致。

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
kind: ConfigMap
apiVersion: v1
metadata:
name: kube-flannel-cfg
namespace: kube-system
labels:
tier: node
app: flannel
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}

而 docker0 网桥的地址范围是 172.17.0.0/16

宿主机路由表

结果

最终,可以在 master 节点通过 kubectl get nodes -o wide 来查看集群的组成信息,如下:

节点信息

其他配置

containerd

  1. 添加非 https 仓库
    打开 /etc/containerd/config.toml 文件,添加如下配置:
    1
    2
    3
    4
    5
    [plugins]
    [plugins.cri.registry]
    [plugins.cri.registry.mirrors]
    [plugins.cri.registry.mirrors."127.0.0.1:5000"]
    endpoint = ["http://127.0.0.1:5000"]
    重启 containerd systemctl restart containerd

CentOS

关闭selinux

1
2
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

关闭 swap

1
sudo swapoff -a
1
2
3
4
5
6
7
8
9
10
11
12
13
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io

新增依赖

1
2
3
4
5
6
7
8
9
10
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo >/dev/null
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

修改 docker 的 CgroupDriver。默认的是 cgroupfs,推荐的是 systemd。

1
2
3
4
5
6
7
vim /etc/docker/daemon.json

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

systemctl daemon-reload && systemctl restart docker

安装并开启 kubelet 自启动

1
2
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet

代理

宿主机设置 v2ray 代理服务

模式选择 global,这里主要是因为没有设置 pac 规则

宿主机 IP:10.211.55.2

虚拟机 IP:10.211.55.3

curl 命令走代理

在 .bashrc 中添加如下变量:

1
export ALL_PROXY=http://10.211.55.2:8001

让变量生效

1
source .bashrc

测试

1
curl -v www.google.com

apt 命令走代理

1
sudo apt -o Acquire::http::proxy="http://10.211.55.2:8001" update

配置 Docker 代理

1
vim /lib/systemd/system/docker.service

[Service] 块下面增加一行

1
Environment="HTTP_PROXY=http://10.211.55.2:8001" "HTTPS_PROXY=https://10.211.55.2:8001"

再重新加载守护进程与重启 docker

1
2
systemctl daemon-reload
systemctl restart docker

Reference

https://www.xiebruce.top/796.html
https://forum.ubuntu.org.cn/viewtopic.php?t=476834

2.1 | kubernetes: 在裸机 Linux 上安装 k8s 集群

https://eucham.me/2021/10/14/3c640a7f1fff.html

作者

遇寻

发布于

2021-10-14

更新于

2022-08-29

许可协议

评论