k8s离线部署,对,离线部署。

前置要求:需要一台电脑可以联网,或者联网了之后安装过相关的repo(具体流程在后续会提到),给离线的k8s提供服务。用于安装 kubeadm,kubelet,kubectl。

1、修改HOSTNAME
hostnamectl set-hostname master130

 

2、修改hosts,添加关联
编辑 /etc/hosts
192.168.152.130 master130

 

3、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

 

4、禁用selinux
sestatus
编辑:/etc/selinux/config
# sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0

 

5、关闭虚拟内存
swapoff -a
cat /etc/fstab
注释掉 swap

 

6、加载内核模块
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

 

modprobe overlay
modprobe br_netfilter

 

7、配置内核参数
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF

sysctl --system

找问题:grep -r "ip_forward" /etc/sysctl.d/ /etc/sysctl.conf 2>/dev/null

修改 /etc/sysctl.conf
找到 net.ipv4.ip_forward=0,改为 net.ipv4.ip_forward=1

sysctl --system

#检查
sysctl net.ipv4.ip_forward

 

9、安装 ipset和 ipvsadm:下载一个 rpm ,执行 yum -y localinstall xxx.rpm  下载地址:https://www.linuxvirtualserver.org/software/ipvs.html
yum -y install ipset ipvsadm

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

chmod 777 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

 

10、containerd 准备
wget https://github.com/containerd/containerd/releases/download/v1.7.3/cri-containerd-1.7.3-linux-amd64.tar.gz

# 解压并安装 containerd
tar xf cri-containerd-1.7.3-linux-amd64.tar.gz -C /

containerd --version

 

11、containerd 配置文件生成
mkdir /etc/containerd

containerd config default > /etc/containerd/config.toml

vim /etc/containerd/config.toml
sandbox_image = "registry.k8s.io/pause:3.9" 由3.8改成 3.9

1. ✅`sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"` 已经改对
2. ❌**两处 systemd cgroup 都是 false,openEuler24.03 是 cgroup v2,这里必须改成 true**

[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

```
#顶层cri下的旧字段(废弃,忽略)
systemd_cgroup = false

#真正生效runc配置,这里!!
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = false


12、containerd 启动及开机
systemctl enable --now containerd

 

13、runc准备
runc --version

// 不存在就需要下载

 

14、k8s 初始化
# 设置阿里云的源
cat <<EOF | tee /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF

 

14、或者在有网络的机器部署。一个repo

软件源:
k8s.repo

cat <<EOF | tee /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF


makecache


mkdir -p /home/kubernetes/packages

dnf download --resolve --destdir=/home/kubernetes/packages \
kubeadm.x86_64 kubelet.x86_64 kubectl.x86_64


dnf install createrepo

createrepo /home/kubernetes

再部署一个nginx,用于分发这个数据。加入一个配置

repo.conf

server {
listen 80;
server_name www.test.com;
root /home/kubernetes;

location / {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}

 

软件源头开放出去。

离线机器,通过自定义host。然后走网络拉去对应的信息。

vim /etc/hosts

编辑添加:原始局域网IP  www.test.com

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[localk8s]
name=local k8s
baseurl=http://www.test.com/
enable=1
gpgcheck=0
EOF

repo.bak 备份原始的repo

15、离线电脑接着安装 命令都可以

yum install -y kubeadm-1.28.15-150500.1.1 kubelet-1.28.15-150500.1.1 kubectl-1.28.15-150500.1.1
dnf install -y kubeadm-1.28.15-150500.1.1 kubelet-1.28.15-150500.1.1 kubectl-1.28.15-150500.1.1

 

16、配置 kubelet
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

systemctl enable kubelet

 

17.0 导入镜像 如果提前下载并导入了的话
#查看需要下载镜像
kubeadm config images list

 

18、

#本地打包,然后拷贝
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.15;
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.15;
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.15;
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.15;
docker pull registry.aliyuncs.com/google_containers/pause:3.9;
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.15-0;
docker pull registry.aliyuncs.com/google_containers/coredns:v1.10.1

#保存
docker save -o F:\k8s-1.28.15-images.tar registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.15 registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.15 registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.15 registry.aliyuncs.com/google_containers/kube-proxy:v1.28.15 registry.aliyuncs.com/google_containers/pause:3.9 registry.aliyuncs.com/google_containers/etcd:3.5.15-0 registry.aliyuncs.com/google_containers/coredns:v1.10.1

#拷贝之后,执行。然后重新,初始化。
kubeadm config images list --kubernetes-version v1.28.15
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.15-0
registry.k8s.io/coredns/coredns:v1.10.1

#导入镜像
ctr -n k8s.io image import /var/www/k8s-1.28.15-images.tar

 

19、初始化,master;其中:--apiserver-advertise-address=10.228.5.9 ,这个IP是你的本机局域网IP,另外两个不用管,一个是pod通信使用,一个是内部容器创建的。 相关worker不执行这个,如果需要就等待完成之后。执行 join:join命令。再 init之后,会产生

kubeadm init --kubernetes-version=v1.28.15 --apiserver-advertise-address=10.228.5.9 --pod-network-cidr=10.100.0.0/16 --service-cidr=10.200.0.0/16 --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/containerd/containerd.sock

成功了。得到
kubeadm join 192.168.152.131:6443 --token lhxu3j.iwj5eh9jaeoev3hp \
--discovery-token-ca-cert-hash sha256:0ada2f69ab9eb66c63222edba9e601e6d304ada0bbb56d8080cf9e33c655e3ca

 

20、继续命令
kubectl get nodes

# 提示 找不到 api。因为还需要执行命令;init之后有提示

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#查看节点
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master131 NotReady control-plane 4m20s v1.28.15

 

21、kubectl get pods -n kube-system

kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-66f779496c-vflh7 0/1 Pending 0 6m18s
coredns-66f779496c-wpjxz 0/1 Pending 0 6m18s
etcd-master131 1/1 Running 12 6m30s
kube-apiserver-master131 1/1 Running 10 6m30s
kube-controller-manager-master131 1/1 Running 12 6m31s
kube-proxy-6hw7k 1/1 Running 0 6m17s
kube-scheduler-master131 1/1 Running 11 6m30s

 

21.1、删除污点,单节点:

方法一(推荐用于单节点集群/测试环境):移除污点‌
允许 CoreDNS 调度到控制平面节点:

bash
 
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
 

22、网络配置 Calico

github下载,对应的release包,里面包含了 需要的镜像和 yaml文件。

例如下载:https://github.com/projectcalico/calico/releases/download/v3.27.3/release-v3.27.3.tgz

解压可以看到 images中包含需要的镜像(不是全部还有一些需要拷贝,后面会提到。),然后 yaml文件再mainifest中。

tar -zxvf

release-v3.27.3.tgz

执行:kubectl create -f tigera-operator.yaml

修改:custom-resources.yaml 

网络段要改到一致:和你init的时候使用的一样。

cat custom-resources.yaml
# This section includes base Calico installation configuration.
# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.Installation
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
# Configures Calico networking.
calicoNetwork:
# Note: The ipPools section cannot be modified post-install.
ipPools:
- blockSize: 26
cidr: 10.100.0.0/16
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()

---

# This section configures the Calico API server.
# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
name: default
spec: {}

,然后执行命令:kubectl create -f custom-resources.yaml

tigera-operator.yaml 需要一个 tigera-operator.tar 镜像,下载之后导入。

 

无法下载可以通过。

23、补全缺少的

#拉取国内代理镜像
ctr -n k8s.io image pull docker.m.daocloud.io/calico/csi:v3.27.3
ctr -n k8s.io image pull docker.m.daocloud.io/calico/node-driver-registrar:v3.27.3

#打回原始docker.io标签(关键!calico operator读取docker.io镜像名)
ctr -n k8s.io image tag docker.m.daocloud.io/calico/csi:v3.27.3 docker.io/calico/csi:v3.27.3
ctr -n k8s.io image tag docker.m.daocloud.io/calico/node-driver-registrar:v3.27.3 docker.io/calico/node-driver-registrar:v3.27.3

#导出tar包
ctr -n k8s.io image export calico-csi.tar docker.io/calico/csi:v3.27.3
ctr -n k8s.io image export calico-node-driver-registrar.tar docker.io/calico/node-driver-registrar:v3.27.3


ctr -n k8s.io image import calico-csi.tar
ctr -n k8s.io image import calico-node-driver-registrar.tar

或者使用 dockerdesk进行,拉去,然后导出,然后使用。因为可以修改tag。所以不要怕来源不一样。来源不一样一样可以打上其他来源的标记。就能使用了

docker pull calico/apiserver:v3.27.3

然后 保存:docker save -o F:\website\apiserver.tar  calico/apiserver:v3.27.3

拷贝进去用 ctr import

# 在主节点执行,生成新的 join 命令

kubeadm token create --print-join-command

 

查看。容器相关命令:

kubectl get pods -n kube-system

kubectl get pods -n calico-system

kubectl get svc  端口查看

ctr -n k8s.io image list  镜像列表

ctr -n k8s.io image list | awk '{print $1}'   镜像名称

kubectl exec -it consul-0 -- /bin/sh    进入容器控制台

kubectl apply -f consul.yaml  运行或更新容器

kubectl get pods -o wide   pod所在节点

kubectl exec -it xxl-job-admin-75b7bd9ff-7gg47 -- wget http://baidu.com  不进入容器,只执行命令

kubectl delete pod consul-0  删除某个节点,等他自己重建

 

 

参考资料:

https://www.cnblogs.com/cxjyyds/p/18780799

https://www.bilibili.com/video/BV1HCUzBTE9S/?spm_id_from=333.337.search-card.all.click&vd_source=e815677daf7ec838e5b6aac48775f10b

https://www.bilibili.com/video/BV1cu4y1R78u/?spm_id_from=333.788.player.switch&vd_source=e815677daf7ec838e5b6aac48775f10b&p=4

https://www.bilibili.com/video/BV14DpMenEH7/?spm_id_from=333.337.search-card.all.click&vd_source=e815677daf7ec838e5b6aac48775f10b

posted @ 2026-09-07 09:48  Supper_litt  阅读(8)  评论(0)    收藏  举报