又過了好久沒寫了,主要是近來狀況也無聊
一、瞭解概念(參考)
概念
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部件所需的官方映象在 http://gcr.io(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