这次弄下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:

 

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