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 调度到控制平面节点:
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

浙公网安备 33010602011771号