共计 4454 个字符,预计需要花费 12 分钟才能阅读完成。
k8s + docker 基于 kubeadm 多节点集群部署
博客文章地址:https://blog.taoluyuan.com/posts/install-k8s/
各个节点环境筹备
[环境筹备] 这章的操作都要在两台机器上别离执行, 我筹备了两台机器, 如下:
- 一台 master, 一台 node
-
主机 1(master) ip:192.168.31.122, 主机 2 192.168.31.166
1. docker 装置
如曾经装置好 docker 可跳过
docker 官网装置 https://docs.docker.com/engine/install/ubuntu/ 有点慢
清华大学 镜像装置办法 https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
装置依赖
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \"$(. /etc/os-release && echo "$VERSION_CODENAME")"stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
装置 docker-ce
sudo apt-get update
sudo apt-get install docker-ce
docker 组授予用户根级权限, 让以后登陆也能够应用 docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
镜像加速器
通过批改 daemon 配置文件 /etc/docker/daemon.json 批改 registry, 我应用的是上海交大
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://docker.mirrors.sjtug.sjtu.edu.cn/"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2. 装置 kubeadm, kubelet 和 kubectl
[阿里云官网举荐源](https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.1365…
)
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt-get update
装置 1.22.0 版本
apt-get install -y kubelet=1.22.0-00 kubeadm=1.22.0-00 kubectl=1.22.0-00
查看版本
kubelet --version
kubeadm version
kubectl version
kubelet 开机自启
systemctl enable kubelet
应用 systemd 作为 docker cgroup 驱动程序
从 v1.22 开始,在应用 kubeadm 创立集群时,kubeadm 默认应用 systemd, 而 docker 默认应用 cgroupfs, 所以须要批改 docker 的 cgroup 驱动程序为 systemd,k8s cgroup-drivers 阐明
关上 /etc/docker/daemon.json 文件, 追加以下配置
{"exec-opts": ["native.cgroupdriver=systemd"]
}
重启 docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
查看 cgroup 驱动, 必须是 systemd, 才行
docker info|grep Cgroup
4. swapoff 设置
设置 swapoff
sudo swapoff -a
永恒设置 swapoff, 正文掉 swap 那一行
vim /etc/fstab
查看 swapon, 必须是空的, 不然接下来的 kubeadm init 会报错
swapon -s
kubeadm 主节点 装置 k8s
kubeadm init 装置 k8s
-
能够先拉取镜像, 这样 kubeadm init 的时候就不会拉取镜
sudo kubeadm config images pull --kubernetes-version=v1.22.0 --image-repository registry.aliyuncs.com/google_containers
- 执行 init
- –kubernetes-version 指定 k8s 版本为 1.22.0,
- –image-repository 指定镜像仓库为阿里云:registry.aliyuncs.com/google_containers, 因为 k8s 默认的镜像仓库是 gcr.io, 国内拜访不了
-
–pod-network-cidr 指定 pod 的网段, 须要与 cni 插件的网段统一, 否则会呈现 pod 无奈通信的问题 ,flannel 的网段是 10.244.0.0/16
sudo kubeadm init --kubernetes-version=v1.22.0 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
-
kubectl get nodes 查看节点状态
kubectl get nodes
应该会 呈现 localhost:8080 was refused – did you specify the right host or port? 谬误
将 /etc/kubernetes/admin.conf 拷贝到 $HOME/.kube/configmkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown -R $USER:$USER $HOME/.kube
再查看 nodes 状态
装置网络插件
此时获取节点状态会发现有一个节点是 NotReady 状态,
而且, 查看 pod 状态会发现,coredns 也是 Pending 状态
kubectl get pods --all-namespaces
这是因为还没有装置网络插件, 这里我抉择装置 flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
网络不好能够应用 ghproxy
kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
期待会再次查看 pod 状态,coredns 状态是 Running, 节点状态是 Ready
子节点退出集群
-
master 节点生成 token, 并且指定 master 节点的 ip, 生成 join 命令
kubeadm token create --print-join-command --ttl 0 --kubeconfig /etc/kubernetes/admin.conf
会呈现 相似以下 join 命令
kubeadm join 192.168.31.122:6443 --token kzmdey.dk0tcgyg4ivr8y87 --discovery-token-ca-cert-hash sha256:bc2e3252080ba81e342933955682ae119decc948fef2180e5135b0dd891e5891
- 在子节点执行下面的 join 命令, 退出集群
-
在 master 节点查看节点状态
k get nodes -o wide
能够看到两个节点都是 Ready 状态
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME song Ready control-plane,master 45h v1.22.0 192.168.31.122 <none> Ubuntu 22.10 5.19.0-21-generic docker://24.0.2 song2 Ready <none> 77m v1.22.0 192.168.31.166 <none> Ubuntu 22.10 5.19.0-21-generic docker://24.0.2
装置相干问题排查
-
container runtime is not running: output: time=”2023-06-08T14:09:02Z” level=fatal msg=”validate service connection: CRI v1 runtime API is not implemented for endpoint \”unix:///var/run/containerd/containerd.sock\”: rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService”
解决办法sudo rm /etc/containerd/config.toml sudo systemctl restart containerd
-
ubuntu 零碎
swapoff -a
- 查看 pod 呈现谬误, 要是呈现相似 pod cidr not assigned, 如果是 flannel 网络插件, 那么就是没有设置 pod-network-cidr
-
排查 kubelet 日志
sudo systemctl status kubelet.service sudo journalctl -xu kubelet.service