一、概述

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

  1. 获取Kubernetes二进制文件:从Kubernetes官网下载Kubernetes二进制文件并解压缩到本地。

  2. 预备离线镜像:在离线环境中,有必要将所需的容器镜像下载到本地并存储在本地库房中。能够运用Docker镜像导出/导入指令或Docker Registry Mirror工具将镜像从在线环境中导出并导入到离线环境中。

  3. 装备Kubernetes节点:在每个节点上装置必要的依靠项,例如Docker引擎、kubelet、kubeadm等。能够运用Docker离线装置程序将Docker引擎装置到离线节点中。

  4. 初始化Kubernetes集群:运用kubeadm init指令初始化集群,并将必要的装备文件和证书仿制到节点上。在离线环境中,有必要将kubelet和kubeadm所需的装备文件手动仿制到每个节点上。

  5. 参加节点:运用kubeadm join指令将新节点参加到集群中。在离线环境中,有必要手动仿制kubelet和kubeadm装备文件,并在每个节点上运用kubeadm join指令将节点参加集群。

  6. 布置运用程序:运用kubectl指令在集群中布置运用程序,并将所需的容器镜像从本地库房中拉取。

在离线环境中布置Kubernetes需求一些额定的作业,可是这是可能的,并且是布置Kubernetes的重要方法之一。

【云原生】k8s 离线部署讲解和实战操作
k8s 在线布置能够参考我以下几篇文章:

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

  • Kubernetes(k8s)最新版最完整版环境布置+master高可用完成(k8sV1.24.1+dashboard+harbor)

  • 【云原生】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 版别:github.com/kubernetes/…

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<<EOF
192.168.182.110 local-168-182-110
192.168.182.111 local-168-182-111
192.168.182.112 local-168-182-112
192.168.182.113 local-168-182-113
# VIP
cluster-endpoint 192.168.182.211
EOF

3)装备ssh互信

# 直接一向回车就行
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub root@local-168-182-110
ssh-copy-id -i ~/.ssh/id_rsa.pub root@local-168-182-111
ssh-copy-id -i ~/.ssh/id_rsa.pub root@local-168-182-112
ssh-copy-id -i ~/.ssh/id_rsa.pub root@local-168-182-113

4)时间同步

yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources

5)封闭防火墙

systemctl stop firewalld
systemctl 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_netfilter
lsmod | grep br_netfilter

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

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新发动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
# 运用 sysctl 参数而不重新发动
sudo sysctl --system

三、开端布置

下载地址:download.docker.com/linux/stati…

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

1)离线装置 docker

1、下载

# 下载
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.20.tgz
# 解压
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 Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
[Service]
Type=notify
EnvironmentFile=-/run/flannel/docker
WorkingDirectory=/usr/local/bin
ExecStart=/usr/bin/dockerd \
                -H tcp://0.0.0.0:4243 \
                -H unix:///var/run/docker.sock \
                --selinux-enabled=false \
                --log-opt max-size=1g
ExecReload=/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=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF

4、发动 docker 服务

systemctl daemon-reload
# 设置为开机自启并现在马上发动服务 --now:马上发动服务
systemctl enable --now docker
# 检查容器状况
systemctl status docker

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

5、装备镜像下载加速器和 cgroupdriver

cat >/etc/docker/daemon.json<<EOF
{
   "registry-mirrors": ["http://hub-mirror.c.163.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl restart docker

2)离线装置 kubeadm, kubelet, kubectl

1、下载

下载地址:github.com/kubernetes/…

wget https://dl.k8s.io/v1.23.6/kubernetes-server-linux-amd64.tar.gz
tar -xf kubernetes-server-linux-amd64.tar.gz
​
cd kubernetes/server/bin
cp -ar kubelet kubeadm kubectl /usr/bin/

2、装备 kubeadm 发动文件

cat >/usr/lib/systemd/system/kubelet.service <<EOF
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
​
[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10
​
[Install]
WantedBy=multi-user.target
EOF#留意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.env
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
EOF

3、导入镜像

下载资源包,解压进入images目录,履行以下指令就能够导入镜像了

sh image_load.sh

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

4、发动 kubelet

# 设置为开机自启并现在马上发动服务 --now:马上发动服务
systemctl enable --now kubelet

3)集群初始化

1、装置 keepalived 生成 VIP 完成高可用

【1】下载 下载地址:www.keepalived.org/download.ht…

wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz --no-check-certificate
tar -zxvf keepalived-2.2.7.tar.gz
# 装置openssl(编译keepalived需求)
yum -y install openssl openssl-devel
# 编译 keepalived
yum install gcc -y
cd keepalived-2.2.7 && ./configure --prefix=/usr/local/keepalived  --sysconf=/etc
make && 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 Monitor
After=network-online.target syslog.target
Wants=network-online.target
Documentation=man:keepalived(8)
Documentation=man:keepalived.conf(5)
Documentation=man:genhash(1)
Documentation=https://keepalived.org
[Service]
Type=forking
PIDFile=/run/keepalived.pid
KillMode=process
EnvironmentFile=-/usr/local/keepalived/sysconfig/keepalived
ExecStart=/usr/local/keepalived/sbin/keepalived  $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
EOF

【5】发动 keepalived

systemctl daemon-reload
systemctl enable --now keepalived

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

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 https://raw.githubusercontent.com/flannel-io/flannel/v0.20.2/Documentation/kube-flannel.yml
kubeclt 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/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo 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)装备 IPVS

1、加载ip_vs相关内核模块

modprobe -- ip_vs
modprobe -- ip_vs_sh
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
# 验证敞开了ipvs
lsmod |grep ip_vs

2、离线装置 ipvsadm 工具

在线装置就十分简略了

yum install ipvsadm -y

下载地址:www.linuxvirtualserver.org/software/ip…

wget https://kernel.org/pub/linux/utils/kernel/ipvsadm/ipvsadm-1.31.tar.gz --no-check-certificate
tar -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

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

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 https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml -O /tmp/deploy.yaml
kubectl apply -f /tmp/deploy.yaml

8)装置 nfs provisioner

1、装置helm

helm装置包在供给的资源包里也是有的,能够不必再去外网下载的。

# 下载包
wget https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz -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 https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

3、装置 nfs

【服务端】

#### 装置nfs
yum -y install  nfs-utils rpcbind
# 服务端
mkdir -p /opt/nfsdata
# 授权共享目录
chmod 666 /opt/nfsdata
cat > /etc/exports<<EOF
/opt/nfsdata *(rw,no_root_squash,no_all_squash,sync)
EOF
# 装备收效
exportfs -r
systemctl enable --now rpcbind
systemctl enable --now nfs-server

【客户端】

yum -y install rpcbind
systemctl 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)装置 Dashboard

1、装置

GitHub地址:github.com/kubernetes/…

kubectl apply -f dashboard.yaml
# 检查
kubectl get pods,svc -n kubernetes-dashboard

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

2、创立登录用户

cat >ServiceAccount.yaml<<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF
kubectl apply -f ServiceAccount.yaml

3、创立并获取登录token

kubectl -n kubernetes-dashboard create token admin-user

4、登录 web

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

【云原生】k8s 离线部署讲解和实战操作
火狐浏览器拜访web
【云原生】k8s 离线部署讲解和实战操作
【云原生】k8s 离线部署讲解和实战操作

10)装置镜像库房 Harbor

1、创立证书

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
# 生成证书签名请求 CSR
openssl 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 <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=myharbor.com
DNS.2=*.myharbor.com
DNS.3=hostname
EOF
#创立 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 harbor
kubectl get secret myharbor.com -n harbor

3、增加 Chart 库

helm repo add harbor https://helm.goharbor.io

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=https://myharbor.com \
  --set harborAdminPassword=Harbor12345

5、检查

kubectl get pods,ingress -n harbor

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

5、web 拜访

装备hosts(如果是实在的域名,就能够不必装备hosts了)

192.168.182.110 myharbor.com

拜访地址:myharbor.com/

【云原生】k8s 离线部署讲解和实战操作
账号/密码:admin/Harbor12345(留意:这儿的密码是上面装置时自定义的)
【云原生】k8s 离线部署讲解和实战操作
【云原生】k8s 离线部署讲解和实战操作


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

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