光速上手k8s(2023)(containerd)(未完待續)

2023-01-10 06:00:39

又過了好久沒寫了,主要是近來狀況也無聊

一、瞭解概念(參考

概念

Kubernetes 是一個可移植、可延伸的開源平臺,用於管理容器化的工作負載和服務,可促進宣告式設定和自動化。 Kubernetes 擁有一個龐大且快速增長的生態,其服務、支援和工具的使用範圍相當廣泛。

Kubernetes 這個名字源於希臘語,意為「舵手」或「飛行員」。k8s 這個縮寫是因為 k 和 s 之間有八個字元的關係。 Google 在 2014 年開源了 Kubernetes 專案。 Kubernetes 建立在 Google 大規模執行生產工作負載十幾年經驗的基礎上, 結合了社群中最優秀的想法和實踐。

Pod的概念

在K8S中,排程的最小是Pod,一個Pod中可以執行一個或者多個容器。在一個叢集中,K8S會為每個Pod都分配一個叢集內唯一的IP地址。因為K8S要求底層網路支援叢集內的任意節點之間的兩個Pod能夠直接通訊。這些容器共用當前Pod的檔案系統和網路。而這些容器之所以能夠共用,是因為Pod中有一個叫Pause的根容器,其餘的使用者業務容器都是共用這個根容器的IP和Volume。所以這些容器之間都可以通過localhost進行通訊。

二、安裝(參考

kubernetes的國外安裝其實非常簡單,國內安裝的主要問題在於kubernetes部件所需的官方映象在 (Google Cloud Container Registry)上,很不幸,這個網站被牆了。

新增key

下載這個,有梯子的話也可以直接 sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - 

沒有梯子的,下載好之後

sudo apt-key add ./apt-key.gpg
sudo apt-get update

新增源

sudo nano /etc/apt/sources.list.d/kubernetes.list

新增 deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main 

安裝

sudo apt-get update
sudo apt install kubelet kubernetes-cni kubeadm docker.io

驗證k8s是否安裝好即可,直接敲kubectl + 回車。

關閉swap

  • 暫時關閉 直接使用命令 sudo swapoff -a ,但是重啟之後會失效。會導致k8s無法正常執行。
  • 永久關閉  sudo vim /etc/fstab 將有swap.img那行註釋掉,儲存即可。

三、初始化Master節點

 設定HostName

修改主機名

sudo hostnamectl set-hostname master-node

 

 初始化

方法一(推薦):

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

 使用映象:

kubeadm init --image-repository="registry.cn-hangzhou.aliyuncs.com/google_containers" --pod-network-cidr=10.244.0.0/16

忽略一些報錯:

sudo kubeadm init --image-repository="registry.cn-hangzhou.aliyuncs.com/google_containers" --pod-network-cidr=10.244.0.0/16  --ignore-preflight-errors=SystemVerification --ignore-preflight-errors=Mem

 

方法二:

首先 kubeadm config images list ,然後新建一個sh檔案,內容:

images=(  # 下面的映象應該去除"k8s.gcr.io/"的字首,版本換成上面獲取到的版本
    #你剛剛獲取的
)

for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
images=(  # 下面的映象應該去除"k8s.gcr.io/"的字首,版本換成上面獲取到的版本
    kube-apiserver:v1.12.1
    kube-controller-manager:v1.12.1
    kube-scheduler:v1.12.1
    kube-proxy:v1.12.1
    pause:3.1
    etcd:3.2.24
    coredns:1.2.2
)

for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
例子
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

目前最大問題(參考

紀錄檔: "command failed" err="failed to run Kubelet: validate service connection: CRI v1 runtime API is not implemented for endpoint \"> 

似乎與K8s 1.26中的這個變化有關。 解決方案是安裝 containerd 1.6,但是......似乎還沒有 APT 包

通過下載和替換二進位制檔案手動將 containerd 升級到 1.6 或更高版本

wget https://github.com/containerd/containerd/releases/download/v1.6.12/containerd-1.6.12-linux-amd64.tar.gz
tar xvf containerd-1.6.12-linux-amd64.tar.gz
systemctl stop containerd
cd bin
cp * /usr/bin/
systemctl start containerd

 

 

其他節點的加入

命令執行完成之後,會列印一個有kubeadm join的命令,需要儲存下來。

大概長這樣。

kubeadm join 你的IP地址:6443 --token 你的TOKEN --discovery-token-ca-cert-hash sha256:你的CA證書雜湊

token是有時效性的,過期時間一般是86400000毫秒(一天)

 

記億些我遇到的問題

① /var/run/containerd/containerd.sock: connect: no such file or directory\

 

 解決方案 sudo apt install containerd 

如果還不行(來自網路,未測試):

rm -rf /var/lib/containerd
systemctl start containerd
systemctl start docker

 

② /proc/sys/net/bridge/bridge-nf-call- iptables does not exist 

sudo modprobe br_netfilter

 

③ container runtime is not running 

 

 

 安裝一下:

sudo apt install container

如果還不行(來自網路,未測試):

rm -rf /etc/containerd/config.toml
systemctl restart containerd

 

④忽略一些錯誤

例如 [ERROR SystemVerification]: failed to parse kernel config: unable to load kernel module: 「configs「 ,一些教學建議忽略,那麼你可以使用 --ignore-preflight-errors=SystemVerification 來忽略這個錯誤

 

⑤ [kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz’ failed 

 

檢查docker是否安裝,服務是否啟動。啟動服務 sudo systemctl enable --now docker   sudo systemctl restart kubelet 

目前卡這裡了

 

 

⑥ /etc/kubernetes/manifests/etcd.yaml already exists 

重啟服務即可 sudo kubeadm reset