龙空技术网

【云原生】k8s 离线部署讲解和实战操作

大数据老司机 3834

前言:

今天同学们对“x3650centos7”大致比较关切,我们都需要知道一些“x3650centos7”的相关内容。那么小编在网络上搜集了一些关于“x3650centos7””的相关知识,希望各位老铁们能喜欢,各位老铁们一起来了解一下吧!

一、概述

Kubernetes是一种高度可扩展的容器编排平台,可用于部署、管理和自动化容器化应用程序的运行。在某些情况下,离线部署Kubernetes可能是必需的,例如在没有互联网连接的安全环境中或在网络连接不可靠的情况下。以下是离线部署Kubernetes的一般步骤:

获取Kubernetes二进制文件:从Kubernetes官网下载Kubernetes二进制文件并解压缩到本地。准备离线镜像:在离线环境中,必须将所需的容器镜像下载到本地并存储在本地仓库中。可以使用Docker镜像导出/导入命令或Docker Registry Mirror工具将镜像从在线环境中导出并导入到离线环境中。配置Kubernetes节点:在每个节点上安装必要的依赖项,例如Docker引擎、kubelet、kubeadm等。可以使用Docker离线安装程序将Docker引擎安装到离线节点中。初始化Kubernetes集群:使用kubeadm init命令初始化集群,并将必要的配置文件和证书复制到节点上。在离线环境中,必须将kubelet和kubeadm所需的配置文件手动复制到每个节点上。加入节点:使用kubeadm join命令将新节点加入到集群中。在离线环境中,必须手动复制kubelet和kubeadm配置文件,并在每个节点上使用kubeadm join命令将节点加入集群。部署应用程序:使用kubectl命令在集群中部署应用程序,并将所需的容器镜像从本地仓库中拉取。

在离线环境中部署Kubernetes需要一些额外的工作,但是这是可能的,并且是部署Kubernetes的重要方法之一。

k8s 在线部署可以参考我以下几篇文章:

Kubernetes(k8s)安装以及搭建k8s-Dashboard详解

「云原生」Kubernetes(k8s)最完整版环境部署(V1.24.1)

【云原生】k8s 一键部署(ansible)

二、前期准备1)节点信息

节点信息

主机名

IP

角色

操作系统

k8s 版本

local-168-182-110

192.168.182.110

master、keepalived(VIP:192.168.182.211)、nfs-server

centos7

1.23.6

local-168-182-111

192.168.182.111

master、keepalived、nfs-client

centos7

1.23.6

local-168-182-112

192.168.182.112

master、nfs-client

centos7

1.23.6

local-168-182-113

192.168.182.113

node、nfs-client

centos7

1.23.6

k8s 版本:

2)修改主机名和配置hosts

修改主机名

# 在192.168.182.110执行hostnamectl set-hostname  local-168-182-110# 在192.168.182.111执行hostnamectl set-hostname  local-168-182-110# 在192.168.182.112执行hostnamectl set-hostname  local-168-182-110# 在192.168.182.113执行hostnamectl set-hostname  local-168-182-110

配置hosts

cat >> /etc/hosts<<EOF192.168.182.110 local-168-182-110192.168.182.111 local-168-182-111192.168.182.112 local-168-182-112192.168.182.113 local-168-182-113# VIPcluster-endpoint 192.168.182.211EOF
3)配置ssh互信
# 直接一直回车就行ssh-keygenssh-copy-id -i ~/.ssh/id_rsa.pub root@local-168-182-110ssh-copy-id -i ~/.ssh/id_rsa.pub root@local-168-182-111ssh-copy-id -i ~/.ssh/id_rsa.pub root@local-168-182-112ssh-copy-id -i ~/.ssh/id_rsa.pub root@local-168-182-113
4)时间同步
yum install chrony -ysystemctl start chronydsystemctl enable chronydchronyc sources
5)关闭防火墙
systemctl stop firewalldsystemctl disable firewalld
6)关闭 swap
# 临时关闭;关闭swap主要是为了性能考虑swapoff -a# 可以通过这个命令查看swap是否关闭了free# 永久关闭        sed -ri 's/.*swap.*/#&/' /etc/fstab
7)禁用SELinux
# 临时关闭setenforce 0# 永久禁用sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
8)允许 iptables 检查桥接流量

若要显式加载此模块,请运行 sudo modprobe br_netfilter,通过运行 lsmod | grep br_netfilter 来验证 br_netfilter 模块是否已加载:

sudo modprobe br_netfilterlsmod | grep br_netfilter

为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。 例如:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.confoverlaybr_netfilterEOFsudo modprobe overlaysudo modprobe br_netfilter# 设置所需的 sysctl 参数,参数在重新启动后保持不变cat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables  = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward                 = 1EOF# 应用 sysctl 参数而不重新启动sudo sysctl --system
三、开始部署

下载地址:

镜像、安装包、kube-flannel.ymldeploy.yaml等资源可关注我的公众号【大数据与云原生技术分享】回复【k8s】即可获取。

1)离线安装 docker1、下载

# 下载wget  解压tar -zxvf docker-20.10.20.tgz
2、解压的docker文件夹全部移动至/usr/bin目录
cp -p docker/* /usr/bin
3、配置 docker 启动文件

/usr/lib/systemd/system/目录下,创建docker.service文件

cat> /usr/lib/systemd/system/docker.service <<EOF[Unit]Description=Docker Application Container EngineDocumentation= docker.socket[Service]Type=notifyEnvironmentFile=-/run/flannel/dockerWorkingDirectory=/usr/local/binExecStart=/usr/bin/dockerd \                -H tcp://0.0.0.0:4243 \                -H unix:///var/run/docker.sock \                --selinux-enabled=false \                --log-opt max-size=1gExecReload=/bin/kill -s HUP $MAINPID# Having non-zero Limit*s causes performance problems due to accounting overhead# in the kernel. We recommend using cgroups to do container-local accounting.LimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinity# Uncomment TasksMax if your systemd version supports it.# Only systemd 226 and above support this version.#TasksMax=infinityTimeoutStartSec=0# set delegate yes so that systemd does not reset the cgroups of docker containersDelegate=yes# kill only the docker process, not all processes in the cgroupKillMode=processRestart=on-failure[Install]WantedBy=multi-user.targetEOF
4、启动 docker 服务
systemctl daemon-reload# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务systemctl enable --now docker# 查看容器状态systemctl status docker
5、配置镜像下载加速器和 cgroupdriver
cat >/etc/docker/daemon.json<<EOF{   "registry-mirrors": [";],    "exec-opts": ["native.cgroupdriver=systemd"]}EOFsystemctl restart docker
2)离线安装 kubeadm, kubelet, kubectl1、下载

下载地址:

wget  -xf kubernetes-server-linux-amd64.tar.gzcd kubernetes/server/bincp -ar kubelet kubeadm kubectl /usr/bin/
2、配置 kubeadm 启动文件
cat >/usr/lib/systemd/system/kubelet.service <<EOF[Unit]Description=kubelet: The Kubernetes Node AgentDocumentation=[Service]ExecStart=/usr/bin/kubeletRestart=alwaysStartLimitInterval=0RestartSec=10[Install]WantedBy=multi-user.targetEOF​#注意ExecStart内容换行mkdir -p /usr/lib/systemd/system/kubelet.service.d/cat >/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf <<EOF[Service]Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.envEnvironmentFile=-/etc/sysconfig/kubeletExecStart=ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGSEOF
3、导入镜像

下载资源包,解压进入images目录,执行以下命令就可以导入镜像了

sh image_load.sh
4、启动 kubelet
# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务systemctl enable --now kubelet
3)集群初始化1、安装 keepalived 生成 VIP 实现高可用

【1】下载

下载地址:

wget  --no-check-certificatetar -zxvf keepalived-2.2.7.tar.gz# 安装openssl(编译keepalived需要)yum -y install openssl openssl-devel# 编译 keepalivedyum install gcc -ycd keepalived-2.2.7 && ./configure --prefix=/usr/local/keepalived  --sysconf=/etcmake && make install# 配置环境变量cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived

【2】master 配置

cat > /etc/keepalived/keepalived.conf<<EOF! Configuration File for keepalived global_defs {    #每个keepalived取个不同名称    router_id 56}vrrp_instance VI_1 {    # MASTER为主实例,BACKUP 为从实例    state MASTER    # 网卡名称    interface ens33    # 主备这里要配置为同样的     virtual_router_id 68    # 优先级,主要高于备. 一般主配置为100  备配置为80    priority 100    advert_int 1    # 主动抢占,主备都开启的话,服务器抢占过去后,要等这个服务器keepalived停掉才会漂移到另一台    nopreempt    authentication {        # 主备必须配置成同样的        auth_type PASS         # 主备必须配置成同样的        auth_pass 1111    }    virtual_ipaddress {      # vip,主备必须配置一样      192.168.182.211    }}EOF

【3】backend 配置

cat > /etc/keepalived/keepalived.conf<<EOF! Configuration File for keepalived global_defs {    #每个keepalived取个不同名称    router_id 56}vrrp_instance VI_1 {    # MASTER为主实例,BACKUP 为从实例    state BACKUP    # 网卡名称    interface ens33    # 主备这里要配置为同样的     virtual_router_id 68    # 优先级,主要高于备. 一般主配置为100  备配置为80    priority 80    advert_int 1    # 主动抢占,主备都开启的话,服务器抢占过去后,要等这个服务器keepalived停掉才会漂移到另一台    nopreempt    authentication {        # 主备必须配置成同样的        auth_type PASS         # 主备必须配置成同样的        auth_pass 1111    }    virtual_ipaddress {      # vip,主备必须配置一样      192.168.182.211    }}EOF

【4】配置服务启动

cat > /usr/lib/systemd/system/keepalived.service <<EOF[Unit]Description=LVS and VRRP High Availability MonitorAfter=network-online.target syslog.targetWants=network-online.targetDocumentation=man:keepalived(8)Documentation=man:keepalived.conf(5)Documentation=man:genhash(1)Documentation=[Service]Type=forkingPIDFile=/run/keepalived.pidKillMode=processEnvironmentFile=-/usr/local/keepalived/sysconfig/keepalivedExecStart=/usr/local/keepalived/sbin/keepalived  $KEEPALIVED_OPTIONSExecReload=/bin/kill -HUP $MAINPID[Install]WantedBy=multi-user.targetEOF

【5】启动 keepalived

systemctl daemon-reloadsystemctl enable --now keepalived
2、创建初始化配置文件

注意这里使用VIP

kubeadm config print init-defaults > kubeadm-config.yaml
3、k8s 集群初始化

这里追加tee命令将初始化日志输出到kubeadm-init.log中以备用(可选)。

kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log

或者直接初始化

kubeadm init \  --apiserver-advertise-address=192.168.182.211 \  --image-repository registry.aliyuncs.com/google_containers \  --control-plane-endpoint=cluster-endpoint \  --kubernetes-version v1.23.6 \  --service-cidr=10.1.0.0/16 \  --pod-network-cidr=10.244.0.0/16 \  --v=5
4、安装 cni 插件(flannel)
# wget  apply -f kube-flannel.yml
4)添加 master 节点
# 在需要添加的master节点上执行CERT_KEY=`ssh cluster-endpoint "kubeadm init phase upload-certs --upload-certs|tail -1"`join_str=`ssh cluster-endpoint kubeadm token create --print-join-command`echo $join_str " --control-plane --certificate-key $CERT_KEY --v=5"# 拿到上面打印的命令在需要添加的节点上执行# --control-plane 标志通知 kubeadm join 创建一个新的控制平面。加入master必须加这个标记# --certificate-key ... 将导致从集群中的 kubeadm-certs Secret 下载控制平面证书并使用给定的密钥进行解密。这里的值就是上面这个命令(kubeadm init phase upload-certs --upload-certs)打印出的key。mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config# 去掉master污点# kubectl taint nodes `hostname` node-role.kubernetes.io/master:NoSchedule- 2>/dev/null# kubectl taint nodes `hostname` node.kubernetes.io/not-ready:NoSchedule- 2>/dev/null
5)添加 node 节点
CERT_KEY=`ssh cluster-endpoint "kubeadm init phase upload-certs --upload-certs|tail -1"`join_str=`ssh cluster-endpoint kubeadm token create --print-join-command`echo $join_str " --certificate-key $CERT_KEY --v=5"
6)配置 IPVS1、加载ip_vs相关内核模块
modprobe -- ip_vsmodprobe -- ip_vs_shmodprobe -- ip_vs_rrmodprobe -- ip_vs_wrr# 验证开启了ipvslsmod |grep ip_vs
2、离线安装 ipvsadm 工具

在线安装就非常简单了

yum install ipvsadm -y

下载地址:

wget  --no-check-certificatetar -xzvf ipvsadm-1.31.tar.gz && cd ipvsadm-1.31# 先安装依赖包yum install -y libnl libnl-devel gcc# 编译安装make && make install# 查看版本号ipvsadm -version
3、编辑kube-proxy配置文件,mode修改成ipvs
kubectl edit  configmap -n kube-system  kube-proxy
4、重启kube-proxy
# 先查看kubectl get pod -n kube-system | grep kube-proxy# 再delete让它自拉起kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'# 再查看kubectl get pod -n kube-system | grep kube-proxy
7)安装 ingress-nginx
# wget  -O /tmp/deploy.yamlkubectl apply -f /tmp/deploy.yaml
8)安装 nfs provisioner1、安装helm

helm安装包在提供的资源包里也是有的,可以不用再去外网下载的。

# 下载包wget  -O /tmp/helm-v3.7.1-linux-amd64.tar.gz# 解压压缩包tar -xf /tmp/helm-v3.7.1-linux-amd64.tar.gz -C /root/# 制作软连接ln -s /root/linux-amd64/helm /usr/local/bin/helm
2、添加helm仓库源
# 添加helm仓库源helm repo add nfs-subdir-external-provisioner 
3、安装 nfs

【服务端】

#### 安装nfsyum -y install  nfs-utils rpcbind# 服务端mkdir -p /opt/nfsdata# 授权共享目录chmod 666 /opt/nfsdatacat > /etc/exports<<EOF/opt/nfsdata *(rw,no_root_squash,no_all_squash,sync)EOF# 配置生效exportfs -rsystemctl enable --now rpcbindsystemctl enable --now nfs-server

【客户端】

yum -y install rpcbindsystemctl enable --now rpcbind
3、nfs provisioner
### helm安装nfs provisioner,安装包在提供的资源里也有,可以不用再去外网下载helm install nfs-subdir-external-provisioner ./nfs-subdir-external-provisioner-4.0.17.tgz \  --namespace=nfs-provisioner \  --create-namespace \  --set image.repository=willdockerhub/nfs-subdir-external-provisioner \  --set image.tag=v4.0.2 \  --set replicaCount=2 \  --set storageClass.name=nfs-client \  --set storageClass.defaultClass=true \  --set nfs.server=cluster-endpoint \  --set nfs.path=/opt/nfsdata# 查看kubectl get pods,deploy,sc -n nfs-provisioner
9)安装 Dashboard1、安装

GitHub地址:

kubectl apply -f dashboard.yaml# 查看kubectl get pods,svc -n kubernetes-dashboard
2、创建登录用户
cat >ServiceAccount.yaml<<EOFapiVersion: v1kind: ServiceAccountmetadata:  name: admin-user  namespace: kubernetes-dashboard---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:  name: admin-userroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-adminsubjects:- kind: ServiceAccount  name: admin-user  namespace: kubernetes-dashboardEOFkubectl apply -f ServiceAccount.yaml
3、创建并获取登录token
kubectl -n kubernetes-dashboard create token admin-user
4、登录 web

登录地址:,如果提示如下,建议换成火狐浏览器试试。(如果有证书情况下是不会有种问题的。)

火狐浏览器访问web

10)安装镜像仓库 Harbor1、创建证书

mkdir stl && cd stl# 生成 CA 证书私钥openssl genrsa -out ca.key 4096# 生成 CA 证书openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=harbor/OU=harbor/CN=myharbor.com" \ -key ca.key \ -out ca.crt# 创建域名证书,生成私钥openssl genrsa -out myharbor.com.key 4096# 生成证书签名请求 CSRopenssl req -sha512 -new \    -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=harbor/OU=harbor/CN=myharbor.com" \    -key myharbor.com.key \    -out myharbor.com.csr# 生成 x509 v3 扩展cat > v3.ext <<-EOFauthorityKeyIdentifier=keyid,issuerbasicConstraints=CA:FALSEkeyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEnciphermentextendedKeyUsage = serverAuthsubjectAltName = @alt_names[alt_names]DNS.1=myharbor.comDNS.2=*.myharbor.comDNS.3=hostnameEOF#创建 Harbor 访问证书openssl x509 -req -sha512 -days 3650 \    -extfile v3.ext \    -CA ca.crt -CAkey ca.key -CAcreateserial \    -in myharbor.com.csr \    -out myharbor.com.crt
2、创建证书秘钥
kubectl create secret tls myharbor.com --key myharbor.com.key --cert myharbor.com.crt -n harborkubectl get secret myharbor.com -n harbor
3、添加 Chart 库
helm repo add harbor 
4、开始部署 harbor
# 下载安装包helm pull harbor/harbor# harbor-1.11.1.tgz 安装包在提供的资源包里是有的,可以不用再去外网下载的。helm install myharbor ./harbor-1.11.1.tgz \  --namespace=harbor --create-namespace \  --set expose.ingress.hosts.core=myharbor.com \  --set expose.ingress.hosts.notary=notary.myharbor.com \  --set-string expose.ingress.annotations.'nginx\.org/client-max-body-size'="1024m" \  --set expose.tls.secretName=myharbor.com \  --set persistence.persistentVolumeClaim.registry.storageClass=nfs-client \  --set persistence.persistentVolumeClaim.jobservice.storageClass=nfs-client \  --set persistence.persistentVolumeClaim.database.storageClass=nfs-client \  --set persistence.persistentVolumeClaim.redis.storageClass=nfs-client \  --set persistence.persistentVolumeClaim.trivy.storageClass=nfs-client \  --set persistence.persistentVolumeClaim.chartmuseum.storageClass=nfs-client \  --set persistence.enabled=true \  --set externalURL= \  --set harborAdminPassword=Harbor12345
5、查看
kubectl get pods,ingress -n harbor
5、web 访问

配置hosts(如果是真实的域名,就可以不用配置hosts了)

192.168.182.110 myharbor.com

访问地址:

账号/密码:admin/Harbor12345(注意:这里的密码是上面安装时自定义的)

【云原生】k8s 离线部署详解过程就到这里,有不明白或者部署过程中有问题的小伙伴欢迎给我留言哦,后续会持续更新相关技术文章的,离线部署包资源关注我的公众号【大数据与云原生技术分享】回复【k8s】即可获取~

标签: #x3650centos7