干货速看!同行盆友来稿:一文带你搭建K8S高可用集群,以及在上面搭建Prometheus和Grafana。

写在开篇

kubeadm工具快速部署k8s集群实现故障自动发现、转移及修复,集群中部署prometheus+grafan可实现自动收集集群的各项新性能指标数据,可视化界面提升客户对各项性能指标的直观感知,实现高效快速故障排查及解决。

一、kubeadm搭建k8s集群

1、Kubeadm简介:

(1)什么是kebeadm?

作为Kubernetes官方提供的集群部署管理工具,采用”一键式”指令进行集群的快速初始化和安装,极大地简化了部署过程,消除了集群安装的痛点。可以快速部署一套k8s集群。

(2)Kubeadm基本原理:

在启动的过程可以查看到拉取组件镜像的过程。之所以kubeadm能成为最快搭建k8s集群的工具就在于它将组件都容器化部署。
使用两条命令可以快捷部署一套k8s集群:
kubeadm init:初始化集群并启动master相关组件,在计划用做master的节点上执行。
kubeadm join:将节点加入上述集群,在计划用做node的节点上执行。

(3)K8s集群角色中包含的组件:

K8s-master:
kube-apiserver
controller-manager
Scheduler
Etcd
K8s-node:
Kubelet
Kube-proxy
Docker

1.1 项目实验环境要求

可根据实际生产环境的需求配备适配的基础环境,本次项目仅作为实验参考

集群角色 机器数量 操作系统 硬件配置 iP地址 网络策略 备注 K8s-master 1台 CentOS7.x-86_x64 2个cpu2GB内存40GB硬盘 192.168.1.15 配置弹性公网;集群间网络可互访 禁止swap分区 K8s-node1 1台 CentOS7.x-86_x64 2个cpu2GB内存40GB硬盘 192.168.1.16 配置弹性公网;集群间网络可互访 禁止swap分区 K8s-node2 1台 CentOS7.x-86_x64 2个cpu2GB内存40GB硬盘 192.168.1.17 配置弹性公网;集群间网络可互访 禁止swap分区

1.2 实操步骤

1.2.1 环境准备
###三台机器均执行以下操作
###关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
###关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时操作
###关闭swap:
swapoff -a  # 临时操作
vim /etc/fstab  # 永久操作
###关闭swap:
swapoff -a  # 临时
vim /etc/fstab  # 永久
###设置主机名:
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
###将桥接的ipv4流量传递到iptables的链:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
 sysctl --system
###时间同步:假设时间不同步可以使用date set保证节点时间同步
1.2.2 安装docker

官网建议安装docker-19.03.9版本适配k8s集群

内网建议使用二进制安装,外网可以使用ali源或清华源进行安装

###三台机器均执行以下操作
###使用ali源下载并安装
Wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
###使用二进制包安装
外网机器下载二进制包(下载完毕可使用文件传输工具将包传送到内网机器上):
Wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
###内网机器安装部署docker:
tar zxvf docker-19.03.9.tgz
mv docker/* /usr/bin
###配置system管理docker:
cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
###配置docker加速器:
mkdir /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
###后台加载daemon.json
systemctl daemon-reload
###启动docker
systemctl start docker
1.2.3 安装kubeadm

获取yum软件源安装kubeadm

本人使用华为云自带的yum软件源安装部署,仅作为实验参考

###外网环境安装kubeadm:
添加ali yum软件源
 cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet
###内网环境安装kubeadm:
1、可以使用外网机器下载网络yum源并制作成本地源打包上传到内网机器上安装。
2、外网机器部署kubeadm获取到组件的镜像。Docker save将其保存为本地镜像供给内网使用(这里不详细解读操作,可以百度获取相关信息)
安装部署k8s-master:
###yum软件包完成kubeadm安装后通过命令行传参的方式初始化master。(当然也可以通过配置文件kubeadm.conf的方式进行初始化(即将命令行的参数写在配置文件中,通过配置文件引导初始化集群,本实验为了方便选择命令传参进行初始化)
kubeadm init \
  --apiserver-advertise-address=192.168.1.15 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.18.0 \ 指定版本
  --service-cidr=10.96.0.0/12 \ #cidr网段指的是插件的网段.配置的网段和集群内的物理网段不可以起冲突
  --pod-network-cidr=10.244.0.0/16 \ #pod分配的网段,配置的网段和集群内的物理网段不可以起冲突
  --ignore-preflight-errors=all   #指的是忽略错误信息
###在集群初始化的过程中,底层都历经哪些步骤呢?
1、[preflight]环境检查 #前期环境的部署情况
2、[kubelet-start]生成配置文件并启动 配置文件所在路径/var/lib/kubelet/config.yml
3、[cert]有apiserver,etcd,proxy证书
4、[kubeconfig]这个格式都用于K8S的认证文件 是组件之间的相互链接的关键
5、[control-plan] 静态创建pod静态pod目录 /etc/kubenetes/mainfests 用于拉取pod
6、[etcd]etcd静态pod启动etcd
实现kubelet开机自启:
Systemctl enable kubelet
###Master初始化的过程中会提示在其他节点执行自主添加进集群的命令
在node节点上输入以下命令可自主添加进k8s集群
kubeadm join 192.168.1.15:6443 --token 0exccz.8q01ow3wqgmw5d6o \
    --discovery-token-ca-cert-hash sha256:83003fe9ea8097c62610b35904f2ea1b23832bbd7f98e2a3fbe4c03ee912ed2d
###token是有效期的,关闭终端找不到此提示命令,可以通过一条命令再次生成。
kubeadm token create --print-join-command
###加上--ttl ,可以设置永久不过期。
###查看token的有效时间 kubeadm token list

1.2.4 部署容器网络cni

Calico是一个纯三层的数据中心网络方案,calico支持广泛的平台,包括kubernets,openstack等等。

Calico在每个计算节点利用linux kernel实现一个高效的虚拟路由器来负责数据转发,而每个vrouter通过bgp协议负责把自己上运行的workload的路由信息向整个calico网络内传播

###外网环境:
wget https://docs.projectcalico.org/manifests/calico.yaml
vim calico.yaml
   /192
    去注释 - name: CALICO_IPV4POOL_CIDR
                  value: "10.244.0.0/16"
  /169
     去注释
kubectl apply -f calico.yaml
Kubectl get pods -n kube-system -w  动态查看pod状态
###内网环境:
1、可以使用外网机器下载网络yum源并制作成本地源打包上传到内网机器上安装。
2、外网机器部署calico获取到组件的镜像。Docker save将其保存为本地镜像供给内网使用(这里不详细解读操作,可以百度获取相关信息)
1.2.5 部署dashboar

是默认k8s UI界面,主要用于查看集群资源

###下载并编辑dashboar的文本文档
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
vim recommended.yaml
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      nodePort: 30001(添加的)
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort(添加的)
###创建pod
kubectl apply -f recommended.yaml
###查看pod状态信息
kubectl get pods -n kubernetes-dashboard
###登录UI界面:
火狐浏览器登录https://公网ip:30001,选择tonken验证
我们可以创建一个用户拿到token值
###创建用户
创建service account并绑定默认cluster-admin管理员集群角色:
 kubectl create serviceaccount dashboard-admin -n kube-system
###用户授权
 kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
###将token粘贴在网页验证的位置
###获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
1.2.6 Keepalived搭建Master高可用

Nginx是一个主流Web服务和反向代理服务器,这里用四层实现对apiserver实现负载均衡

Keepalived基于VIP绑定实现服务器双机热备

Keepalived主要根据Nginx运行状态判断是否需要故障转移(偏移VIP),例如当Nginx主节点挂掉,VIP会自动绑定在Nginx备节点,从而保证VIP一直可用,实现Nginx高可用。

###主/备安装软件包
yum install epel-release -y
yum install nginx keepalived -y
主/备nginx配置文件
cat > /etc/nginx/nginx.conf << "EOF"
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
#四层负载均衡,为两台Master apiserver组件提供负载均衡
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status
$upstream_bytes_sent';
access_log /var/log/nginx/k8s-access.log main;
upstream k8s-apiserver {
server 192.168.31.71:6443; # Master1 APISERVER IP:PORT
server 192.168.31.74:6443; # Master2 APISERVER IP:PORT
}
server {
listen 6443;
proxy_pass k8s-apiserver;
}
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80 default_server;
server_name _;3. keepalived配置文件(Nginx Master)
vrrp_script:指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移)
virtual_ipaddress:虚拟IP(
VIP)
检查nginx状态脚本:
location / {
}
}
}
EOF
主Keepalived配置文件
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
vrrp_script check_nginx {
#指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
state MASTER
interface ens33 # 修改为实际网卡名
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
priority 100 # 优先级,备服务器设置 90
advert_int 1 # 指定VRRP 心跳包通告间隔时间,默认1秒
authentication {
auth_type PASS
auth_pass 1111
}
虚拟IP
virtual_ipaddress {
#虚拟IP(VIP)
192.168.31.88/24
}
track_script {   #
check_nginx
}
}
EOF
Nginx健康检查脚本
cat > /etc/keepalived/check_nginx.sh << "EOF"
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
exit 1
else
exit 0
fi
EOF
chmod +x /etc/keepalived/check_nginx.sh
备Keepalived配置文件
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_BACKUP
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.31.88/24
}
track_script {
check_nginx
}
}
EOF
### 备nginx健康检查脚本如主所示,不重复解释

二、k8s搭建Prometheus

1.promethues简介

(1)什么是prometheus?

​ 是一套开源监控、报警、时间序列、数据库的组合采集的样本,以时间序列的方式存在内存(TSDB时序数据库,不属于非关系型或关系型数据库)中,并定时持久化存储在硬盘中。

(2)Prometheus适用场景和不适用场景

​ 天生适用于k8s,promethus可以很好记录任何纯数据自时间序列,适用于以机器为中心的监视,也适用于高度动态的面向服务的体系结构的监视。

​ 适用于为微服务架构,优势在于每个 prometheus server是独立的,不依赖与任何介质,当它挂掉的时候自己会书写一份日志。用户可以通过日志排除故障并重启prometheus。

​ 不适合用于一些精准性需求很高的场合

(3)Prometheus关键组件

Promethus server

Promethus server 是promethus组件的核心部分

负责实现监控数据的获取、存储以及查询,提供PromQL查询语言支持

Retrieval:采样模块,prometheus的服务器在哪里拉取数据,检索拉取到的数据分发给 TSDB进行存储

TSDB:存储模块默认本地存储为TSDB

HTTP server : 提供http接口查询和面板,默认端口为9090

Nodeport业务数据源

业务数据源通过pull/push两种方式推送数据到promethus server

支持其他数据源的指标导入到prometheus,支持数据库,硬件,消息中间件,存储系统。http服务器,jmx等

负责收集目标对象的性能数据,并通过http接口供prometheus server获取

只要符合接口格式,就可以被采集

Mysqld_exporter

用于监控mysql指标的一个导出器,支持对mysql5.5以上进行监控。

altermanager报警管理器

Promethus通过配置报警规则,如果符合报警规则,那么就将报警推送到altermanager。

可视化监控界面

promethus收集到数据之后,由webui界面进行可视化图标展示,目前我们可以通过自定义的api客户端进行调用数据展示,也可以直接使用grafana解决方案来展示。

short-lived jobs:
存在时间不足以被删除的短暂或批量业务,无法通过pull的方式拉取,需要使用push的方式,与pushgeteway结合使用。

Service Discovery:
服务发现,prometheus支持多种服务发现机制: 文件,DNS,k8s,openstack,等,基于服务发现的过程,通过第三方接口,prometheus查询到需要监控的target列表,然后轮询这些target获取监控数据。

客户端SDK
官方提供的客户端类库有go,java,python,ruby

pushgateway
支持临时性的job主动推送指标的中间网关,prometheus默认通过pull方式从exporters拉取,但有些情况我们是不允许promethes

与exporters直接进行通信的,这时候我们可以使用pushgateway由客户端主动push数据到pushgateway,在由prometheus拉取。很

多时候我们需要自定义一些组件来采集

proDash
使用rails开发的dashboard,用于可视化指标数据

(4)工作过程

  • prometheus server 定期从配置好的jobs或者exporters中拉metrics.或者接受来自pushgateway发过来的metrics,或者从其他的 prometheus server中拉取metrics。
  • prometheus server 在本地存储收集到的metrics,并运行已经定义好的arlt.rules,记录新的时间序列或者向alertmanager推送报警。
  • Alertmanager根据配置文件,对接受的警报进行处理,发出告警。
  • 在图形界面中,可视化采集数据,可以使用别人写好的grafana模板。

1.1实操步骤

1.1.2 master创建一个命名空间
### master创建namespace
[root@k8s-master-01]#Vim prometheus_grafana_namespaces.yaml
apiVersion: v1
kind: Namespace
metadata:
name: prom-grafana
labels:
name: prom-grafana
[root@k8s-master-01 ]# kubectl create -f prom-grafana-namespaces.yaml

### master创建一个SA账号
[root@k8s-master-01]# kubectl create serviceaccount drifter -n prom-grafana

### matser节点把sa 账号drifter通过clusterrolebing绑定到clusterrole上
[root@k8s-master-01 ]# kubectl create clusterrolebinding drifter-clusterrolebinding -n prom-grafana --clusterrole=cluster-admin  --serviceaccount=prom-grafana:drifter

####在集群的任意节点上创建一个数据目录
mkdir /data
chmod 777 /data/
1.1.3 master创建一个configmap存储卷,用来存放prometheus配置信息
[root@k8s-master-01]#vim prometheus-cfg.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: prom-grafana
  labels:
    app: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      component: server
    #matchExpressions:
    #- {key: app, operator: In, values: [prometheus]}
    #- {key: component, operator: In, values: [server]}
  template:
    metadata:
      labels:
        app: prometheus
        component: server
      annotations:
        prometheus.io/scrape: 'false'
    spec:
      nodeName: k8s-node-02  #prometheus&#x8C03;&#x5EA6;&#x5230;&#x8FD9;&#x4E2A;&#x8282;&#x70B9;&#x4E0A;&#x3002;
      serviceAccountName: drifter
      containers:
      - name: prometheus
        image: prom/prometheus:v2.2.1
        imagePullPolicy: IfNotPresent
        command:
          - prometheus
          - --config.file=/etc/prometheus/prometheus.yml
          - --storage.tsdb.path=/prometheus
          - --storage.tsdb.retention=720h
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/prometheus/prometheus.yml
          name: prometheus-config
          subPath: prometheus.yml
        - mountPath: /prometheus/
          name: prometheus-storage-volume
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
            items:
              - key: prometheus.yml
                path: prometheus.yml
                mode: 0644
        - name: prometheus-storage-volume
          hostPath:
           path: /data
           type: Directory

###&#x521B;&#x5EFA;prometheus server pod
kubectl create -f prometheus-deployment.yaml

###&#x67E5;&#x770B;prometheus server pod&#x72B6;&#x6001;&#x4FE1;&#x606F;
kubectl get pod -n prom-grafana

1.1.5 对外暴露prometheus端口
###prometheus pod&#x521B;&#x5EFA;&#x4E00;&#x4E2A;service
[root@k8s-master-01]#vim  prometheus-svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: grafana-server
  name: grafana-server
  namespace: prom-grafana
spec:
  ports:
  - port: 80
    targetPort: 3000
  selector:
    k8s-app: grafana
 type: NodePort
  type: ClusterIP
  [root@k8s-master-01]# kubectl create -f grafana-svc.yaml

1.2.5 查看暴露的端口
[root@k8s-master-01]# kubectl get svc -n prom-grafana
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
grafana-server      ClusterIP   10.102.129.245           3000/TCP   2m3s
prometheus-server   ClusterIP   10.96.17.72              9090/TCP   12m
1.2.6 访问效果
  • 访问prometheus

干货速看!同行盆友来稿:一文带你搭建K8S高可用集群,以及在上面搭建Prometheus和Grafana。
  • 访问grafana

干货速看!同行盆友来稿:一文带你搭建K8S高可用集群,以及在上面搭建Prometheus和Grafana。

本篇转载于:ttps://mp.weixin.qq.com/s/a-iCI-sR4gbJucdQnC6pHw

Original: https://www.cnblogs.com/ttropsstack/p/16452868.html
Author: 不背锅运维
Title: 干货速看!同行盆友来稿:一文带你搭建K8S高可用集群,以及在上面搭建Prometheus和Grafana。

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582320/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • STM32CubeIDE学习记录(按键点灯工程)

    博主使用的开发板以及相关外设连接如下: 芯片型号为: STM32F103RCT6, 新建STM32CubeIDE项目 配置完成后会生成相应的文件并进入如下界面: 使用外部晶振时钟 …

    Linux 2023年6月14日
    0135
  • 操作系统实现:断点切换原理及实现

    本文参考书:操作系统真像还原、操作系统原型xv6分析与实验、其中图主要来自linux内核完全注释 本文针对断点切换迷茫的问题。 详解内核态-用户态的栈变化, 了解用户态-内核态的实…

    Linux 2023年6月7日
    092
  • 使用Supervisor监控mysql

    监控文件配置: [program:mysql] ; 管理的子程序名字,要和项目有关联,不能乱写command=/usr/local/mysql/bin/mysqld_safe &#…

    Linux 2023年6月6日
    055
  • margin-top塌陷

    一、问题描述 ​ 在两个及以上的盒子嵌套时候,内部的盒子设置的 margin-top 的效果会加到最外边的盒子上,导致内部的盒子margin-top设置失败。 – 示例…

    Linux 2023年6月14日
    0106
  • linux配置yum源的三种方法

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 linux配置yum源的三种方法: 1.配置网络yum源 2.通过上传镜像文件配置本地yum源 3.通过连接存储或本地镜像文件配…

    Linux 2023年5月27日
    084
  • CentOS7.6 单用户模式下修改root密码

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0101
  • rsync

    rsync是什么 rsync特性 1)可以镜像保存整个目录树和文件系统。 2)可以很容易做到保持原来文件的权限、时间、软硬连接等。 3)无需特殊权限即可安装。 4)快速:第一次同步…

    Linux 2023年6月6日
    091
  • 附032.Kubernetes实现蓝绿发布

    蓝绿发布原理 蓝绿发布本质上是希望能优雅无误的迭代应用,以便于使应用平稳提供服务。通常是不停老版本的同时对新版本进行先发布,然后确认无误后进行流量切换,即并行部署。Kubernet…

    Linux 2023年6月13日
    095
  • Linux网络编程基础API

    Linux网络API主要可分为: socket地址API socket基础API 网络信息API socket地址API 两种字节序 大端字节序:整数的高位字节存储在内存的低地址处…

    Linux 2023年6月13日
    072
  • VMware服务关闭后一定要重启

    重要的事情说三遍:服务暂时关闭记得重启,服务暂时关闭记得重启,服务暂时关闭记得重启!!! VMware服务由于安装补丁的需要我暂时把服务关闭了,于是我遇到了尴尬的一幕,于是乎发现上…

    Linux 2023年6月7日
    0120
  • 容器编排,跨集群部署(脚踩2只船)问题研究

    —【前言】— https://www.cnblogs.com/cmt/p/14306142.html 问题来自于博客园,讨论容器编排,跨集群部署(脚踩2只船…

    Linux 2023年6月14日
    0112
  • 数据结构 单链表

    cpp;gutter:true;</p> <h1>include</h1> <h1>define null 0;</h1&gt…

    Linux 2023年6月13日
    083
  • 辗转相除法:(求最大公约数)

    辗转相除法:(最大公约数)又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除…

    Linux 2023年6月7日
    0116
  • CSAPP 之 CacheLab 详解

    前言 本篇博客将会介绍 CSAPP 之 CacheLab 的解题过程,分为 Part A 和 Part B 两个部分,其中 Part A 要求使用代码模拟一个高速缓存存储器,Par…

    Linux 2023年6月7日
    0137
  • python openpyxl UserWarning: Workbook contains no default style, apply openpyxl‘s default

    告警解释 这是一个告警,这个excel文件没有设置默认的样式。一般这种没有默认样式的excel文档是由java程序生成的,不是像windows系统日常使用中通过右键点击创建的exc…

    Linux 2023年6月8日
    096
  • 很有创意的AkShell:用JS开发web,轻松发布

    今天看了infoq对作者的采访,感觉很有意思。 我去他们的网站看了下,作者是俄罗斯人,他的目标是最大可能地简化web开发。只需要用浏览器就可以开发 ,点两下鼠标就发布了。 他的哲学…

    Linux 2023年5月28日
    0100
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球