這次弄下k8s 分佈式多機測試,這次專門多創建了幾個機器進行安裝,實時監控機器狀態

 

k8s 實機分佈式測試,這次弄一下這個,上次弄的是單機版本的minikube, 在單機上minikube替代了kubectl的工作,在單機上可以創建多個佈署等,實際使用會有多個系統,分佈式纔是正常生產時發按它效率的時間。

k8s說明上要求機器要有2g內存,這裏我創建了四個vm, 每個4g內存,這樣可以更清晰地運行k8s,爲了節省時間和安裝,每個機器都安裝ubuntu 22 stable, 採用basic的安裝,不安裝多餘的工具組件。

這裏採用nat(網絡地址轉換)的方式組vm網絡,這種方式和host-only的區別僅是從機能夠上網,但對外顯示依舊只有主機,沒有采用bridge橋接的方式暴露在外網。 

在k8s裏面要分清pod和node的概念,pod指的是一個佈署,一般一個佈署會包含多個服務,負載均衡器,選擇器等, 而node一般指物理機器加入到k8s的master主機創建的集羣裏。

繼續之前,先喫好飯,這個東西因爲可能會很漫長,所以蠻費力氣的,不然的話餓了,許多東西記性可能就不太好了,不過做筆記,常言說,好記性不如爛筆頭,筆記可以跟隨進度當一個備份,備後來查看。

 23-11-8

我在上次寫的時候使用的是wsl安裝的minikube進行單機測試,這次要安裝了,兩個都要安裝ubuntu上面,所以就打開vm, 因爲兩個vm都是全新基本安裝,沒有多餘的工具,這裏需要安裝cri, 就是container runtime interface容器運行時接口。

先刪除所有舊的docker 相關的安裝:

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

如果之前有安裝,可能還要手動刪除docker殘留文件:

sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

docker-engine有幾種安裝方式,這裏直接用安裝docker的apt高級包工具進行安裝:

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
View Code

上面是apt 倉庫源,下面安裝docker:

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

驗證docker已經被成功安裝:

sudo docker run hello-world

小結:

上面寫的是全新的docker相關安裝, 進行了docker的刪除,docker apt repo的安裝, 還有docker的全新安裝,驗證了docker的成功安裝。

docker的升級: 

會有相關的升級。簡單的安裝步驟: www.getdocker.com 是一個在已經寫好的在線安裝腳本,直接可用。

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh --dry-run

這裏需要着重說明一下,k8s 提供了幾種集成容器運行時的方式,不過第一個是containerd,這是一個容器運行時,但卻不是docker, docker官方的容器編排系統是docker-swarm,這是它的系統,不過因爲常用docker,這裏就要安裝一個docker到k8s的適配器 crim,它的socket路徑在 /run/cri-dockerd.sock, 要記得linux下所有都是文件,socket也是。 在按上面安裝好docker之後,裏面也安裝了containerd.io,因爲cri-dockered在github上,無法連接到,它似乎是一個商業化的版本,這裏就forgo它;還有一種是cri-o, 這個也是一個容器運行時,它的配置是最簡單的; containerd的安裝也在github上有文檔,有它自己的安裝方法,不過裏面有說明在docker-engine的安裝裏面就提供了containerd.io它的安裝,它是由docker官方提供的,這裏既然安裝了docker就用這個了,這就是apt的方式安裝containerd,因爲這種最簡便,就先用這個繼續,但是這個安裝裏面不包括 containerd裏的cni plugin插件, 默認socket位置在 /run/containerd/containerd.sock, containerd的基本命令:

https://github.com/containerd/containerd/blob/main/docs/getting-started.md

ctr images pull docker.io/library/redis:alpine
ctr run docker.io/library/redis:alpine redis

這裏配置要用linux的cgroup,是contstraint group,指組限制。systemd是linux下的system daemon 守護精靈。

這裏首先去 /etc/containerd/config.toml, 在disable plugin列表裏面去掉ctl,  要還原config.toml的配置可以使用如下命令:

containerd config default > /etc/containerd/config.toml

這裏先執行上面的還原一下,因爲docker 的deb包安裝帶的config.toml裏面的內容缺少很多, 沒有配置的節,還原好後,在配置的時候要使用runc這個工具運行,runc是linux上生成運行容器的一個命令行接口,這裏要在config.toml配置找到下面節點並設置成下面的true選項來使用linux的systemd:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

然後重啓containerd 服務. 然後需要手動設置 linux的control group 即cgroup, https://v1-27.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/#configuring-the-kubelet-cgroup-driver

這裏就設置好了使用containerd 來作爲container runtime了,重寫sandbox 沙盒鏡像: 找到裏面的

[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.k8s.io/pause:3.2"

 

k8s的網絡模型:

https://v1-27.docs.kubernetes.io/docs/concepts/services-networking/

 

實際安裝k8s: 

https://v1-27.docs.kubernetes.io/docs/tasks/

 

這裏直接安裝配套工具:

sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.27/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.27/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

 配置控制組cgroup驅動,手動創建如下yaml文件,版本改爲對應已安裝的,初始化配置,https://v1-27.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ , 可以配置使用私有的image registry,

kubeadm 的使用:https://v1-27.docs.kubernetes.io/docs/reference/setup-tools/kubeadm/ :

# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
kubeadm init --config kubeadm-config.yaml

 

創建集羣:

不過似乎又被牆了: sudo kubeadm config images pull, 這樣沒辦法了麼

sudo kubeadm config images pull
I1108 10:55:18.280924   10788 version.go:256] remote version is much newer: v1.28.3; falling back to: stable-1.27

failed to pull image "registry.k8s.io/kube-apiserver:v1.27.7": output: E1108 10:57:10.525653   10814 remote_image.go:167] "PullImage from image service failed" err="rpc error: code = Unknown desc = failed to pull and unpack image \"registry.k8s.io/kube-apiserver:v1.27.7\": failed to resolve reference \"registry.k8s.io/kube-apiserver:v1.27.7\": failed to do request: Head \"https://us-west2-docker.pkg.dev/v2/k8s-artifacts-prod/images/kube-apiserver/manifests/v1.27.7\": dial tcp 64.233.188.82:443: connect: connection refused" image="registry.k8s.io/kube-apiserver:v1.27.7"
time="2023-11-08T10:57:10+08:00" level=fatal msg="pulling image: rpc error: code = Unknown desc = failed to pull and unpack image \"registry.k8s.io/kube-apiserver:v1.27.7\": failed to resolve reference \"registry.k8s.io/kube-apiserver:v1.27.7\": failed to do request: Head \"https://us-west2-docker.pkg.dev/v2/k8s-artifacts-prod/images/kube-apiserver/manifests/v1.27.7\": dial tcp 64.233.188.82:443: connect: connection refused"
View Code

 這裏改用ali雲的, ref: https://www.dandelioncloud.cn/article/details/1518251960347222017, 配置源 https://www.jianshu.com/p/44c4c0fe7fc7:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章