# Kubernetes 集群安装

要了解有关 `kubeadm` 工具箱的一些详细信息，最好的方法是使用它来管理 k8s 集群。这包括整个生命周期管理：新安装 (HA)、扩容/缩容和升级。所有信息截至 2022 年 5 月均为最新。

## 准备工作
您需要在所有节点上进行此准备工作。

1. https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#before-you-begin
   我使用 `terraform` 工具设置 5 个 Ubuntu 20.04 节点（2 vCPU，6Gi RAM）。

2. 基本操作系统设置/更新
    ```bash
    sudo hostnamectl set-hostname node1
    sudo apt update
    sudo apt upgrade
    ```

3. 容器运行时 ([containerd](https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd))
   使用以下命令在您的系统上安装 containerd：

   a. 安装并配置先决条件：
    ```bash
    cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
    overlay
    br_netfilter
    EOF

    sudo modprobe overlay
    sudo modprobe br_netfilter

    # Setup required sysctl params, these persist across reboots.
    cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.ipv4.ip_forward                 = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    EOF

    # Apply sysctl params without reboot
    sudo sysctl --system
    ```

   b. 安装 containerd
    访问 Getting started with containerd 并按照那里的说明进行操作。
    ```bash
    wget https://github.com/containerd/containerd/releases/download/v1.6.4/containerd-1.6.4-linux-amd64.tar.gz
    sudo tar Cxzvf /usr/local containerd-1.6.4-linux-amd64.tar.gz
    wget https://github.com/containerd/containerd/raw/main/containerd.service
    sudo mkdir -p /usr/local/lib/systemd/system
    sudo cp containerd.service /usr/local/lib/systemd/system/containerd.service
    sudo systemctl daemon-reload
    sudo systemctl enable --now containerd
    ```

   c. 安装 runc
    ```bash
    wget https://github.com/opencontainers/runc/releases/download/v1.1.1/runc.amd64
    sudo install -m 755 runc.amd64 /usr/local/sbin/runc
    ```

   d. 安装 CNI 插件
    ```bash
    wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
    sudo mkdir -p /opt/cni/bin
    sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz
    ```

## 安装 kubeadm, kubelet 和 kubectl
您将在所有节点上安装这些包。

1. 安装 crictl (kubeadm/kubelet 容器运行时接口 (CRI) 所需)
   ```bash
   CRICTL_VERSION="v1.24.0"
   ARCH="amd64"
   DOWNLOAD_DIR=/usr/local/bin
   sudo mkdir -p $DOWNLOAD_DIR
   curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz
   ```

2. 安装 kubeadm, kubelet, kubectl 并添加 kubelet systemd 服务
   ```bash
   #RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
   RELEASE="v1.23.0"
   ARCH="amd64"
   cd $DOWNLOAD_DIR
   sudo curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet,kubectl}
   sudo chmod +x {kubeadm,kubelet,kubectl}
   
   RELEASE_VERSION="v0.4.0"
   curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service
   sudo mkdir -p /etc/systemd/system/kubelet.service.d
   curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
   ```

3. 依赖安装/设置 (Ubuntu 22.04)
   `sudo apt install socat conntrack -y`

## 初始化控制平面   
  `sudo kubeadm init --apiserver-advertise-address {node-ip-address}`
  > ignored: [WARNING SystemVerification]: missing optional cgroups: blkio

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

## 设置 CNI
  1. 安装 Cilium CLI
  ```bash
    curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz{,.sha256sum}
    sha256sum --check cilium-linux-amd64.tar.gz.sha256sum
    sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
    rm cilium-linux-amd64.tar.gz{,.sha256sum}
  ```
  2. 安装 Cilium: `cilium install`
    
## 设置工作节点
1. 报告准备和 kubeadm/kubelet, kubectl 设置。
2. 加入节点。

## Calico 说明
1. 确保默认的 "CALICO_IPV4POOL_CIDR" 不与节点 CIDR 冲突（例如，在 KVM 默认网络中，子网是 192.168.100/200.0/24）。我最终设置了 172.16.0.0/16。否则冲突将导致节点不可达，Calico pod 未就绪。

2. 问题：calico/node 未就绪：BIRD 未就绪：BGP 未建立
   解决方案：通过搜索 `autodetect` 修改 `calico.yaml`。

   ```yaml
   - name: IP
     value: "autodetect"
   ```

   在它之后添加以下行：

   ```yaml
   - name: IP_AUTODETECTION_METHOD
     value: "interface=ens*"
   ```

   所以它看起来像：

   ```yaml
   # Auto-detect the BGP IP address.
   - name: IP
     value: "autodetect"
   - name: IP_AUTODETECTION_METHOD
     value: "interface=ens*"
   ```

