# 跨VPC网络-工具安装

|    软件/系统    |     版本    |    发布日期    |
| :---------: | :-------: | :--------: |
|    Ubuntu   | 22.04 LTS | 2022-04-21 |
|  Kubernetes | 1.24.4-00 | 2022-08-18 |
|  containerd |   1.6.6   | 2022-06-07 |
|     runc    |   1.1.2   | 2022-05-12 |
| CNI Plugins |   1.1.1   | 2022-02-24 |

> 红帽已决定 2024 年终止 CentOS 项目的更新和发布。受此影响，很多企业和开发者转向 Ubuntu/Debian。此处我们选择最新的 Ubuntu 长期稳定版。
>
> k8s v1.24 起放弃了 docker 作为默认的容器运行时，故我们选择最主流的运行时 containerd。
>
> runc 和 CNI Plugins 是 containerd 的核心组件。

### 1. 服务器列表

**我们用下面三台不同 VPC 网络的服务器来演示搭建k8s集群。**

|     内网ip     |      外网ip      | hostname |  区域 |
| :----------: | :------------: | :------: | :-: |
| 172.19.200.6 |  43.129.25.161 |  master  |  香港 |
|  172.22.0.10 |  43.134.80.11  |   node1  | 新加坡 |
|  172.26.0.9  | 43.135.160.117 |   node2  |  美国 |

> 注意私网IP，不要使用同一个网段，防止冲突

### 2. kubeadm 集群工具安装（版本号1.24）

**2.1 节点之中不能有重复的主机名、MAC 地址或 product\_uuid。**

```bash
# 查询MAC地址, 
sudo cat /sys/class/net/eth0/address
sudo cat /sys/class/dmi/id/product_uuid
```

**2.2 允许 iptables 检查桥接流量**

```bash
# 确保br_netfilter和overlay模块被加载
lsmod | grep 'br_netfilter\|overlay'

# 如果没加载，显式加载这两个模块
sudo modprobe br_netfilter; sudo modprobe overlay


# 让 Linux 节点上的 iptables 能够正确地查看桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
overlay
EOF

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

sudo sysctl --system
```

**2.3 在各个服务器开启必需端口**

| 协议  | 方向 | 端口范围        | 作用                      |
| --- | -- | ----------- | ----------------------- |
| TCP | 入站 | 6443        | Kubernetes API server   |
| TCP | 入站 | 2379-2380   | etcd server client API  |
| TCP | 入站 | 10250       | Kubelet API             |
| TCP | 入站 | 10259       | kube-scheduler          |
| TCP | 入站 | 10257       | kube-controller-manager |
| TCP | 入站 | 30000-32767 | NodePort Services       |
| UDP | 入站 | 8472        | Flannel vxlan           |

**2.4 然后用 netcat 工具检查端口是否启用（以 6443 为例）**

```bash
# 服务器端（假设服务器ip 172.19.200.6）开启nc监听6443端口
nc -lnv 6443

# 客户端测试服务器端的6443端口是否可访问
nc -vz -w 2 172.19.200.6 6443
```

**修改 hosts 文件**

```bash
cat << EOF >> /etc/hosts
172.19.200.6   master
43.129.25.161  master

172.22.0.10    node1
43.134.80.11   node1

172.26.0.9    node2
43.135.160.117 node2
EOF
```

**2.5 禁用交换分区**

> swap这一项全部为 0B，就是禁用状态, 服务器开通时候默认是禁用状态

```bash
root@VM-200-6-ubuntu:~# free -m
               total        used        free      shared  buff/cache   available
Mem:            3400         213        2676           2         510        2960
Swap:              0           0           0
```

**2.6 安装容器**

k8s 支持以下三种容器运行时

|              容器运行时             |                  Unix 域套接字                 |
| :----------------------------: | :----------------------------------------: |
|           containerd           | unix:///var/run/containerd/containerd.sock |
|              CRI-O             |       unix:///var/run/crio/crio.sock       |
| Docker Engine (使用 cri-dockerd) |      unix:///var/run/cri-dockerd.sock      |

此处安装 containerd，推荐官方二进制文件下载安装的方式

```bash
# 下载安装包
cd /usr/local/src
wget https://github.com/containerd/containerd/releases/download/v1.6.6/containerd-1.6.6-linux-amd64.tar.gz
tar xzvf  containerd-1.6.6-linux-amd64.tar.gz -C /usr/local


mkdir -p /usr/local/lib/systemd/system/
wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -O /usr/local/lib/systemd/system/containerd.service
systemctl daemon-reload
systemctl enable --now containerd
```

**2.7 安装 runc**

```bash
wget https://github.com/opencontainers/runc/releases/download/v1.1.2/runc.amd64
install -m 755 runc.amd64 /usr/local/sbin/runc
```

**2.8 安装 CNI 插件**

```bash
wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
mkdir -p /opt/cni/bin
tar xzvf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin
```

**2.9 安装 kubeadm、kubelet 和 kubectl**

在每台服务器上安装以下的软件包：

* kubeadm：用来初始化集群的指令
* kubelet：在集群中的每个节点上用来启动 Pod 和容器等
* kubectl：用来与集群通信的命令行工具

```bash
# 1. 添加源,并添加 Kubernetes apt 仓库 
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add 
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list


# 2. 更新 apt 包索引，安装 kubelet、kubeadm 和 kubectl，并锁定其版本：
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo apt-get install -y kubelet=1.24.4-00 kubeadm=1.24.4-00 kubectl=1.24.4-00
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl status kubelet   # kubelet 现在每隔几秒就会重启，因为它陷入了一个等待 kubeadm 指令的死循环。
```

**2.10 配置 cgroup 驱动程序**

```bash
# 二进制包安装方式（本文的方式）没有生成配置文件，需要手动生成
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

# 修改 config.toml，启用 Systemd Cgroup。
sed -i "s/            SystemdCgroup = false/            SystemdCgroup = true/g" /etc/containerd/config.toml 


# 然后重启 containerd。
sudo systemctl restart containerd
sudo systemctl status containerd

```

> 在部署环节- k8s集群初始化将配置 kubelet cgroup 驱动，所以此处无需配置。&#x20;
>
> 至此，k8s 的集群工具安装完成，
>
> 准备进入下一节：部署 `ETCD` 存储, 最好 etcd 集群是单独的机器
