当前位置: 首页 > news >正文

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

文章目录

    • 一、概述
    • 二、前期准备
      • 1)节点信息
      • 2)修改主机名和配置hosts
      • 3)配置ssh互信
      • 4)时间同步
      • 5)关闭防火墙
      • 6)关闭 swap
      • 7)禁用SELinux
      • 8)允许 iptables 检查桥接流量
    • 三、开始部署
      • 1)离线安装 docker
        • 1、下载
        • 2、解压的docker文件夹全部移动至/usr/bin目录
        • 3、配置 docker 启动文件
        • 4、启动 docker 服务
        • 5、配置镜像下载加速器和 cgroupdriver
      • 2)离线安装 kubeadm, kubelet, kubectl
        • 1、下载
        • 2、配置 kubeadm 启动文件
        • 3、导入镜像
        • 4、启动 kubelet
      • 3)集群初始化
        • 1、安装 keepalived 生成 VIP 实现高可用
        • 2、创建初始化配置文件
        • 3、k8s 集群初始化
        • 4、安装 cni 插件(flannel)
      • 4)添加 master 节点
      • 5)添加 node 节点
      • 6)配置 IPVS
        • 1、加载ip_vs相关内核模块
        • 2、离线安装 ipvsadm 工具
        • 3、编辑kube-proxy配置文件,mode修改成ipvs
        • 4、重启kube-proxy
      • 7)安装 ingress-nginx
      • 8)安装 nfs provisioner
        • 1、安装helm
        • 2、添加helm仓库源
        • 3、安装 nfs
        • 3、nfs provisioner
      • 9)安装 Dashboard
        • 1、安装
        • 2、创建登录用户
        • 3、创建并获取登录token
        • 4、登录 web
      • 10)安装镜像仓库 Harbor
        • 1、创建证书
        • 2、创建证书秘钥
        • 3、添加 Chart 库
        • 4、开始部署 harbor
        • 5、查看
        • 5、web 访问

一、概述

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 在线部署可以参考我以下几篇文章:

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

  • Kubernetes(k8s)最新版最完整版环境部署+master高可用实现(k8sV1.24.1+dashboard+harbor)

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

二、前期准备

1)节点信息

节点信息

主机名IP角色操作系统k8s 版本
local-168-182-110192.168.182.110master、keepalived(VIP:192.168.182.211)、nfs-servercentos71.23.6
local-168-182-111192.168.182.111master、keepalived、nfs-clientcentos71.23.6
local-168-182-112192.168.182.112master、nfs-clientcentos71.23.6
local-168-182-113192.168.182.113node、nfs-clientcentos71.23.6

k8s 版本:https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG

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-keygenssh-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
EOFsudo 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

三、开始部署

下载地址:https://download.docker.com/linux/static/stable/x86_64/

镜像、安装包、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

在这里插入图片描述

5、配置镜像下载加速器和 cgroupdriver

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

2)离线安装 kubeadm, kubelet, kubectl

1、下载

下载地址:https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG

wget https://dl.k8s.io/v1.23.6/kubernetes-server-linux-amd64.tar.gztar -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

在这里插入图片描述

4、启动 kubelet

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

3)集群初始化

1、安装 keepalived 生成 VIP 实现高可用

【1】下载
下载地址:https://www.keepalived.org/download.html

wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz --no-check-certificatetar -zxvf keepalived-2.2.7.tar.gz# 安装openssl(编译keepalived需要)
yum -y install openssl openssl-devel# 编译 keepalived
yum install gcc -ycd 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  备配置为80priority 100advert_int 1# 主动抢占,主备都开启的话,服务器抢占过去后,要等这个服务器keepalived停掉才会漂移到另一台nopreemptauthentication {# 主备必须配置成同样的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  备配置为80priority 80advert_int 1# 主动抢占,主备都开启的话,服务器抢占过去后,要等这个服务器keepalived停掉才会漂移到另一台nopreemptauthentication {# 主备必须配置成同样的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.targetEOF

【5】启动 keepalived

systemctl daemon-reload
systemctl 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 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

下载地址:http://www.linuxvirtualserver.org/software/ipvs.html

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

在这里插入图片描述

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.yamlkubectl 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 -rsystemctl 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地址:https://github.com/kubernetes/dashboard

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

在这里插入图片描述

2、创建登录用户

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

3、创建并获取登录token

kubectl -n kubernetes-dashboard create token admin-user

4、登录 web

登录地址:https://ip:31443/,如果提示如下,建议换成火狐浏览器试试。(如果有证书情况下是不会有种问题的。)
在这里插入图片描述
火狐浏览器访问web
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

5、web 访问

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

192.168.182.110 myharbor.com

访问地址:https://myharbor.com/

在这里插入图片描述
账号/密码:admin/Harbor12345(注意:这里的密码是上面安装时自定义的)
在这里插入图片描述
在这里插入图片描述


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

相关文章:

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

文章目录一、概述二、前期准备1&#xff09;节点信息2&#xff09;修改主机名和配置hosts3&#xff09;配置ssh互信4&#xff09;时间同步5&#xff09;关闭防火墙6&#xff09;关闭 swap7&#xff09;禁用SELinux8&#xff09;允许 iptables 检查桥接流量三、开始部署1&#x…...

【Kubernetes】第十一篇 - 滚动发布的介绍与实现

一&#xff0c;前言 上一篇&#xff0c;介绍了灰度发布和流量切分的集中方式&#xff0c;以及如何实现 k8s 的灰度发布&#xff1b; 本篇&#xff0c;介绍滚动发布的实现&#xff1b; 二&#xff0c;滚动发布简介 滚动发布 滚动发布&#xff0c;则是我们一般所说的无宕机发…...

【尊享版】如何系统构建你的思维认知模型?

超友们&#xff0c;早上好&#xff0c;国庆节快乐&#xff5e; 今天为你带来的分享是《如何系统构建你的思维认知模型&#xff1f;》&#xff0c;主要分为三个部分&#xff1a; 第一部分&#xff1a;【实现爆发式成长的 10 个思维模型】 第二部分&#xff1a;【6 个不可不知的…...

urho3D编码约定

缩进样式类似于Allman&#xff08;BSD&#xff09;&#xff0c;即在控制语句的下一行使用大括号&#xff0c;在同一级别缩进。在switch-case语句中&#xff0c;case与switch语句处于相同的缩进级别。 缩进使用4个空格而不是制表符。不应保留空行上的缩进。 类和结构名称以大写…...

Overleaf推广奖励:增加合作者的数量、解锁Dropbox同步和项目修改历史

Overleaf推广奖励 Overleaf是一个LaTeX\LaTeXLATE​X在线编译器&#xff0c;它可以让你与合作者共同在线编辑文档。但是默认的免费账号仅能邀请一个合作者。那么如何增加合作者的数量呢&#xff1f; Overleaf推出了一个奖励计划&#xff0c;你邀请其他人注册Overleaf&#xf…...

ChatGPT的互补工具Perplexity的详细使用方法(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,科大讯飞比赛第三名,CCF比赛第四名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

【Linux驱动开发100问】如何编译Linux内核?

&#x1f947;今日学习目标&#xff1a;如何编译Linux内核&#xff1f; &#x1f935;‍♂️ 创作者&#xff1a;JamesBin ⏰预计时间&#xff1a;10分钟 &#x1f389;个人主页&#xff1a;嵌入式悦翔园个人主页 &#x1f341;专栏介绍&#xff1a;Linux驱动开发100问 如何编译…...

15、条件概率、全概率公式、贝叶斯公式、马尔科夫链

条件概率定义&#xff1a;设A、B是两个事件&#xff0c;且&#xff0c;P(A) > 0 则称 为事件A发生的条件下事件B的条件概率对这个式子进行变形&#xff0c;即可得到概率的乘法公式&#xff1a;P(A) > 0 时&#xff0c;则P(B) > 0 时&#xff0c;则乍一看&#xff0c;…...

Eureka服务注册与发现

注册中心是分布式开发的核心组件之一&#xff0c;而Eureka是spring cloud推荐的注册中心实现。简单分析一下Eureka的原理。Eureka基础概念与流程1、服务注册在微服务架构中&#xff0c;一个服务提供者本质上也是一个Eureka客户端。启动时&#xff0c;会调用Eureka所提供的服务注…...

20230226 引用类型和指针类型的区别 - chatGPT

绝了&#xff0c;把chatGPT当百度之后真爽&#xff01; 引用类型和指针类型都是C语言中的重要概念&#xff0c;它们都提供了访问和操作内存的方法&#xff0c;但它们之间有几个关键的区别。 1. 定义和初始化方式不同 指针类型的变量定义和初始化的方式是通过使用*符号来声明…...

《操作系统》——第二章 进程与线程

目录 2.1.1进程的概念、组成、特征 2.1.2进程的状态与转换、进程的组织 2.1.3进程控制 2.1.4进程通信 2.1.5线程的概念 2.1.6线程的实现方式和多线程模型 2.2.1调度的概念、层次 2.2.2进程调度的时机、切换与过程、方式 2.2.4调度算法的评价指标 2.2.5调度算法(1) 2…...

网络原理之初识

目录 一. 网络互连 1. 局域网 2. 广域网 二. 网络通信基础 1. IP 地址 2. 端口号 3. 网络协议 4. 协议分层 5. TCP/IP 五层网络模型 &#xff08;简述&#xff09; 6. 网络数据传输的基本流程 一. 网络互连 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&am…...

CAN总线开发一本全(4) - FlexCAN的驱动程序

CAN总线开发一本全&#xff08;4&#xff09; - FlexCAN的驱动程序 苏勇&#xff0c;2023年2月 文章目录CAN总线开发一本全&#xff08;4&#xff09; - FlexCAN的驱动程序引言从MindSDK获取FlexCAN驱动程序数据结构配置通信引擎的结构体类型访问MB的结构体类型配置ID过滤器的…...

如何分析linux tcp/ip 丢包问题

引用手把手教你用Dropwatch诊断问题通过dropwatch定位系统内核丢包Finding out if/why a server is dropping packetsgithub source coed: pavel-odintsov/drop_watchHow to drop a packet in Linux in more ways than one试试Linux下的ip命令&#xff0c;ifconfig已经过时了Ho…...

旅游规划(树型dp)

W 市的交通规划出现了重大问题&#xff0c;市政府下定决心在全市各大交通路口安排疏导员来疏导密集的车流。 但由于人员不足&#xff0c;W 市市长决定只在最需要安排人员的路口安排人员。 具体来说&#xff0c;W 市的交通网络十分简单&#xff0c;由 n 个交叉路口和 n−1 条街道…...

【C++】string类的模拟实现

当你将放弃作为一种习惯&#xff0c;你一辈子也不会有出息… 文章目录一、Default member functions1.Constructor2.Copy constructor&#xff08;代码重构&#xff1a;传统写法和现代写法&#xff09;3.operator&#xff08;代码重构&#xff1a;传统写法和现代写法&#xff…...

笔记(一)——STL容器

容器分类&#xff1a;序列式容器&#xff1a;每个元素都有固定位置&#xff0c;取决于插入的时机和地点&#xff0c;和元素无关&#xff0c;如vector、deque、list、stack、queue。关联式容器&#xff1a;元素位置取决于特定的排序准则&#xff0c;和插入顺序无关&#xff0c;如…...

红黑树

红黑树是一个相对的平衡&#xff0c;减少了旋转的消耗 一个节点不是红的就是黑的根节点是黑的一个节点是红的&#xff0c;孩子是黑的&#xff08;没有连续的红色节点&#xff09;对于每个节点&#xff0c;从该节点到后代节点的简单路径&#xff0c;都包含相同的黑色&#xff0…...

RIP路由协议的更新(电子科技大学TCP/IP第二次实验)

一&#xff0e;实验目的 1、掌握 RIP 协议在路由更新时的发送信息和发送方式 2、掌握 RIP 协议的路由更新算法 二&#xff0e;预备知识 1、静态路由选择和动态路由选择 2、内部网关协议和外部网关协议 3、距离向量路由选择 三&#xff0e;实验原理 RIP 协议&#xff08…...

基于JWT实现用户身份认证

常见场景 账号/密码登录、手机号验证码登录、微信扫码登录 解决方案 基于Session认证方案 什么是session认证方案 服务端生成httpsession认证(内存-sessionId)sessionId写到浏览器cookie浏览器请求的header中自动带sessionId到服务端服务端校验sessionId是否合法 优点 .…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…...

自定义线程池1.2

自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本&#xff0c;将线程池中的线程数量交给使用者决定&#xff0c;并且将线程的创建延迟到任务提交的时候&#xff0c;在本文中我们将对这个版本进行如下的优化&#xff1a; 在新建线程时交给线程一个任务。让线程在某种情况下…...

初级程序员入门指南

初级程序员入门指南 在数字化浪潮中&#xff0c;编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言&#xff0c;明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 &#xff08;一&#xff09;编程语言抉择 编…...