Kubernetes 是一个开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理。该项目托管在 CNCF。
学习环境准备
前期准备
linux 发行版 Debian12
文章为了方便部署直接使用su用户进行操作,如果是普通用户需要添加注意添加sudo提升指令权限
更新系统
- 添加apt源 `deb mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free
` 注意要匹配好发行版
- 这里使用nala进行更新系统
apt update
apt install -y nala
nala fetch # 测试所有源的速度 通过序号选择 更新过程中会同时使用这些源加速更新速度
nala update
nala upgrade
k8s 安装条件
硬性要求
- 2Core 2G 或以上机器
- 网络通畅 集群间可以使用内网通信
- 点之中不可以有重复的主机名、MAC 地址或 product_uuid。
- 警用swap交换区
- 确保通信端口开启 可以使用
nc 127.0.0.1 6443检查
- 修改hostname
hostnamectl set-hostname <`主机名`> # 确保主机名不同
- 禁用swap分区
swapoff -a # 临时禁用 swapon -a 启用
# 注释掉/etc/fstab中swap挂载项避免重启后自动挂载
- 安装配置br_netfilter模块
modprobe br_netfilter
# 配置 br_netfilter开机加载
echo "br_netfilter" >> /etc/modules-load.d/netfilter.conf
# 重新加载 systemctl restart systemd-modules-load.service
- 启动ip转发
echo "net.ipv4.ip_forward=1" | tee -a /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables=1" | tee -a /etc/sysctl.conf
sysctl -p
配置开机默认开启
nano /etc/init.d/enable_ip_forward
#!/bin/sh
### BEGIN INIT INFO
# Provides: enable_ip_forward
# Required-Start: $sysctl $remote_fs
# Required-Stop:
# Default-Start: 2 3 4
# Default-Stop: 0 1 6
# Short-Description: Enable IP forwarding
### END INIT INFO
case "$1" in
start)
sysctl -w net.ipv4.ip_forward=1
;;
*)
echo "Usage: $0 start"
exit 1
esac
exit 0
hmod +x /etc/init.d/enable_ip_forward
update-rc.d enable_ip_forward defaults
containerd + kubeadm引导
containerd
- 安装containerd并启动
将containerd作为k8s的容器运行时,也可以使用如docker一类的运行时
nala install -a containerd # 常用软件使用nala安装速度更快些
systemctl enable containerd --now # 设置开启启动并启动
- conatinerd配置
# 生成配置文件
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
# 修改配置文件
nano /etc/containerd/config.toml
# 文件中 sandbox_image做如下修改,因为后面init的时候指定的是阿里云的
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true #这个很重要,否则,k8s启动起来后会自动停止,kubectl get pods -n kube-system 也会出现监听端口6443访问失败的报错
# 修改镜像仓库地址 可以在阿里云控制台 搜索容器镜像服务->镜像加速里面拿到地址
# 和docker中的镜像配置是一个意思
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://xxxxx.mirror.aliyuncs.com"]
# 修改完成后记得重启containerd服务
systemctl restart containerd
k8s相关软件安装
引导k8s我们需要用到一下软件。
-
kubeadm:用来初始化集群的指令。
-
kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
-
kubectl:用来与集群通信的命令行工具。
而其他k8s组件都会以容器形式运行。
国内使用可能因为网路原因导致部署进度缓慢甚至部署失败,所以这里使用阿里云镜像源进行加速。
- 配置镜像源
install -y apt-transport-https ca-certificates curl
# 为apt添加阿里云gpg证书
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 添加阿里云镜像源
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
# 上面的方式是直接将gpg证书加入到apt工具中
# 在使用源时加载对应证书 两种方式都差不多
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
apt update # 更新软件包列表
- 安装 kubeadm、kubelet 和 kubectl
apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00
# 避免误操作 可以不执行,也可使用unhold解除
apt-mark hold kubelet kubeadm kubectl
集群引导
- 初始化k8s集群
# 使用阿里云镜像源拉去相关镜像
# 分别操作可以避免由于镜像问题reset k8s环境
kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.2
# 使用阿里云镜像源 如果执行了上一步,这样不就不需要添加镜像地址了
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.2
# 如果引导成功会看到类似如下内容的信息
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node as root:
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
- 重置安装环境 初始化失败才需要用到
# 重置安装状态 一般情况下只需要执行这一条指令
kubeadm reset
# 重置iptables
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
# 重置ipvs表
ipvsadm -C
- 拷贝k8s config文件
这样操作可以让用户包括普通用户也可以使用kubectl连接集群
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config # 这一步可以不执行 只需要有相应访问权限即可
# root用户可以用一下命令
export KUBECONFIG=/etc/kubernetes/admin.conf
- 安装网络插件
完成上面步骤后,我们执行kubectl get nodes会发现节点处于NotReady状态,这是因为缺少网络插件。常用插件包括calico、flannel等。这里使用flannel。
# 如果有必要也可以将yml下载下来
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
- 取消控制平面隔离
默认情况下,出于安全原因,你的集群不会在控制平面节点上调度 Pod。 如果你希望能够在单机 Kubernetes 集群等控制平面节点上调度 Pod,请运行:
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
- 添加工作节点
# 在需要加入集群的节点执行
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
# 如果缺少token可以在控制平面执行下列操作
# 列出token
kubeadm token list
# token过期了可创建新的
kubeadm token create
# 缺少hash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
问题汇总
注释掉fstab后swap开机任然自启动
debian使用systemd管理挂载swap,仅仅注释掉fstab不能完全阻止swap挂载,还需要处理systemd
sudo systemctl --type swap --all # 列出所有swap分区
systemctl mask dev-xxx.swap # 关闭相关项目 也有可能是nv开头 根据实际情况进行处理即可