k8s1.23.15版本二进制部署/扩容及高可用架构详解

Posted Echo&.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s1.23.15版本二进制部署/扩容及高可用架构详解相关的知识,希望对你有一定的参考价值。

前言

    众所周知,kubernetes在2020年的1.20版本时就提出要移除docker。这次官方消息表明在1.24版本中彻底移除了dockershim,即移除docker。但是在1.24之前的版本中还是可以正常使用docker的。考虑到可能并不是所有项目环境都紧跟新版换掉了docker,本次就再最后体验一下可支持docker的最新k8s版本1.23.15,后续可能就研究怎么使用其他CRI,例如containerd了。

一、部署介绍及规划:

本次部署各组件版本:

顺便简单过一下组件作用

  • etcd: 3.5.6        负责存储集群的持久化数据
  • k8s-server: 1.23.15(所有基础组件版本)
    • kube-apiserver:核心枢纽,提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
    • kube-controller-manager:集群的管理控制中心,负责维护集群状态
    • kube-scheduler:调度中心,负责节点资源管理,调度创建pod等
    • kube-proxy:网络代理,负责为Service提供cluster内部的服务发现和负载均衡
    • kubelet:负责维护pod生命周期
    • kubctl:管理集群命令
    • ……

明确目标:

部署: 快速部署三节点单master集群;
扩容: 新增一个节点,扩为双master集群,部署keepalived+nginx实现apiserver高可用,有条件的可以扩为三master集群

本次测试节点信息:

主机名(角色)IP地址节点规划
k8s-master1192.168.100.101etcd、kube-apiserver、kube-controller-manager、kube-proxy、kubelet、nginx、keepalived
k8s-node1192.168.100.102etcd、kube-proxy、kubelet
k8s-node2192.168.100.103etcd、kube-proxy、kubelet
k8s-master2(待扩容机器)192.168.100.104kube-apiserver、kube-controller-manager、kube-proxy、kubelet、nginx、keepalived
VIP(负载均衡器)192.168.100.105

服务器版本:

[root@k8s-master1 ~]# cat /etc/centos-release
CentOS Linux release 7.8.2003 (Core)
[root@k8s-master1 ~]# uname -a
Linux k8s-master1 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

二、部署前准备

(所有节点均操作)

系统初始化

为了方便二次执行,直接全部复制,改了IP执行就可

# 1、关闭防火墙和selinux
sed -i  "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld

# 2、配置hosts解析
cat >> /etc/hosts << EOF
192.168.100.101  k8s-master1
192.168.100.102  k8s-node1
192.168.100.103  k8s-node2
192.168.100.104  k8s-master2
EOF

# 3、关闭swap分区(避免有性能等其他问题)
swapoff -a  #临时关闭
sed -i "s/^.*swap*/#&/" /etc/fstab   #永久关闭
mount -a

# 4、将桥接的IPV4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF 
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1 
EOF
modprobe br_netfilter   #载入模块
sysctl -p /etc/sysctl.d/k8s.conf  #生效

# 5、配置ntp
yum -y install ntp vim wget
sed -i "s/^[^#].*iburst*/#&/g" /etc/ntp.conf   #注释原有server配置
sed -i "/server 3/a\\server ntp.aliyun.com" /etc/ntp.conf   #添加阿里云ntpserver
systemctl restart ntpd
systemctl enable ntpd
ntpq -p

拓展内容(可忽略,直接跳到第三步)

1、上边初始化时net.bridge.bridge-nf-call-ip6tables参数说明

为什么要开启 net.bridge.bridge-nf-call-ip6tables 配置(启用iptables过滤bridge网桥流量)
简述:
网桥是处于二层,iptables工作于三层

  • 1、集群内一pod访问其他的service ip,会经过三层iptables的DNAT转发到pod_ip:port
  • 2、当不开启此配置,当被访pod回复请求时,如果发现目标是在同一个节点,即同一网桥时,会直接走网桥到源pod,这样虽然能到源pod,但是由于没有原路返回,客户端与服务端的通信就不在一个 “频道” 上,不认为处在同一个连接,也就无法正常通信。

常见的问题现象就是偶现DNS解析失败,当 coredns 所在节点上的 pod 解析 dns 时,dns 请求落到当前节点的 coredns pod 上时,就可能发生这个问题。
感兴趣可以看详细说明:为什么 kubernetes 环境要求开启 bridge-nf-call-iptables ? - 腾讯云开发者社区-腾讯云 (tencent.com)
官方解读看这里:Network Plugins | Kubernetes

2、简单了解下TLS证书

    因为k8s集群需要PKI证书来基于TLS/SSL来做认证,组件之间的通信都是通过证书来完成,可以理解为“口令”,组件通信时验证证书无误后,才会建立联系,交互信息,所以证书在部署及环境使用过程中也是比较重要的一项。

基础概念
  • CA(Certification Authority):认证机构:负责颁发证书的权威机构(发送与接收组件双方之间的信任纽带)
  • CSR(Certificate Signing Request):它是向CA机构申请数字签名证书时使用的请求文件

请求中会附上公钥信息以及国家,城市,域名,Email等信息,准备好CSR文件后就可以提交给CA机构,等待他们给我们签名,签好名后我们会收到crt文件,即证书。

证书:

CA机构对申请者的身份验证成功后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机 构的公章)后形成的一个数字文件。实际上,数字证书就是经过CA认证过的公钥,除了公钥,还有其他的信息,比如Email,国家,城市,域名等。

证书的编码格式:
  • PEM(Privacy Enhanced Mail):通常用于数字证书认证机构CA,扩展名为.pem, .crt, .cer, 和.key。内容为Base64编码的ASCII码文件,有类似"-----BEGIN CERTIFICATE-----" 和 "-----END CERTIFICATE-----"的头尾标记
  • DER(Distinguished Encoding Rules):与PEM不同之处在于其使用二进制而不是Base64编码的ASCII。扩展名为.der或者.cer
公钥私钥:
  • 每个人都有一个公钥与私钥
  • 私钥用来进行解密和签名,是给自己用的。
  • 公钥由本人公开,用于加密和验证签名,是给别人用的。
  • 当该用户发送文件时,用私钥签名,别人用他给的公钥解密,可以保证该信息是由他发送的。即数字签名。
  • 当该用户接受文件时,别人用他的公钥加密,他用私钥解密,可以保证该信息只能由他看到。即安全传输。
简述CA原理

CA的产生,是因为多个组件之间通信时,需要加一第三方来判断数据来源是否合规,保证通信的安全性。
引入一个看到的比较好的例子,用介绍信来介绍原理

普通的介绍信

假设 A 公司的张三先生要到 B 公司去拜访,但是 B 公司的所有人都不认识他,常用的办法是带公司开的一张介绍信,在信中说:兹有张三先生前往贵公司办理业务,请给予接洽…云云。然后在信上敲上A公司的公章。

张三先生到了 B 公司后,把介绍信递给 B 公司的前台李四小姐。李小姐一看介绍信上有 A 公司的公章,而且 A 公司是经常和 B 公司有业务往来的,这位李小姐就相信张先生不是歹人了。

这里,A公司就是CA机构,介绍信及颁发给张三的证书

引入中介权威机构的介绍信

如果和 B 公司有业务往来的公司很多,每个公司的公章都不同,那前台就要懂得分辨各种公章,非常麻烦。
所以,有C公司专门开设了一项“代理公章”的业务。
 今后,A 公司的业务员去 B 公司,需要带2个介绍信:
  介绍信1
  含有 C 公司的公章及 A 公司的公章。并且特地注明:C 公司信任 A 公司。
  介绍信2
  仅含有 A 公司的公章,然后写上:兹有张三先生前往贵公司办理业务,请给予接洽…云云。
主要的好处在于: 对于B公司而言,就不需要记住各个公司的公章分别是什么;他只需要记住中介公司 C 的公章即可。当他拿到两份介绍信之后,先对介绍信1的 C 公章,验明正身;确认无误之后,再比对介绍信1和介绍信2的两个 A 公章是否一致。如果是一样的,那就可以证明介绍信2,即A公司是可以信任的了。

最后直白一点,其实我们的身份证一定程度上也相当于是颁发给我们的证书~

本次集群内部署使用的为自签的CA证书

三、开始部署

1、etcd集群部署

      Etcd 是 CoreOS 推出的高可用的分布式键值存储系统,内部采用 raft 协议作为一致性算法,主要用于k8s集群的服务发现及存储集群的状态和配置等,所以先部署ETCD数据库。
      本次使用三台组建集群(集群模式最少三节点),与k8s集群复用三台节点(k8s-master1、k8s-node1、k8s-node2),也可以放在集群之外,网络互通即可。

三节点,可容忍一个节点故障;
五节点,可容忍两个节点故障

1.1、使用cfssl工具配置证书 (重点)

CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。
是一个开源的证书管理工具,使用json文件生成证书,相比openssl更方便使用。
详细的不多说,直接开始(master1节点操作)

如果下载不下来,可以点这里下载,为本次文章使用的所有软件包,官方拉取纯净版

# 下载工具包
mkdir /opt/software && cd /opt/software
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl_1.6.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssljson_1.6.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl-certinfo_1.6.0_linux_amd64
# 复制到/usr/local/bin目录,并赋予执行权限
cp cfssl_1.6.0_linux_amd64 /usr/local/bin/cfssl
cp cfssljson_1.6.0_linux_amd64 /usr/local/bin/cfssljson
cp cfssl-certinfo_1.6.0_linux_amd64 /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl*

1.2、创建给etcd使用的自签证书颁发机构(CA)

1.2.1、创建工作目录
mkdir -p ~/TLS/etcd,k8s && cd ~/TLS/etcd
1.2.2、配置证书生成策略,让CA软件知道颁发有什么功能的证书
cat > ca-config.json << EOF

  "signing": 
    "default": 
      "expiry": "87600h"
    ,
    "profiles": 
      "etcd": 
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      
    
  

EOF

可用参数介绍:
这个策略,有一个default默认的配置,和一个profiles,profiles可以设置多个profile,这里的profile是etcd。

  • default:默认策略,指定了证书的默认有效期是一年(8760h)
  • etcd:表示该配置(profile)的用途是为etcd生成证书及相关的校验工作
    • expiry:也表示过期时间,如果不写以default中的为准
    • signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE
    • key encipherment:密钥加密
    • server auth:表示可以该CA 对 server 提供的证书进行验证
    • client auth:表示可以用该 CA 对 client 提供的证书进行验证
1.2.3、创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件
cat > ca-csr.json << EOF

    "CN": "etcd CA",
    "key": 
        "algo": "rsa",
        "size": 2048
    ,
    "names": [
        
            "C": "CN",
            "L": "ShangHai",
            "ST": "ShangHai"
        
    ]

EOF

可用参数介绍:

  • CN:Common Name,CA名字
  • key:生成证书的算法
  • hosts:表示哪些主机名(域名)或者IP可以使用此csr申请证书,为空或者""表示所有的都可以使用
  • names:一些其它的属性
    • C:Country, 国家
    • ST:State,州或者是省份
    • L:Locality Name,地区,城市
    • O:Organization Name,组织名称,公司名称(在k8s中常用于指定Group,进行RBAC绑定)
    • OU:Organization Unit Name,组织单位名称,公司部门
1.2.4、生成自签CA证书
[root@k8s-master1 etcd]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
2022/11/29 01:42:38 [INFO] generating a new CA key and certificate from CSR
2022/11/29 01:42:38 [INFO] generate received request
2022/11/29 01:42:38 [INFO] received CSR
2022/11/29 01:42:38 [INFO] generating key: rsa-2048
2022/11/29 01:42:38 [INFO] encoded CSR
2022/11/29 01:42:38 [INFO] signed certificate with serial number 679003178885428426540893262351942198069353062273

# 当前目录下会生成 ca.pem和ca-key.pem文件
[root@k8s-master1 etcd]# ls
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem

1.3、使用自签CA签发etcd证书

1.3.1、配置etcd请求证书申请文件
cat > server-csr.json << EOF

    "CN": "etcd",
    "hosts": [
    "192.168.100.101",
    "192.168.100.102",
    "192.168.100.103"

    ],
    "key": 
        "algo": "rsa",
        "size": 2048
    ,
    "names": [
        
            "C": "CN",
            "L": "ShangHai",
            "ST": "ShangHai"
        
    ]

EOF

注:hosts项中ip为etcd集群内部通信的ip,如果后续etcd集群有扩容需求,那么在hosts项里可以预留几个IP

1.3.2、生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd server-csr.json | cfssljson -bare server
# 查看
[root@k8s-master1 etcd]# ls
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem  server.csr  server-csr.json  server-key.pem  server.pem

1.4、部署etcd

先在master1节点操作,后边把配置拷贝到另外两个节点修改启动etcd即可

# 下载二进制包
cd /opt/software
wget https://github.com/etcd-io/etcd/releases/download/v3.5.6/etcd-v3.5.6-linux-amd64.tar.gz

# 创建工作目录
mkdir -p /opt/etcd/bin,cfg,ssl
tar -zxvf etcd-v3.5.6-linux-amd64.tar.gz
cp etcd-v3.5.6-linux-amd64/etcd,etcdctl /opt/etcd/bin/

# 拷贝证书至工作目录
cp ~/TLS/etcd/*.pem /opt/etcd/ssl/

# 添加etcd配置
cat > /opt/etcd/cfg/etcd.conf << EOF
#[Member]
ETCD_NAME="etcd-1"
ETCD_DATA_DIR="/home/data/"
ETCD_LISTEN_PEER_URLS="https://192.168.100.101:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.100.101:2379"
 
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.100.101:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.100.101:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.100.101:2380,etcd-2=https://192.168.100.102:2380,etcd-3=https://192.168.100.103:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF

配置介绍:

  • ETCD_NAME: 节点名称,集群中唯一
  • ETCD_DATA_DIR:数据存放目录
  • ETCD_LISTEN_PEER_URLS:集群通讯监听地址
  • ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址
  • ETCD_INITIAL_CLUSTER:集群节点地址
  • ETCD_INITIALCLUSTER_TOKEN:集群Token
  • ETCD_INITIALCLUSTER_STATE:加入集群的状态:new是新集群,existing表示加入已有集群
1.4.1、使用systemd管理etcd
cat > /usr/lib/systemd/system/etcd.service << EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
 
[Service]
Type=notify
EnvironmentFile=/opt/etcd/cfg/etcd.conf
ExecStart=/opt/etcd/bin/etcd \\
--cert-file=/opt/etcd/ssl/server.pem \\
--key-file=/opt/etcd/ssl/server-key.pem \\
--peer-cert-file=/opt/etcd/ssl/server.pem \\
--peer-key-file=/opt/etcd/ssl/server-key.pem \\
--trusted-ca-file=/opt/etcd/ssl/ca.pem \\
--peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \\
--logger=zap
Restart=on-failure
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target
EOF
1.4.2、拷贝配置到另外两个节点
scp -r /opt/etcd/ 192.168.100.102:/opt/
scp -r /opt/etcd/ 192.168.100.103:/opt/
scp /usr/lib/systemd/system/etcd.service 192.168.100.102:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service 192.168.100.103:/usr/lib/systemd/system/
1.4.3、修改另外两个节点中的etcd配置
#[Member]
ETCD_NAME="etcd-1"    # 节点名称,可改为etcd-2和etcd-3
ETCD_DATA_DIR="/home/data/"   # 自定义数据目录
ETCD_LISTEN_PEER_URLS="https://192.168.100.101:2380"    #改为当前节点IP
ETCD_LISTEN_CLIENT_URLS="https://192.168.100.101:2379"    #改为当前节点IP

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.100.101:2380"    #改为当前节点IP
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.100.101:2379"    #改为当前节点IP
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.100.101:2380,etcd-2=https://192.168.100.102:2380,etcd-3=https://192.168.100.103:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
1.4.4、启动etcd

需要注意的是三台节点的etcd服务需要同时启动,就三台机器,命令行工具多窗口执行即可

systemctl daemon-reload
systemctl start etcd
systemctl enable etcd
systemctl status etcd


# 查看集群节点状态如下即正常(记得修改命令中endpoint的IP为自己的IP)
[root@k8s-master1 software]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.100.101:2379,https://192.168.100.102:2379,https://192.168.100.103:2379" endpoint health --write-out=table
+------------------------------+--------+-------------+-------+
|           ENDPOINT           | HEALTH |    TOOK     | ERROR |
+------------------------------+--------+-------------+-------+
| https://192.168.100.101:2379 |   true | 24.422088ms |       |
| https://192.168.100.102:2379 |   true | 23.776321ms |       |
| https://192.168.100.103:2379 |   true | 24.170148ms |       |
+------------------------------+--------+-------------+-------+

2、安装docker

所有节点都操作

# 安装
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce-20.10.21

# 启动
systemctl start docker
systemctl enable docker

# 修改docker数据目录(可选操作)
cat > /etc/docker/daemon.json << EOF

   "data-root": "/home/docker"

EOF

# 重启
systemctl restart docker

3、部署master节点

3.1、部署kube-apiver

3.1.1、生成kube-apiserver证书

自签CA证书(这个和上边那个etcd的CA区分开,单独给k8s使用的CA)

cd ~/TLS/k8s

# 添加CA配置
cat > ca-config.json << EOF

  "signing": 
    "default": 
      "expiry": "87600h"
    ,
    "profiles": 
      "kubernetes": 
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      
    
  

EOF
cat > ca-csr.json << EOF

    "CN": "kubernetes",
    "key": 
        "algo": "rsa",
        "size": 2048
    ,
    "names": [
        
            "C": "CN",
            "L": "ShangHai",
            "ST": "ShangHai",
            "O": "k8s",
            "OU": "System"
        
    ]

EOF
# 生成证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

使用自签CA签发kube-apiserver的证书

hosts里要写入集群内的所有节点IP,包括后续要用的负载均衡VIP的IP,如果有扩容需求,可以预留几个IP

cat > apiserver-csr.json << EOF

    "CN": "kubernetes",
    "hosts": [
      "10.0.0.1",
      "127.0.0.1",
      "192.168.100.101",
      "192.168.100.102",
      "192.168.100.103",
      "192.168.100.104",
      "192.168.100.105",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": 
        "algo": "rsa",
        "size": 2048
    ,
    "names": [
        
            "C": "CN",
            "L": "ShangHai",
            "ST": "ShangHai",
            "O": "k8s",
            "OU": "System"
        
    ]

EOF
# 生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver
3.1.2、下载二进制包,调整配置

官方地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md#downloads-for-v12315

如果下载不下来,可以点这里下载,为本次文章使用的所有软件包,官方拉取纯净版

# 下载/配置
cd /opt/software
wget https://dl.k8s.io/v1.23.15/kubernetes-server-linux-amd64.tar.gz
tar zxvf kubernetes-server-linux-amd64.tar.gz
mkdir -p /opt/kubernetes/bin,cfg,ssl,logs 
cd kubernetes/server/bin
cp kube-apiserver kube-scheduler kube-controller-manager kubectl kubelet kube-proxy /opt/kubernetes/bin
cp kubectl /usr/bin

创建配置文件

两个\\必须要啊。第一个是转义符,使用转义符是为了使用EOF保留换行符;第二个是换行符,不然就跑一行去了
好像不加换行符服务启动识别有点问题

cat > /opt/kubernetes/cfg/kube-apiserver.conf << EOF
KUBE_APISERVER_OPTS="--logtostderr=false \\\\
--v=2 \\\\
--log-dir=/opt/kubernetes/logs \\\\
--etcd-servers=https://192.168.100.101:2379,https://192.168.100.102:2379,https://192.168.100.103:2379 \\\\
--bind-address=192.168.100.101 \\\\
--secure-port=6443 \\\\
--advertise-address=192.168.100.101 \\\\
--allow-privileged=true \\\\
--service-cluster-ip-range=10.0.0.0/16 \\\\
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\\\
--authorization-mode=RBAC,Node \\\\
--enable-bootstrap-token-auth=true \\\\
--token-auth-file=/opt/kubernetes/cfg/token.csv \\\\
--service-node-port-range=30000-32767 \\\\
--kubelet-client-certificate=/opt/kubernetes/ssl/apiserver.pem \\\\
--kubelet-client-key=/opt/kubernetes/ssl/apiserver-key.pem \\\\
--tls-cert-file=/opt/kubernetes/ssl/apiserver.pem  \\\\
--tls-private-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\\\
--client-ca-file=/opt/kubernetes/ssl/ca.pem \\\\
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\\\
--service-account-issuer=https://kubernetes.default.svc.cluster.local \\\\
--service-account-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \\\\
--etcd-cafile=/opt/etcd/ssl/ca.pem \\\\
--etcd-certfile=/opt/etcd/ssl/server.pem \\\\
--etcd-keyfile=/opt/etcd/ssl/server-key.pem \\\\
--requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \\\\
--proxy-client-cert-file=/opt/kubernetes/ssl/apiserver.pem \\\\
--proxy-client-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\\\
--requestheader-allowed-names=kubernetes \\\\
--requestheader-extra-headers-prefix=X-Remote-Extra- \\\\
--requestheader-group-headers=X-Remote-Group \\\\
--requestheader-username-headers=X-Remote-User \\\\
--enable-aggregator-routing=true \\\\
--audit-log-maxage=30 \\\\
--audit-log-maxbackup=3 \\\\
--audit-log-maxsize=100 \\\\
--audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
EOF

配置介绍:

  • –logtostderr :启用日志(true为输出到标准输出,false为输出到日志文件里)
  • –v :日志等级
  • –log-dir :日志目录
  • –etcd-servers :etcd集群地址
  • –bind-address :监听地址
  • –secure-port :https安全端口
  • –advertise-address :集群通告地址
  • –allow-privileged :启动授权
  • –service-cluster-ip-range :Service虚拟IP地址段,这里掩码给16位,可以创建(2的16次方-2)=65534个地址
  • –enable-admission-plugins : 准入控制模块
  • –authorization-mode :认证授权,启用RBAC授权和节点自管理
  • –enable-bootstrap-token-auth :启用TLS bootstrap机制
  • –token-auth-file :bootstrap token文件
  • –service-node-port-range :Service nodeport类型默认分配端口范围
  • –kubelet-client-xxx :apiserver访问kubelet客户端证书
  • –tls-xxx-file :apiserver https证书
  • –service-account-issuer:此参数可作为服务账号令牌发放者的身份标识(Identifier)详细可参考官方解析阿里云解析
  • –service-account-signing-key-file:指向包含当前服务账号令牌发放者的私钥的文件路径
  • –etcd-xxxfile :连接etcd集群证书
  • –requestheader-client-ca-file,–proxy-client-cert-file,–proxy-client-key-file,–requestheader-allowed-names,–requestheader-extra-headers-prefix,–requestheader-group-headers,–requestheader-username-headers,–enable-aggregator-routing:启动聚合层网关配置
  • –audit-log-xxx :审计日志

更多参数可查看官方介绍

拷贝生成证书到工作目录

cp ~/TLS/k8s/*.pem /opt/kubernetes/ssl/
3.1.3、启用TLS bootstrapping机制

当集群开启了 TLS 认证后,每个节点的 kubelet 组件都要使用由 apiserver 使用的 CA 签发的有效证书才能与 apiserver 通讯,此时如果节点多起来,为每个节点单独签署证书将是一件非常繁琐的事情;TLS bootstrapping 功能就是让 kubelet 先使用一个预定的低权限用户连接到 apiserver,然后向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署
详细内容见官方说明
工作流程:

创建令牌认证文件

# 生成随机数
[root@k8s-master1 cfg]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
a2dfd3748230d54213367c6dcb63efde

# 将生成的数创建token文件(将上边生成的数替换第一个值)
cat > /opt/kubernetes/cfg/token.csv << EOF
a2dfd3748230d54213367c6dcb63efde,kubelet-bootstrap,10001,"system:node-bootstrapper"
EOF
3.1.4、配置systemd管理服务
cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
 
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf
ExecStart=/opt/kubernetes/bin/kube-apiserver \\$KUBE_APISERVER_OPTS
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
EOF

启动服务

systemctl daemon-reload
systemctl start kube-apiserver 
systemctl enable kube-apiserver
systemctl status kube-apiserver

小提示:
启动会报下边这俩错,忽略就行,这个是说这俩参数准备弃用了,但是现在还能用(就跟前几年说移除docker一样)

FlagFlag --logtostderr has been deprecated, will be removed in a future release, see https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/2845-deprecate-klog-specific-flags-in-k8s-components
Flag --log-dir has been deprecated, will be removed in a future release, see https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/2845-deprecate-klog-specific-flags-in-k8s-components

3.2、部署kube-controller-manager

3.2.1、生成证书
cd ~/TLS/k8s
# 创建证书请求文件
cat > kube-controller-manager-csr.json << EOF

  "CN": "system:kube-controller-manager",
  "hosts": [],
  "key": 
    "algo": "rsa",
    "size": 2048
  ,
  "names": [
    
      "C": "CN",
      "L": "ShangHai", 
      "ST": "ShangHai",
      "O": "system:masters",
      "OU": "System"
    
  ]

05.Nacos集群搭建及高可用方案

前言

集群架构图

首先我们来看一下官网的集群架构图,如下:

DNS:域名地址(防止因ip或者端口号变化而无法访问)

SLB:是负载均衡,这里我们会使用Nginx实现Nacos集群的负载均衡

集群规划

按照集群节点设置为奇数的原则,我们的Nacos集群规划三个节点Nacos01(192.168.8.190:8845)Nacos01(192.168.8.190:8846)Nacos01(192.168.8.190:8847);最后配置一台Nginx服务器Nginx(192.168.8.199)

问:为什么集群的个数建议设置为奇数个?

1:通常在集群中要求可用节点数量 > 集群总节点数量/2 ;如果是偶数个的话,当master节点宕机在各个子节点不可通信的情况下会形成若干小集群,每个小集群会选出自己的master,这就会导致脑裂的出现。

2:在容错能力相同的情况下,奇数台更节省资源。比如在遵循第一条规则的前提下,如集群节点为三个,则只允许一台机器宕机;集群节点为4个,同样只允许一台机器宕机;

集群搭建

准备工作

Nginx服务器

按照上述的集群规划,我们参照文章Nginx系列之一扫盲篇搭建我们的Nginx服务器,搭建完毕后我们在浏览器中访问http://192.168.8.199:80(80是Nginx默认端口号,可以不写),如果出现以下欢迎界面则说明我们的Nginx服务器搭建成功。如下图:

Nacos服务器

Nacos是比较占用内存的(通常一个节点占用内存大于1个G),由于我们上面的三个节点在同一台服务器,所以我们要将Nacos的服务器内存调到3G以上,这里我们调整为5G。如下图所示:

如果宿主机内存在8G以下的童鞋建议不要将三个节点放在同一台服务器

清除数据

进群中的三个nacos节点我们通过复制nacos而来,但是集群搭建要求不能有原始数据,所以我们要将nacos和mysql中的数据清空

首先我们关闭nacos服务进入到nacos目录,执行命令rm -rf data删除data目录

然后我们通过SQLyog连接MySQL5.7服务器中的nacos数据库,将数据库清空,重新导入nacos-mysql.mysql,如下图:

集群搭建

1.拷贝nacos01

我们进入到目录/usr/tools中执行命令cp -rf nacos nacos01复制出nacos01,如下图

2.修改nacos01端口号

进入到目录nacos/conf下,执行命令vim application.properties,修改端口号为8845,如下图:

3.添加集群节点

在上面conf目录中我们看到了文件cluster.conf.example,这个就是集群配置的模板文件,我们执行命令cp cluster.conf.example cluster.conf拷贝并重新命名,如下图:

然后我们执行命令vim cluster.conf编辑该配置文件,在该文件中添加以下配置:

192.168.8.190:8845
192.168.8.190:8846
192.168.8.190:8847


单个节点的所有配置就是这样了,后面的节点nacos02和nacos03只要拷贝nacos01然后改下端口号就可以了

4.拷贝nacos02、nacos03

回到/usr/tools目录依次执行命令cp -rf nacos01 nacos02cp -rf nacos01 nacos03,然后依次修改这两个节点的端口号为88468847

5.Nginx负载均衡

我们进入到Nginx服务器的/usr/tools/nginx/conf目录,我们可以看到有个文件nginx.conf,如下图:

执行命令vim nginx.conf,添加upstream、注释掉原先的location,新增如下内容保存后退出:

upstream  nacos-servers { 
	server 192.168.8.190:8845;
	server 192.168.8.190:8846;
	server 192.168.8.190:8847;
}
         
#location / {
#    root   html;
#    index  index.html index.htm;
#}
         
location / {
	proxy_pass http://nacos-servers/;
}


最后执行命令nginx -s reload重新启动nginx

测试

启动集群

我们依次启动nacos01、nacos02和nacos03,然后浏览器依次访问http://192.168.8.190:8445/nacoshttp://192.168.8.190:8446/nacoshttp://192.168.8.190:8447/nacos。如下图所示:

nacos client

1.application.properties

我们打开项目01.springcloud_alibaba_nacos_clientapplication.properties文件,修改spring.cloud.nacos.server-addr的地址为Nginx的地址,如下

server.port=8800
# 代表微服务服务名  唯一  推荐 大写
spring.application.name=NACOSCLIENT

# nacos server 的地址修改为Nginx的地址
spring.cloud.nacos.server-addr=192.168.8.199:80
# 作为nacos client注册地址
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
# 指定向nacos server注册服务名称
spring.cloud.nacos.discovery.service=${spring.application.name}
2.启动client

​ 我们启动client,如下图:

此时我们分别访问三个nacos,可以看到每个nacos的服务列表中都已经注册了我们的client,这也说明我们的集群搭建是成功的。如下图

以上是关于k8s1.23.15版本二进制部署/扩容及高可用架构详解的主要内容,如果未能解决你的问题,请参考以下文章

05.Nacos集群搭建及高可用方案

生产环境二进制k8s集群扩容node节点的实践

使用二进制的方式部署 K8S-1.16 高可用集群(二十)

二进制部署K8s集群进阶使用之第4节pod控制器

k8s的1.15.1高可用版本(Centos:7.9)

ansible + kubeasz 二进制部署K8S高可用集群方案