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
上面是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"
這裏改用ali雲的, ref: https://www.dandelioncloud.cn/article/details/1518251960347222017, 配置源 https://www.jianshu.com/p/44c4c0fe7fc7: