Skip to main content
  1. Docs/

Kubenetes 搭建(使用 debian12)

·4 mins· ·
Owl Dawn
Author
Owl Dawn
Table of Contents

基于 kubeadm 工具 系统:debian12 linux 内核: Linux master 6.1.0-28-amd64 kubernetes 版本: v1.28.15

db1@debian12-1 [~] ➜  uname -a
Linux master 6.1.0-28-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.119-1 (2024-11-22) x86_64 GNU/Linux

前置主机系统配置
#

配置主机名,方便后续访问

sudo hostnamectl set-hostname master    # 在 192.168.208.133 上执行
sudo hostnamectl set-hostname node1     # 在 192.168.208.130 上执行
sudo hostnamectl set-hostname node2     # 在 192.168.208.132 上执行

更新 host 文件

sudo vim /etc/hosts
192.168.208.133    master
192.168.208.130    node1
192.168.208.132    node2

配置时间同步

sudo apt install chrony
sudo systemctl start chronyd
sudo systemctl enable chrony

关闭防火墙 & 安全策略服务

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl stop iptables
sudo systemctl disable iptables

# 停止 AppArmor 服务
systemctl stop apparmor.service
# 禁用 AppArmor 服务
systemctl disable apparmor.service

禁用 swap 编辑 /etc/fstab 文件,注释掉与swap相关的行

修改Linux内核参数 在三台服务器上创建 /etc/sysctl.d/kubernetes.conf 文件,添加以下内容:

# 允许 IPv6 转发请求通过iptables进行处理(如果禁用防火墙或不是iptables,则该配置无效)
net.bridge.bridge-nf-call-ip6tables = 1
# 允许 IPv4 转发请求通过iptables进行处理(如果禁用防火墙或不是iptables,则该配置无效)
net.bridge.bridge-nf-call-iptables = 1
# 启用IPv4数据包的转发功能
net.ipv4.ip_forward = 1
# 禁用发送 ICMP 重定向消息
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# 提高 TCP 连接跟踪的最大数量
net.netfilter.nf_conntrack_max = 1000000
# 提高连接追踪表的超时时间
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
# 提高监听队列大小
net.core.somaxconn = 1024
# 防止 SYN 攻击
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
# 提高文件描述符限制
fs.file-max = 65536
# 设置虚拟内存交换(swap)的使用策略为0,减少对磁盘的频繁读写
vm.swappiness = 0

使配置生效:

sysctl -p

加载 br_netfilter 模块:

modprobe br_netfilter

验证模块是否已正确加载:

lsmod | grep br_netfilter

输出示例如下,表示模块加载成功:

br_netfilter           36864  0
bridge                311296  1 br_netfilter

安装 ipset 和 ipvsadm 软件包

sudo apt install -y ipset ipvsadm

分别在三台服务器上创建 /etc/sysconfig/modules/ipvs.modules 文件,内容如下:

#!/bin/bash modprobe – ip_vs modprobe – ip_vs_rr modprobe – ip_vs_wrr modprobe – ip_vs_sh modprobe – nf_conntrack 赋予文件可执行权限:

chmod +x /etc/sysconfig/modules/ipvs.modules 执行文件:

bash /etc/sysconfig/modules/ipvs.modules

验证IPVS模块是否加载成功:

lsmod | grep ip_vs

如下表示配置成功

ip_vs_sh 16384 0 ip_vs_wrr 16384 0 ip_vs_rr 16384 0 ip_vs 188416 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr nf_conntrack 188416 1 ip_vs nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs libcrc32c 16384 2 nf_conntrack,ip_vs

重启主机

安装 docker 或 containerd
#

docker 安装
#

安装 docker,参考 https://u.sb/debian-install-docker/

echo '{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://ooe7wn09.mirror.aliyuncs.com"]
}' >> /etc/docker/daemon.json
systemctl start docker
systemctl enable docker

打开 cri 编辑 /etc/containerd/config.toml 文件,注释掉 disabled_plugins = [“cri”] 这一行。然后重启 containerd 和 docker 服务:

sed -i 's/^#*\(disabled_plugins =.*\)/# \1/' "/etc/containerd/config.toml"
systemctl restart containerd
systemctl restart docker

containerd 安装
#

wget https://github.com/containerd/containerd/releases/download/v1.7.24/cri-containerd-1.7.24-linux-amd64.tar.gz
tar xf cri-containerd-1.7.24-linux-amd64.tar.gz -C /

# 创建目录,该目录用于存放 containerd 配置文件
mkdir /etc/containerd

# 创建一个默认的 containerd 配置文件
containerd config default > /etc/containerd/config.toml

# 修改配置文件中使用的沙箱镜像版本
sed -i '/sandbox_image/s/3.8/3.9/' /etc/containerd/config.toml

# 国内代理
sed -i 's|registry.k8s.io/pause:3.9|registry.aliyuncs.com/google_containers/pause:3.9|' /etc/containerd/config.toml

# 设置容器运行时(containerd + CRI)在创建容器时使用 Systemd Cgroups 驱动
sed -i '/SystemdCgroup/s/false/true/' /etc/containerd/config.toml

# 启用并立即启动 containerd 服务
systemctl enable --now containerd.service

# 检查 containerd 服务的当前状态
systemctl status containerd.service

# 用于检查 containerd 的版本
containerd --version

# 用于与 CRI(Container Runtime Interface)兼容的容器运行时交互的命令行工具
crictl --version

# 用于运行符合 OCI(Open Container Initiative)标准的容器
runc --version

参考 配置国内镜像加速

Kubernetes 安装
#

# 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
apt-get install -y gnupg gnupg2 curl software-properties-common

# 下载 Google Cloud 的 GPG 密钥
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/cgoogle.gpg
# 添加 Kubernetes 官方软件源到系统的 apt 软件源列表
apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

# 国内
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
cd /etc/apt
sudo cp trusted.gpg trusted.gpg.d

# 更新 apt 包索引
apt-get update

# 安装 kubelet kubeadm kubectl
apt-get install -y kubelet kubeadm kubectl
# 锁定防止自动更新
apt-mark hold kubelet kubeadm kubectl

kubelet 配置

# 使用 /etc/default/kubelet 文件来设置 kubelet 的额外参数
cat > /etc/default/kubelet << EOF
# 该参数指定了 kubelet 使用 systemd 作为容器运行时的 cgroup 驱动程序
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF

# 这里先设置kubelet为开机自启
systemctl enable kubelet

集群初始化
#

Master 节点初始化

# 国内代理加上 --image-repository registry.aliyuncs.com/google_containers
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
# 查看镜像列表
kubeadm config images list
registry.k8s.io/kube-apiserver:v1.28.15
registry.k8s.io/kube-controller-manager:v1.28.15
registry.k8s.io/kube-scheduler:v1.28.15
registry.k8s.io/kube-proxy:v1.28.15
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1

初始化集群

  • 生成证书和密钥用于 API Server、etcd 和其他组件。
  • 创建 kubeconfig 文件,其中包含了访问集群所需的配置信息。
  • 创建 etcd 的静态 Pod 配置文件。
  • 创建 kube-apiserver、kube-controller-manager 和 kube-scheduler 的静态 Pod 配置文件。
  • 启动 kubelet。
  • 标记节点 k8s-master 为控制平面节点,并添加了相应的标签和容忍度设置。
  • 配置 Bootstrap Token、RBAC 角色和 Cluster Info ConfigMap 等。
kubeadm init --control-plane-endpoint=master --kubernetes-version=v1.28.15 --pod-network-cidr=10.240.0.0/16 --apiserver-advertise-address=192.168.208.133 --cri-socket unix://var/run/containerd/containerd.sock --image-repository registry.aliyuncs.com/google_containers

如果初始化过程失败,需要重新启动,可以参考链接来 reset 配置

# 集群访问权限配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

列出所有的 CRI 容器列表,且都为 Running 状态 sudo crictl ps -a

将所有的 Worker 节点添加至 K8S 集群:

# 测试 API-Server 端口连通性
 nmap -p 6443 -Pn 192.168.208.133                 

# 从 “kubeadm init” 命令的输出中复制如下命令,在各节点执行
kubeadm join master:6443 --token xxxx.xxxx \
	--discovery-token-ca-cert-hash sha256:xxxx

# 在 Master 节点上验证集群节点是否可用
db1@master [~] ➜  k get nodes                                [16:37:52]
NAME     STATUS     ROLES           AGE   VERSION
master   NotReady   control-plane   21m   v1.28.2
node1    NotReady   <none>          28s   v1.28.2
node2    NotReady   <none>          11s   v1.28.2
db1@master [~] ➜  kubectl get pods -n kube-system            [16:37:58]
NAME                             READY   STATUS    RESTARTS   AGE
coredns-66f779496c-ds78m         0/1     Pending   0          22m
coredns-66f779496c-l48m7         0/1     Pending   0          22m
etcd-master                      1/1     Running   1          22m
kube-apiserver-master            1/1     Running   1          22m
kube-controller-manager-master   1/1     Running   1          22m
kube-proxy-5l6zf                 1/1     Running   0          22m
kube-proxy-qq66w                 1/1     Running   0          103s
kube-proxy-swvjg                 1/1     Running   0          86s
kube-scheduler-master            1/1     Running   1          22m

使用 Calico 插件设置 Pod 网络 选择合适的 calico 版本

# 安装 Tigera Calico operator
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/tigera-operator.yaml
# 检查
kubectl get ns
kubectl get pods -n tigera-operator
# 获取 CR
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/custom-resources.yaml
# 修改 ip 池,需与初始化时一致
sed -i 's/192.168.0.0/10.240.0.0/' custom-resources.yaml
# 创建 CR
kubectl create -f custom-resources.yaml
# 检查状态
kubectl get pods -n calico-system
kubectl get pods -n kube-system -o wide
root@k8s-master:~# apt install -y dnsutils

# 可以获取 Kubernetes 集群中 `kube-dns` 服务的 IP
kubectl get svc -n kube-system                    
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   114m

# 使用 dig 命令通过指定 DNS 服务器(上面的 IP)来查询特定域名的解析
dig -t a www.baidu.com @10.96.0.10

如果需要配置其他域名或 ip 访问 apiserver,或 kubectl 报错 x509: certificate is valid for ... not ...,可以 参考 更新 kubernetes 集群的证书

测试
#

参考
#

https://juejin.cn/post/7300419978486169641#heading-25 https://juejin.cn/post/7319378629431164966 https://stackoverflow.com/questions/59748379/how-to-properly-recover-a-k8s-cluster-after-reboot https://u.sb/debian-install-docker/

Related

Kubernetes Operator
·11 mins
Golang Channel
·5 mins
Golang sync.Map
·4 mins
OpenTelemetry
·2 mins
ElasticSearch 基础使用
·14 mins
2020
·1 min