k8s + docker 基于 kubeadm 多节点集群部署

news/2024/10/30 15:29:58/

k8s + docker 基于 kubeadm 多节点集群部署

博客文章地址:https://blog.taoluyuan.com/posts/install-k8s/

各个节点环境准备

[环境准备] 这章的操作都要在两台机器上分别执行,我准备了两台机器,如下:

  1. 一台master,一台node
  2. 主机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

阿里云官方推荐源

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

  1. 可以先拉取镜像,这样kubeadm init的时候就不会拉取镜
sudo kubeadm config images pull --kubernetes-version=v1.22.0 --image-repository registry.aliyuncs.com/google_containers
  1. 执行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
  1. kubectl get nodes 查看节点状态
kubectl get nodes

应该会 出现 localhost:8080 was refused - did you specify the right host or port? 错误
将 /etc/kubernetes/admin.conf 拷贝到 $HOME/.kube/config

mkdir -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

子节点加入集群

  1. 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
  1. 在子节点执行上面的join命令,加入集群
  2. 在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

安装相关问题排查

  1. 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
  1. [WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
    ubuntu系统
swapoff -a
  1. 查看pod出现错误,要是出现类似 pod cidr not assigned,如果是flannel网络插件,那么就是没有设置pod-network-cidr
  2. 排查kubelet 日志
sudo systemctl status kubelet.service
sudo journalctl -xu kubelet.service

http://www.ppmy.cn/news/318502.html

相关文章

OneData数据模型

文章目录 OneData数据模型业务过程&#xff1a;原子指标&#xff1a;业务限定&#xff1a;派生指标&#xff1a; OneData数据模型-逻辑架构OneData数据模型-指标体系生成 OneData数据模型 业务过程&#xff1a; 指在业务中发生的最小单元的行为或事务&#xff0c;不可再拆分事…

NSGA-II 概述

NSGA-II的选择算法。主要包含三个部分&#xff1a; 1. 快速非支配排序 要先讲一下支配的概念&#xff0c;对于解X1和X2&#xff0c;如果X1对应的所有目标函数都不比X2大&#xff08;最小问题&#xff09;&#xff0c;且存在一个目标值比X2小&#xff0c;则X2被X1支配。 快速…

01 mf

01_Trim Kids,breakfast! 早餐Kids? Phil,would you get them? Get sb把某人接来、叫来Yeah. Just a sec. 全拼second 秒Kids! That is so …… Okey. Kids? Get down here! Why are you guys yelling at us yell at us 对我们喊when we’re way upstairs? when …

计算:t=1-1/(2*2)-1/(3*3)-...-1/(m*m)

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner new Scanner(System.in); while (scanner.hasNext()) { int n scanner.nextInt(); double sum2; for(double i1;i<n;i){ //特别注意特别注意 double与int的用…

ARIMA 模型的建立

一、学习目的 了解 ARIMA 模型的特点和建模过程,了解 AR,MA 和 ARIMA 模型三者之间的区别与联系,掌握如何利用自相关系数和偏自相关系数对 ARIMA 模型进行识别,利用最小二乘法等方法对 ARIMA 模型进行估计,利用信息准则对估计的 ARIMA 模型进行诊断,以及如何利用 ARIMA …

day04jmeter压测

一、Jmeter扩展插件-显示内存效果图 Jmeter本身是不能够展示内存&#xff0c; cpu 和吞吐量的&#xff0c;但是可以通过添加插件的方式来对 jmeter 添加这些功能。 二、对数据库进行压测 首先打开jmeter&#xff0c;创建一个线程组 右击-》添加-》配置元件-》JDBC—— 配置数据…

ARC 138 B - 01 Generation

B - 01 Generation 题目描述&#xff1a; 最开始存在一个空序列&#xff0c;你有两种操作&#xff0c;问能不能凑出给定的01序列 反转序列的每个数&#xff0c;在开头添个0在序列最后面添个0 思路&#xff1a; 直接模拟 可以先将01串根据0和1分成若干块 看当前串的开头 如果开…

data1

两数之和&#xff1a; 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 给定 nums [2…