2.1 | kubernetes: 在裸机 Linux 上安装 k8s 集群
在开始安装 k8s 必要的软件前,最理想的环境是能够自由访问外网,所以需要先准备好代理,这样在安装被墙软件、拉取被墙的镜像时方便很多,不用为这种意义不大的事情纠结。重命名系统名称hostnamectl set-hostname k8s-masterhostnamectl set-hostname k
在开始安装 k8s 必要的软件前,最理想的环境是能够自由访问外网,所以需要先准备好代理,这样在安装被墙软件、拉取被墙的镜像时方便很多,不用为这种意义不大的事情纠结。
基础系统: Ubuntu Server 22.04 虚拟机软件:VMware Fusion 宿主机系统:macOS
重命名系统名称
hostnamectl set-hostname k8s-master
echo "127.0.0.1 $(hostname)" >> /etc/hosts
Ubuntu 22.04 必要软件安装
设置软件源
打开 /etc/apt/source.list,替换软件源为阿里云源,如下
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
更新软件源
sudo apt update && sudo apt upgrade -y
zsh
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 配置文件
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
基础软件
常用小工具
sudo apt install -y \
apt-transport-https gnupg2 curl vim \
htop tree neofetch tldr tig make cmake \
golang-go nodejs
网络工具
sudo apt install -y \
net-tools bridge-utils iputils-ping iproute2 \
netcat telnet traceroute
sudo 免输入密码
sudo update-alternatives --config editor
sudo visudo
修改配置如下
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
或直接运行下面的命令
sudo sed -i '50s/ALL$/NOPASSWD:ALL/g' /etc/sudoers
Docker
配置 Docker 软件源
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
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
配置 Docker:/etc/docker/daemon.json
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)
sudo usermod -aG docker $USER
开启 TCP 访问
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 分区
永久关闭
#/swapfile none swap sw 0 0
sudo vim /etc/fstab
暂时关闭,重启后失效
sudo swapoff -a
kubernetes 三件套
下载 gpg 密钥
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 镜像源
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list >/dev/null
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
更新源列表
sudo apt update
下载 kubectl,kubeadm以及 kubelet
sudo apt install -y kubelet kubeadm kubectl kubernetes-cni
K8s 集群安装
配置 containerd
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
安装集群
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 目录下
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 状态。
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
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 指定的网段保持一致。
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
- 添加非 https 仓库 打开
/etc/containerd/config.toml文件,添加如下配置:
[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
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
关闭 swap
sudo swapoff -a
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
新增依赖
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。
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl daemon-reload && systemctl restart docker
安装并开启 kubelet 自启动
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 中添加如下变量:
export ALL_PROXY=http://10.211.55.2:8001
让变量生效
source .bashrc
测试
curl -v www.google.com
apt 命令走代理
sudo apt -o Acquire::http::proxy="http://10.211.55.2:8001" update
配置 Docker 代理
vim /lib/systemd/system/docker.service
在 [Service] 块下面增加一行
Environment="HTTP_PROXY=http://10.211.55.2:8001" "HTTPS_PROXY=https://10.211.55.2:8001"
再重新加载守护进程与重启 docker
systemctl daemon-reload
systemctl restart docker
Reference
https://www.xiebruce.top/796.htmlhttps://forum.ubuntu.org.cn/viewtopic.php?t=476834