K8s 建立 cluster - Kubeadm(失敗)

 

更新

sudo apt-get update

關閉 swap space

swapoff -a
將 /swapfile 這一行註解起來(前方加上 '#' )
sudo vim /etc/fstab
💡
為什麼要關閉 swap space ?
原因是 K8S 希望 POD 在執行的時候能貼近完全使用 CPU/記憶體 100% 的狀況,在 CPU/記憶體不足的情況下,Unix 系統預設會將記憶體內的資料搬移到 SWAP 做交換,
但是這種交換動作對於容器平台來說非常浪費效能,K8S 希望在 CPU/記憶體滿載的時候直接將 Node 視為滿載,並回報 Master 調度。所以才會有將 SWAP 關閉,避免交換造成效能浪費。
 

修改 hostname (optional)

sudo hostname <your-new-name>
 

增加 node 與 ip

sudo vim /etc/hosts
在檔案中增加:
IP_ADDRESS HOST_NAME_OF_NODE
範例
140.119.19.25 k0s 192.168.0.10 lanz 18.139.136.159 ip-172-31-18-25
 

安裝 docker 與 k8s

docker :
k8s :
 

更新 k8s config

sudo vim /etc/systemd/system/kubelet.service.d/XXXXXXX_CONFIG
加入以下設定:
Environment=”cgroup-driver=systemd/cgroup-driver=cgroupfs”
 
🔥
以下動作只在Control Plane上執行
一共有三步
  1. Init control plane
    1. sudo kubeadm init --pod-network-cidr=<ip-of-container-network-interface> --apiserver-advertise-address=<ip-address-of-master>
      • --pod-network-cidr = ip of network interface
        • Specify range of IP addresses for the pod network.
        • If set, the control plane will automatically allocate CIDRs for every node.
      • --apiserver-advertise-address = ip of master
      • The IP address the API Server will advertise it's listening on. If not set the default network interface will be used.
      💡
      遇到 container runtime is not running 的 error 怎麼解?
      sudo mv /etc/containerd/config.toml /root/config.toml.bak sudo systemctl restart containerd
  1. 依序輸入系統給的三個指令
    1. mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 將最後兩行指令存起來,之後 node 執行此指令即可加入此集群
    1. 範例:
      kubeadm join 140.119.19.25:6443 --token jkcyk4.2b2pu19a3versukc \ --discovery-token-ca-cert-hash sha256:0780fd2d20ae1a445ecc933a3070737bdd4e99a128bed11ff068378191bb49ca
      💡
      遇到 The connection to the server localhost:8080 was refused 該怎麼解?
      1. 試試看
      sudo kubectl get nodes --kubeconfig /etc/kubernetes/admin.conf
      admin.conf 或 kubelet.conf 都可以試試看
      1. 檢查是否有 ~/.kube/config
        1. 把 config 裡面的設定也都貼去 node 裡面的 ~/.kube/config
      1. 剩下的我也不清楚了,網路一致是說需要檢查看看 .kube/config
      1. 後來研判應該是因為 config 檔案吃錯
      使用 kubeconfig 文件组织集群访问
      使用 kubeconfig 文件来组织有关集群、用户、命名空间和身份认证机制的信息。 kubectl 命令行工具使用 kubeconfig 文件来查找选择集群所需的信息,并与集群的 API 服务器进行通信。 说明: 用于配置集群访问的文件称为"kubeconfig 文件"。 这是引用配置文件的通用方法,并不意味着有一个名为 kubeconfig 的文件 警告: 只使用来源可靠的 kubeconfig 文件。使用特制的 kubeconfig 文件可能会导致恶意代码执行或文件暴露。 如果必须使用不受信任的 kubeconfig 文件,请首先像检查 shell 脚本一样仔细检查它。 默认情况下,kubectl 在 $HOME/.kube 目录下查找名为 config 的文件。 你可以通过设置 KUBECONFIG 环境变量或者设置 --kubeconfig参数来指定其他 kubeconfig 文件。 有关创建和指定 kubeconfig 文件的分步说明,请参阅 配置对多集群的访问。 支持多集群、用户和身份认证机制 假设你有多个集群,并且你的用户和组件以多种方式进行身份认证。比如: 正在运行的 kubelet 可能使用证书在进行认证。 用户可能通过令牌进行认证。 管理员可能拥有多个证书集合提供给各用户。 使用 kubeconfig 文件,你可以组织集群、用户和命名空间。你还可以定义上下文,以便在集群和命名空间之间快速轻松地切换。 上下文(Context) 通过 kubeconfig 文件中的 context 元素,使用简便的名称来对访问参数进行分组。 每个 context 都有三个参数:cluster、namespace 和 user。 默认情况下,kubectl 命令行工具使用 当前上下文 中的参数与集群进行通信。 选择当前上下文 kubectl config use-context KUBECONFIG 环境变量 KUBECONFIG 环境变量包含一个 kubeconfig 文件列表。 对于 Linux 和 Mac,列表以冒号分隔。对于 Windows,列表以分号分隔。 KUBECONFIG 环境变量不是必要的。 如果 KUBECONFIG 环境变量不存在,kubectl 使用默认的 kubeconfig 文件,$HOME/.
      使用 kubeconfig 文件组织集群访问
      💡
      The connection to the server 140.119.19.25:6443 was refused 該怎麼辦? 檢查 ~/.kube/config 的權限,若需要 sudo 才能 cat,則
      sudo chmod 777 ~/.kube
 
🔥
以下動作只在 node 執行
  1. 複製 master 的 ~/.kube/config 進去 node 的 ~/.kube/config
  1. (optional) 過了一天希望加入新的 node
    1. 在 master 執行
    2. kubeadm token create
 
 
 
目前的 error
  1. The connection to the server 140.119.19.25:6443 was refused - did you specify the right host or port?
  1. not able to join node error execution phase preflight