0%

Waline官方文档

LeanCloud数据库添加
  1. 注册登录创建国际版LeanCloud数据库
  2. 绑定db域名
  3. 阿里云解析CNAME域名
  4. 记录APP IDAPP KeyMaster Key
Vercel服务端部署
  1. 使用github授权登录vercel
  2. 点击deploy
  3. 输入仓库名点击创建
  4. 环境变量设置里面添加三个环境变量 LEAN_ID, LEAN_KEYLEAN_MASTER_KEY 值分别为 APP ID, APP KEY, Master Key
  5. 绑定服务端域名
  6. 登录waline.iexxk.com进行管理员注册
hexo博客next主题配置waline评论
  1. 部署脚本文件添加命令npm install @waline/hexo-next

  2. theme/next/_config.yml配置文件添加如下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # Waline
    # For more information: https://waline.js.org, https://github.com/walinejs/waline
    waline:
    enable: true #是否开启
    serverURL: waline.iexxk.com # Waline #服务端地址,我们这里就是上面部署的 Vercel 地址
    placeholder: 请文明评论呀 # #评论框的默认文字
    avatar: mm # 头像风格
    meta: [nick, mail, link] # 自定义评论框上面的三个输入框的内容
    pageSize: 10 # 评论数量多少时显示分页
    lang: zh-cn # 语言, 可选值: en, zh-cn
    # Warning: 不要同时启用 `waline.visitor` 以及 `leancloud_visitors`.
    visitor: false # 文章阅读统计
    comment_count: true # 如果为 false , 评论数量只会在当前评论页面显示, 主页则不显示
    requiredFields: [] # 设置用户评论时必填的信息,[nick,mail]: [nick] | [nick, mail]
    libUrl: # Set custom library cdn url

常见问题

  1. 版本太低问题,升级到next 8+

    1
    Error: Unable to call `next_data`, which is undefined or falsey

参考:

LeanCloud如何绑定域名

waline如何创建Vercel服务

Vercel如何绑定域名

Hexo博客进阶:为 Next 主题添加 Waline 评论系统

需求

因博客修改了域名,以前收录的旧域名需要自动重定向到新域名,而且百度和google需要添加新站点收录。因为博客采用netlify部署的。

操作步骤

  1. 在阿里云域名修改新域名解析

  2. 修改netlify里面的https认证及新域名添加

  3. 兼容旧域名,添加310重定向,修改hexo博客目录下的netlify.toml文件,增加如下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [[redirects]]
    from = "https://xuan.netlify.app/*"
    # :splat 是为了原路径保持,不然会跳转到主页
    to = "https://iexxk.com/:splat"
    status = 301
    force = true
    [[redirects]]
    from = "https://blog.iexxk.com/*"
    to = "https://iexxk.com/:splat"
    status = 301
    force = true
  4. 修改百度收录并在网站改版里面添加旧域名和新域名的映射

  5. 修改Google收录

概念

  • Istio:开源的服务网格

    核心功能包括:流量管理、安全、可观察性

  • 服务网格:

zookeeper安装

1
2
3
4
5
brew install zookeeper #安装
zkServer start #启动
zkcli -server localhost:2181 #客户端连接zk服务
[zk: localhost:2181(CONNECTED)] ls / # ls进行查看连接资源
[zk: localhost:2181(CONNECTED) 13] ls /dubbo/com.api.ITestService/providers #查看连接的提供者

springboot 引入dubbo

消费者和提供者公共配置

  1. 添加依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
    </dependency>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.6</version>
    </dependency>
    <dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.33.Final</version>
    </dependency>
  2. 启用dubbo,在启动类添加注解@EnableDubbo

  3. 配置文件添加zk,spring.dubbo.registry.address = zookeeper://localhost:2181

  4. 添加接口

    1
    2
    3
    public interface ITestService {
    public String hello();
    }

提供者代码

1
2
3
4
5
6
7
8
9
import com.alibaba.dubbo.config.annotation.Service;

@Service
public class TestService implements ITestService {
@Override
public String hello() {
return "hello world!";
}
}

消费者代码

1
2
3
4
5
6
7
8
9
10
11
12
import com.alibaba.dubbo.config.annotation.Reference;

@RestController
public class TestController {

@Reference(check = false)
ITestService iTestService;

@GetMapping("hello")
public String hello(){
return iTestService.hello();
}

常见问题

  1. 异常信息

    1
    2
    cause: io/netty/bootstrap/ServerBootstrap
    at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol.createServer(DubboProtocol.java:287)[dubbo-2.6.6.jar:2.6.6]

    解决:添加netty依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.33.Final</version>
    </dependency>
  2. 异常信息

    1
    2
    java.lang.IllegalArgumentException: Specified invalid port from env value:0
    at com.alibaba.dubbo.config.ServiceConfig.parsePort(ServiceConfig.java:691) ~[dubbo-2.6.6.jar:2.6.6]

    解决:环境变量设置有问题,在vm上覆写参数-DDUBBO_PORT_TO_BIND=20880

  3. 异常信息

    1
    2
    failed to connect to server /10.0.0.54:20880, error message is:connection timed out: /10.0.0.54:20880
    at com.alibaba.dubbo.remoting.transport.netty4.NettyClient.doConnect(NettyClient.java:127) ~[dubbo-2.6.6.jar:2.6.6]

    解决:多网卡下ip绑定错误,导致连接超时,在vm添加参数-DDUBBO_IP_TO_BIND=10.9.98.133绑定ip

  4. 异常信息

    1
    2
    3
    c.c.b.s.w.a.GlobalExceptionHandler : application error
    com.alibaba.dubbo.rpc.RpcException: No provider available from registry 192.168.240.15:2181 for service cn.com.api.dubbo.service.TestDubboService:1.0.0 on consumer 10.233.73.69 use dubbo version 2.6.6, please check status of providers(disabled, not registered or in blacklist).
    at com.alibaba.dubbo.registry.integration.RegistryDirectory.doList(RegistryDirectory.java:590)

    解决:如果zookeeper都显示提供者和消费者都注册通知正常,但是消费者缓存里面拿不到提供者的服务地址,检查spring.dubbo.invoke.invalid.ips 这个配置是否把你的ip拦截了

Keepalived介绍

大白话:就是虚拟一个ip,然后虚拟机绑定该ip,如果该虚拟机挂掉,该另一个虚拟机就绑定虚拟ip。

keepalived是基于VRRP协议为LVS服务提供高可用方案。主要提供了负载均衡和高可用功能,用来避免单点故障。负载均衡是通过linux的IPVS(ip虚拟服务器)实现,高可用通过VRRP实现多机故障转移。
  keepalived一般是2个节点运行keepalived,一台是主节点(MASTER),一台是备节点(BACKUP)对外表现都是一个虚拟IP,主节点会通过组播方式发送特定的消息给备节点,如果备节点收不到这个特定消息时,说明主节点就宕机了,此时备节点就会接管VIP进行服务提供,这就实现了高可用。

  • VRRP虚拟路由器冗余协议(英语:Virtual Router Redundancy Protocol,缩写为 VRRP)是一种网络协议,可以为参与的路由器自动分配可用的IP地址。这个协议通过在子网中,自动选取默认网关,来增加路由的可用性和可靠性。

    VRRP原理:是一种容错协议,保证当主机的下一条路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。

    VRRP相关术语:

    1. 虚拟路由器:由一个Master路由器和一个或多个Backup路由器组成。
    2. VRID:虚拟路由器的标识。同一虚拟路由器内的路由器有着相同的VRID。
    3. VIP(虚拟IP地址):路由器组(虚拟路由器)的IP地址。
    4. 抢占模式与非抢占模式:Master会以组播方式不断的向虚拟路由器组内发送自己的心跳报文,一旦Backup在设定时间内没有收到心跳信息的次数超过了设定次数,则会将Master的所有权转移到优先级最高的Backup,则就是抢占模式。非抢占模式是指只有在主节点完全故障时才能将backup变为master。
  • 组播:网卡支持并开启组播功能,组播通信方式是一种很节省资源的通信方式。其余还有单播、广播。

  • LVSLinux虚拟服务器(Linux Virtual Server)是一个虚拟的服务器集群系统,用于实现负载平衡

  • VIP虚拟IP地址(Virtual IP Address),主要是用来进行不同主机之间的切换,主要用在服务器的主从切换。

L2ohL9.png

实战

常用命令

1
2
3
4
#安装
yum install -y keepalived
# 启动keepalived
systemctl start keepalived

10.0.0.10双主热备配置文件 /etc/keepalived/keepalived.conf10.0.0.11修改相反即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
! Configuration File for keepalived

global_defs {
router_id NGINX_DEVEL1 # 标识节点的字符串,一般设置为hostname
}

vrrp_script chk_nginx { #检测业务进程(nginx)来调整keepalived权重
script "/etc/keepalived/check_nginx.sh"
interval 2 #每2s检测一次
#weight -5 #检测失败(脚本返回非0)则优先级 -5
weight 2 #检测失败(脚本返回非0)则优先级 +2?
fall 3 #检测连续3次失败才算确定是真失败。
rise 2 #检测 2 次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
state MASTER # 标识主节点服务(只有MASTER和BACKUP两种,大写)
interface eth0 # 当前ip的网卡接口
mcast_src_ip 10.0.0.10 # 本机IP地址
virtual_router_id 51 # 虚拟路由 ID(0-255),在一个 VRRP 实例中主备服务器 ID 必须一样
priority 200 # 优先级值设定:MASTER 要比 BACKUP 的值大
advert_int 1 # MASTER和BACKUP节点之间的同步检查时间间隔,单位为秒,主被设置一致

track_interface { # 设置额外的监控,eth0网卡出现问题也会切换
eth0
}

authentication { # 认证机制,主从节点保持一致即可
auth_type PASS
auth_pass password123 # MASTER和BACKUP使用相同明文才可以互通
}

virtual_ipaddress { # 虚拟IP地址池,可以多个IP
10.0.0.20/24 # 虚拟IP N个(VIP)
}

track_script {
chk_nginx
}
}

vrrp_instance VI_2 {
state BACKUP
interface eth0
mcast_src_ip 10.0.0.11
virtual_router_id 52
priority 180
advert_int 1

track_interface {
eth0
}

authentication {
auth_type PASS
auth_pass password123
}

virtual_ipaddress {
10.0.0.21/24
}

track_script {
chk_nginx
}
}

后面就可以通过vip进行访问了。

ip a s查看vip

1
2
3
4
5
6
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:99:e5:7e:13 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.10/24 brd 10.255.243.255 scope global noprefixroute dynamic eth0
valid_lft 58597sec preferred_lft 58597sec
inet 10.0.0.20/24 scope global secondary eth0
valid_lft forever preferred_lft forever

/etc/keepalived/check_nginx.sh脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

function check_nginx() {
for ((i=0;i<5;i++));do
nginx_job_id=$(pgrep nginx)
if [[ ! -z $nginx_job_id ]];then
return
else
sleep 2
fi
nginx_job_id=0
done
}

# 1: running 0: stopped
check_nginx
if [[ $nginx_job_id -eq 0 ]]; then
/usr/bin/systemctl stop keepalived
exit 1
else
exit 0
fi

百度经验助手

名称:百度经验助手

匹配规则:https://jingyan.baidu.com/edit/content*

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
'use strict';
//修改标题和图标
var link = document.querySelector("link[rel*='icon']") || document.createElement('link');
link.type = 'image/x-icon';
link.rel = 'shortcut icon';
link.href = 'https://blog.iexxk.com/images/favicon-32x32-next.png';
document.getElementsByTagName('head')[0].appendChild(link);
document.title = '经验笔记编辑';
//隐藏不用的元素
document.getElementById("js_float_high_quality_wrap").style.visibility = "hidden";
document.getElementById("header").style.display = "none";
document.querySelector("div.wgt-benefit").style.display = "none";
document.querySelector("div.video-guide-left").style.visibility = "hidden";
//检测敏感词汇
var eb=new Array("女人","代理");
var bz = document.querySelector(".ca-step-item");
bz.onclick = function(){
for (const v of eb) {
var dom = $(':contains('+v+')').filter(function(){
return $(this).text()==v;
});
dom.css("color","red");
}
}
// 格式化输入内容,加租加句号
var ed= document.querySelectorAll('.edui-body-container');
var submit = document.querySelector(".release-btn");
var catalogListUl =document.getElementById("catalogList"); //在左侧悬浮窗生成发布
var li =document.createElement("li"); //createElement生成button对象
var input =document.createElement("input"); //createElement生成input对象
input.style="width:96px;";
li.innerHTML = '发布';
li.onclick = function(){
var ed= document.querySelectorAll('.edui-body-container');
for(var inp of ed){
var lp= inp.lastElementChild;
var fp= inp.firstElementChild;
if(lp.textContent.indexOf(",") == -1){ //不包含逗号,进行格式话
lp.textContent="在“"+lp.textContent+"”界面,点击“"+fp.textContent+"”按钮。";
fp.textContent="点击“"+fp.textContent+"”";
}
if(!lp.textContent.endsWith('。')){ //不包含句话,添加句号
lp.textContent=lp.textContent+"。";
}
if(inp.id != 'editor-brief'){ //加粗
var b=document.createElement("strong");
b.textContent=fp.textContent;
fp.textContent="";
fp.appendChild(b);
}
inp.focus();
}

input.focus();
submit.click();
}
catalogListUl.appendChild(li);
catalogListUl.appendChild(input);
//添加下拉软件选择
function soft(input){
var s=input[4];
s.setAttribute("list","soft");
var l=document.createElement("datalist");
l.setAttribute("id","soft");
var opvs=new Map();
opvs.set("微信","8.0.20");
opvs.set("QQ","v8.8.85.636");
opvs.set("kubesphere","v3.1.0");
opvs.set("国家医保服务平台","v1.3.7");
opvs.set("Zepp Life","6.0.3");
opvs.set("米家","v7.4.203");
opvs.set("支付宝","10.2.60");
opvs.set("访达","12.3");
opvs.set("Confluence","6.14.1");
opvs.set("IDEA","2022.1.1");
opvs.set("热血航线","1.7.1");
opvs.set("铁路12306","5.5.0.18");
opvs.set("网易云音乐","8.7.35");
opvs.set("保卫萝卜3","2.2.4");
opvs.set("微信读书","6.2.3");
opvs.set("闲鱼","7.4.80");
opvs.set("哔哩哔哩","6.71.0");
opvs.set("Apifox","2.0.2");
opvs.set("DaVinci Resolve studio 17","17.2.2");
opvs.set("中国银行","7.3.2");
opvs.set("炉石传说","23.2.138759");
opvs.set("云闪付","9.1.3");
opvs.set("必剪","2.13.0");
opvs.set("自动操作","2.10");
for (const v of opvs.keys()) {
var op= document.createElement("option");
op.setAttribute("value",v);
l.appendChild(op);
}
s.appendChild(l);
s.onchange = function() {
console.log(s.value);
input[5].value=opvs.get(s.value);
input[5].focus();
}
}
// 添加类型选择事件
var ss = document.getElementById("category").querySelectorAll("select")[2]; //获取第二个下拉选择框
ss.onchange = function() { //监听下拉框选择事件
console.log(ss.value);
if (ss.value == 16) { //电脑
var pcInput= document.getElementById("js-software-list").querySelectorAll("input");
pcInput[0].focus();
pcInput[0].value = "macOS Monterey";
pcInput[1].focus();
pcInput[1].value = "12.2.1";
pcInput[2].focus();
pcInput[2].value = "MacBook Pro";
pcInput[3].focus();
pcInput[3].value = "2017";
//添加下拉软件选择
soft(pcInput);
} else if (ss.value == 20||ss.value == 32) { //手机
var phoneInput= document.getElementById("js-software-list").querySelectorAll("input");
phoneInput[0].focus();
phoneInput[0].value = "iOS";
phoneInput[1].focus();
phoneInput[1].value = "15.4.1";
phoneInput[2].focus();
phoneInput[2].value = "iPhone";
phoneInput[3].focus();
phoneInput[3].value = "13";
//添加下拉软件选择
soft(phoneInput);
}
document.getElementById("is-origin").click();//自动勾选原创
document.querySelector("input[name='title']").focus();
};

轻量K8s集群

对比

  • MicroK8s:集成度高,配置部署简单,Kubernetes 发行版,旨在运行快速、自我修复和高度可用的 Kubernetes 集群,适合在云、本地开发环境以及边缘和物联网设备。
  • K3s:插件独立,更轻量,部署配置复杂,用于物联网边缘设备生产级Kubernetes工作负载。
  • MINIKUBE:本地Kubernetes安装程序,常用于本地运行。

MicroK8s

1

基础服务

名称 说明
kubernetes(k8s) k8s集群
kubeadm k8s集群部署工具
kubesphere(青云) 容器管理平台
Prometheus-Operator k8s监控平台
Grafana Loki 日志收集平台
jaeger 分布式链路追踪
skywalking 分布式链路追踪
KubeKey kk一键安装k8s

k8s组件概览

k8s

控制平面组件

  • kube-apiserver:API 服务器是 Kubernetes 控制面的前端,各组件通讯中转站,接收外部请求。
  • etcd:兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
  • kubu-scheduler:节点资源调度(调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。)
  • kube-controller-manager:控制器进程组件(节点、任务、端点、账户和令牌控制器)
  • cloud-controller-manager:云平台交互控制器(节点、路由、服务控制器)非必需

Node组件(每个节点上运行)

  • kubelet:维护节点状态等
  • kube-proxy:负责节点网络代理

容器/插件(DNS必须)/Web(管理界面)/监控/日志

架构模式

  • master节点:包含kube-apiserver、kubu-scheduler、kube-controller-manager组件,主要用于管理集群。
  • etcd节点:包含etcd组件,存储重要的集群有状态信息
  • worker节点:工作节点,主要用于运行业务服务容器等

etcd和master分开部署和部署到一台区别?

高可用

  • Master的kube-apiserver、kube-controller-mansger和kube-scheduler服务至少三个结点的多实例方式部署。
  • ETCD至少以3个结点的集群模式部署。
  • 负载均衡 Load Balance使用双机热备,向Node暴露虚拟IP作为入口地址,供客户端访问。

高安全

  • Master、ETCD集群启用基于CA认证的HTTPS安全机制,Master启用RBAC授信机制。

快速部署k8s青云集群

部署步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
#-- 所有机器执行
yum update -y
# kk安装前所需依赖socat conntrack是必须安装的,ebtables ipset是建议安装的
yum install -y socat conntrack ebtables ipset
# 检查时间,还需检查是否安装sudo/curl/openssl软件
date
#-- 单机执行
export KKZONE=cn
curl -sfL https://get-kk.kubesphere.io | VERSION=v1.1.0 sh -
# 创建带kubernetes和kubesphere的配置文件,也可以只安装kubernetes,安装kubesphere必会安装kubernetes
./kk create config --with-kubernetes v1.18.6 --with-kubesphere v3.1.0
export KKZONE=cn
./kk create cluster -f config-sample.yaml | tee kk.log

all in one部署

all in one部署属于单机部署,是所有东西部署到一台机器,适合实验环境。

注意事项:

  • 虚拟机需要设置内存8G以上,cpu设置8个虚拟cpu。
  • 每个kk命令执行前都执行下export KKZONE=cn命令,解决网络问题,该命令只对下个命令生效。
  • 安装最好不要选择最新的版本,选择最新的前一个版本,因为国内资源也许没有更新这么快,导致一些资源下载失败。

组件介绍

组件启用分安装时启用和安装后启用

  • 安装时启用

    1
    2
    3
    #下载https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/kubesphere-installer.yaml
    #修改kubesphere-installer.yaml然后在里面启用组件
    kubectl apply -f cluster-configuration.yaml
  • 安装后启用

    集群管理
    自定义资源CRD
    clusterconfiguration
    ks-installer
    编辑配置启用组件
    服务组件查看组件状态

devops

  • 流水线队列中,检查是否设置ci节点,集群设置标签node-role.kubernetes.io/worker设置ci
  • 工作台–>企业空间–>DevOps工程
  • 自定义 Jenkins Agent,在jenkins-casc-config添加自定义镜像的配置,然后登陆 Jenkins 重新加载(新版本也许可以不用),最后在jenkins部署脚本就可以使用对应的agent.node.lable使用自定义镜像编译了。

logging(monitoring)

  • 日志监测

Istio(servicemesh)

  • 服务网格

常见错误

  1. 安装kubesphere提示如下错误

    1
    2
    ERRO[16:03:26 CST] Failed to exec command: sudo -E /bin/sh -c "/usr/local/bin/kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs --from-file=etcd-client-ca.crt=/etc/ssl/etcd/ssl/ca.pem --from-file=etcd-client.crt=/etc/ssl/etcd/ssl/node-k8s-etcd-242.14.pem --from-file=etcd-client.key=/etc/ssl/etcd/ssl/node-k8s-etcd-242.14-key.pem"
    error: error reading /etc/ssl/etcd/ssl/node-k8s-etcd-242.14.pem: no such file or directory: Process exited with status 1 node=10.255.242.10

    解决:

    1
    2
    3
    4
    # 修改所有member开头的为node
    cp /etc/ssl/etcd/ssl/member-k8s-etcd-242.14-key.pem /etc/ssl/etcd/ssl/node-k8s-etcd-242.14-key.pem
    # 修改完再次执行部署脚本
    ./kk create cluster -f config-sample.yaml | tee kk.log
  2. 在worker节点执行KK提示如下错误

    1
    2
    3
    4
    [upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
    error execution phase upload-certs: error uploading certs: error creating token: timed out waiting for the condition
    ....
    Failed to get cluster status: Failed to upload kubeadm certs: Failed to exec command: sudo -E /bin/sh -c "/usr/local/bin/kubeadm init phase upload-certs --upload-certs"

    解决:检查 controlPlaneEndpoint配置的负载均衡服务是否正常,lb正常还是不成功,先将负载设置成master节点的ip,后面部署好了再添加负载,修改负载节点过后执行./kk delete cluster -f config-sample.yaml 在执行安装命令,不然之前安装存的还是旧的负载均衡。

  3. 流水线添加节点报错

    1
    java.net.ProtocolException: Expected HTTP 101 response but was '400 Bad Request'

    解决:在jenkins-casc-config添加的新节点配置错误,最好的解决方案是复制之前的模版,修改所有名称,例如替换所有nodejsnodejs1415,不要采用继承模式,可能新版本才支持。

  4. 访问某个页面提示Internal Server Error

    1
    Internal Server Error: "/apis/clusters/sim-1/apiextensions.k8s.io/v1beta1/customresourcedefinitions/clusterconfigurations.installer.kubesphere.io": http2: invalid Connection request header: ["upgrade"]

    解决:在负载均衡服务器(keepalived)的nginx配置添加如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # /apis/clusters/sim-1/apiextensions.k8s.io和错误异常的地址对应
    location /apis/clusters/sim-1/apiextensions.k8s.io {
    proxy_http_version 1.1;
    proxy_redirect off;
    proxy_pass http://实际域名地址;
    proxy_set_header Host $host:$server_port;
    #proxy_set_header Upgrade $http_upgrade;
    proxy_set_header X-Forwarded-Proto $scheme;
    #proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

部署配置config-sample.yaml

主要修改hosts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
apiVersion: kubekey.kubesphere.io/v1alpha1
kind: Cluster
metadata:
name: sample
spec:
hosts:
## 添加虚拟机
- {name: k8s-master-240.23, address: 10.5.240.23, internalAddress: 10.5.240.23, user: root, password: pwd}
- {name: k8s-master-240.24, address: 10.5.240.24, internalAddress: 10.5.240.24, user: root, password: pwd}
- {name: k8s-master-240.25, address: 10.5.240.25, internalAddress: 10.5.240.25, user: root, password: pwd}
- {name: k8s-etcd-240.26, address: 10.5.240.26, internalAddress: 10.5.240.26, user: root, password: pwd}
- {name: k8s-etcd-240.27, address: 10.5.240.27, internalAddress: 10.5.240.27, user: root, password: pwd}
- {name: k8s-etcd-240.28, address: 10.5.240.28, internalAddress: 10.5.240.28, user: root, password: pwd}
- {name: k8s-worker-240.29, address: 10.5.240.29, internalAddress: 10.5.240.29, user: root, password: pwd}
- {name: k8s-worker-240.30, address: 10.5.240.30, internalAddress: 10.5.240.30, user: root, password: pwd}
roleGroups:
## 分配虚拟机角色
etcd:
- k8s-etcd-240.26
- k8s-etcd-240.27
- k8s-etcd-240.28
master:
- k8s-master-240.23
- k8s-master-240.24
- k8s-master-240.25
worker:
- k8s-worker-240.29
- k8s-worker-240.30
controlPlaneEndpoint:
## 高可用
internalLoadbalancer: haproxy
domain: lb.kubesphere.local
## 地址需要修改
address: "10.255.240.23"
port: 6443
kubernetes:
version: v1.18.6
imageRepo: kubesphere
clusterName: cluster.local
network:
plugin: calico
kubePodsCIDR: 10.233.64.0/18
kubeServiceCIDR: 10.233.0.0/18
registry:
registryMirrors: []
insecureRegistries: []
addons: []
---
apiVersion: installer.kubesphere.io/v1alpha1
kind: ClusterConfiguration
metadata:
name: ks-installer
namespace: kubesphere-system
labels:
version: v3.1.0
spec:
persistence:
storageClass: ""
authentication:
jwtSecret: ""
zone: ""
local_registry: ""
etcd:
monitoring: false
endpointIps: localhost
port: 2379
tlsEnable: true
common:
redis:
enabled: false
redisVolumSize: 2Gi
openldap:
enabled: false
openldapVolumeSize: 2Gi
minioVolumeSize: 20Gi
monitoring:
endpoint: http://prometheus-operated.kubesphere-monitoring-system.svc:9090
es:
elasticsearchMasterVolumeSize: 4Gi
elasticsearchDataVolumeSize: 20Gi
logMaxAge: 7
elkPrefix: logstash
basicAuth:
enabled: false
username: ""
password: ""
externalElasticsearchUrl: ""
externalElasticsearchPort: ""
console:
enableMultiLogin: true
port: 30880
alerting:
enabled: false
# thanosruler:
# replicas: 1
# resources: {}
auditing:
enabled: false
devops:
enabled: false
jenkinsMemoryLim: 2Gi
jenkinsMemoryReq: 1500Mi
jenkinsVolumeSize: 8Gi
jenkinsJavaOpts_Xms: 512m
jenkinsJavaOpts_Xmx: 512m
jenkinsJavaOpts_MaxRAM: 2g
events:
enabled: false
ruler:
enabled: true
replicas: 2
logging:
enabled: false
logsidecar:
enabled: true
replicas: 2
metrics_server:
enabled: false
monitoring:
storageClass: ""
prometheusMemoryRequest: 400Mi
prometheusVolumeSize: 20Gi
multicluster:
clusterRole: none
network:
networkpolicy:
enabled: false
ippool:
type: none
topology:
type: none
notification:
enabled: false
openpitrix:
store:
enabled: false
servicemesh:
enabled: false
kubeedge:
enabled: false
cloudCore:
nodeSelector: {"node-role.kubernetes.io/worker": ""}
tolerations: []
cloudhubPort: "10000"
cloudhubQuicPort: "10001"
cloudhubHttpsPort: "10002"
cloudstreamPort: "10003"
tunnelPort: "10004"
cloudHub:
advertiseAddress:
- ""
nodeLimit: "100"
service:
cloudhubNodePort: "30000"
cloudhubQuicNodePort: "30001"
cloudhubHttpsNodePort: "30002"
cloudstreamNodePort: "30003"
tunnelNodePort: "30004"
edgeWatcher:
nodeSelector: {"node-role.kubernetes.io/worker": ""}
tolerations: []
edgeWatcherAgent:
nodeSelector: {"node-role.kubernetes.io/worker": ""}
tolerations: []

参考

Kubernetes核心架构与高可用集群详解(含100%部署成功的方案)

kk多节点安装

k8s-快速入门

相关参数

QPS(Queries Per Second/吞吐量):每秒能够响应的查询次数,也即是最大吞吐能力(吞吐量)。

TPS(Transactions Per Second):每秒处理的事务数目。一个事务是指一个客户端向服务器发送请求然后服务器做出反应的过程。TPS 的过程包括:客户端请求服务端、服务端内部处理、服务端返回客户端。

例如:访问一个页面会请求服务器 3 次,那么访问这一个页面就会产生一个TPS,三个QPS。

参考

JMeter之Ramp-up Period(in seconds)说明

基础名词

  • 节点/node:一个节点是一个运行Kubernetes 中的主机。
  • 容器组/pod:一个 Pod 对应于由若干容器组成的一个容器组,同个组内的容器共享一个存储卷(volume)。
  • 服务/services:一个 Kubernetes 服务是容器组逻辑的高级抽象,同时也对外提供访问容器组的策略。
  • 容器组生命周期/pos-states:包含所有容器状态集合,包括容器组状态类型,容器组生命周期,事件,重启策略,以及 replication controllers。

基础命令

1
2
3
4
5
6
7
8
9
10
#创建部署
kubectl create deployment test --image=nginx:latest
#获取部署信息
kubectl get deployments
#获取集群节点
kubectl get nodes
#获取容器组
kubectl get pods --all-namespaces
#获取服务
kubectl get service --all-namespaces