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

2023-11-06

前言

    众所周知,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-master1 192.168.100.101 etcd、kube-apiserver、kube-controller-manager、kube-proxy、kubelet、nginx、keepalived
k8s-node1 192.168.100.102 etcd、kube-proxy、kubelet
k8s-node2 192.168.100.103 etcd、kube-proxy、kubelet
k8s-master2(待扩容机器) 192.168.100.104 kube-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"
    }
  ]
}
EOF
 
# 生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
3.2.2、生成kubeconfig文件 (重点)

该文件存放一些集群组件之间交互的认证信息,用于集群组件访问apiserver,操作分为四步
前三步都会往配置文件里写入一些内容,可以每歩执行前后对照着内容看看
A.生成kubeconfig文件,设置集群参数

# 配置个临时变量
KUBE_CONFIG="/opt/kubernetes/cfg/kube-controller-manager.kubeconfig"
KUBE_APISERVER="https://192.168.100.101:6443"
 
kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=${KUBE_CONFIG}

配置介绍:

  • set-cluster:设置集群的名字(这里设置为kubernetes)
  • –certificate-authority:集群的CA证书
  • –embed-certs:将ca.pem证书内容嵌入到生成的 kubectl.kubeconfig 文件中(不加时,写入的是证书文件路径)。
  • –server:apiserver地址
  • –kubeconfig:文件名称,这里给controller-manager用,就叫做kube-controller-manager.kubeconfig

该命令执行完会在指定目录下生成一个我们命名的那个叫kube-controller-manager.kubeconfig的文件,文件里只有集群的信息和CA证书内容

B.设置客户端认证参数

kubectl config set-credentials kube-controller-manager \
  --client-certificate=./kube-controller-manager.pem \
  --client-key=./kube-controller-manager-key.pem \
  --embed-certs=true \
  --kubeconfig=${KUBE_CONFIG}

配置介绍:

  • set-credentials:设置客户端名字,这里用连接apiserver的组件名称
  • –client-certificate:客户端的证书文件,apiserver用来做验证
  • –client-key:也是客户端证书,key文件

上边这两歩,就相当于之前说的范例里A公司和中介C公司的介绍信内容内嵌在这个配置文件中,去拜访B公司时候使用

C.设置上下文参数

kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-controller-manager \
  --kubeconfig=${KUBE_CONFIG}

配置介绍:

  • set-context:设置上下文,设置配置文件中的contexts项,后边跟上下文名称,这里设置为default(多用于操作多个k8s集群时区分当前是在哪个上下文,即哪个集群里操作的)
  • –cluster:集群名称,要和上边第一步的名称完全一致
  • –user:用户名称,要和第二歩的客户端名称完全一致

D.设置当前默认上下文
使用kubeconfig中的一个环境项作为当前配置,官方解读

kubectl config use-context default --kubeconfig=${KUBE_CONFIG}

# 等集群拉起后,可以通过这个命令查看当前所在的是哪个集群的上下文
kubectl config current-context

配置说明:

  • 设置context(上下文)用哪个kubeconfig,这里就是设置default的上下文,使用我们上边配置的kube-controller-manager.kubeconfig
3.2.3、创建controller-manager配置文件
cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--leader-elect=true \\
--kubeconfig=/opt/kubernetes/cfg/kube-controller-manager.kubeconfig \\
--bind-address=127.0.0.1 \\
--allocate-node-cidrs=true \\
--cluster-cidr=10.244.0.0/16 \\
--service-cluster-ip-range=10.0.0.0/24 \\
--cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\
--cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem  \\
--root-ca-file=/opt/kubernetes/ssl/ca.pem \\
--service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--cluster-signing-duration=87600h0m0s"
EOF

配置介绍:

  • –kubeconfig:连接apiserver配置文件。
  • –leader-elect:当该组件启动多个时,自动选举(HA)
  • –cluster-signing-cert-file:自动为kubelet颁发证书的CA
  • –cluster-signing-key-file:自动为kubelet颁发证书的CA
3.2.4、配置systemd管理、启动服务
# 配置systemd管理
cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
 
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kube-controller-manager.conf
ExecStart=/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
EOF

# 启动服务
systemctl daemon-reload
systemctl start kube-controller-manager
systemctl enable kube-controller-manager
systemctl status kube-controller-manager

小提示:
启动会额外有这俩报错,是因为没有配置cloud-provider参数,这个对于内部使用的集群基本用不着

Dec 20 21:34:03 cluster-node1 kube-controller-manager[72926]: E1220 21:34:03.576016 72926 core.go:212] failed to start cloud node lifecycle controller: no cloud provider provided
Dec 20 21:34:03 cluster-node1 kube-controller-manager[72926]: E1220 21:34:03.596638 72926 core.go:92] Failed to start service controller: WARNING: no cloud provider provided, services of type LoadBalancer will fail

3.3、部署kube-scheduler

也是一样的步骤:生成证书、生成kubeconfig文件、创建配置文件、systemd管理及启动服务

3.3.1、生成证书
# 切换工作目录
cd ~/TLS/k8s
 
# 创建证书请求文件
cat > kube-scheduler-csr.json << EOF
{
  "CN": "system:kube-scheduler",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "ShangHai",
      "ST": "ShangHai",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
EOF
 
# 生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler
3.3.2、生成kubeconfig文件
KUBE_CONFIG="/opt/kubernetes/cfg/kube-scheduler.kubeconfig"
KUBE_APISERVER="https://192.168.100.101:6443"
 
kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=${KUBE_CONFIG}
  
kubectl config set-credentials kube-scheduler \
  --client-certificate=./kube-scheduler.pem \
  --client-key=./kube-scheduler-key.pem \
  --embed-certs=true \
  --kubeconfig=${KUBE_CONFIG}
  
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-scheduler \
  --kubeconfig=${KUBE_CONFIG}
  
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
3.3.3、创建服务配置文件
cat > /opt/kubernetes/cfg/kube-scheduler.conf << EOF
KUBE_SCHEDULER_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--leader-elect \\
--kubeconfig=/opt/kubernetes/cfg/kube-scheduler.kubeconfig \\
--bind-address=127.0.0.1"
EOF
3.3.4、配置systemd管理、服务启动
# 配置systemd管理
cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=/opt/kubernetes/cfg/kube-scheduler.conf
ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
EOF

# 启动
systemctl daemon-reload
systemctl start kube-scheduler
systemctl enable kube-scheduler
systemctl status kube-scheduler
3.4、配置kubectl管理集群
3.4.1、配置kubectl证书
cd ~/TLS/k8s
 
cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "ShangHai",
      "ST": "ShangHai",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
EOF
 
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
3.4.2、配置kubectl使用的kubeconfig
mkdir /root/.kube
 
KUBE_CONFIG="/root/.kube/config"
KUBE_APISERVER="https://192.168.100.101:6443"
 
kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=${KUBE_CONFIG}
  
kubectl config set-credentials cluster-admin \
  --client-certificate=./admin.pem \
  --client-key=./admin-key.pem \
  --embed-certs=true \
  --kubeconfig=${KUBE_CONFIG}
  
kubectl config set-context default \
  --cluster=kubernetes \
  --user=cluster-admin \
  --kubeconfig=${KUBE_CONFIG}
  
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
3.4.3、验证

各组件状态正常即可

[root@k8s-master1 k8s]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-2               Healthy   {"health":"true","reason":""}
etcd-0               Healthy   {"health":"true","reason":""}
etcd-1               Healthy   {"health":"true","reason":""}
3.5、部署kubelet

master也是要作为节点存在的,所以也要部署kubelet和kube-proxy

3.5.1、定义kubelet配置参数
cat > /opt/kubernetes/cfg/kubelet-config.yml << EOF
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10.0.0.240
clusterDomain: cluster.local 
failSwapOn: false
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /opt/kubernetes/ssl/ca.pem 
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
evictionHard:
  imagefs.available: 15%
  memory.available: 100Mi
  nodefs.available: 10%
  nodefs.inodesFree: 5%
maxOpenFiles: 1000000
maxPods: 110
EOF

配置说明:
更多配置详情可翻阅官方范例官方参数解读

  • evictionHard:驱逐资源硬限制(当达到下面配置项的阈值后会触发驱逐)
  • imagefs.available:容器运行时镜像存储空间剩余量
  • memory.available:宿主机可用内存
  • nodefs.available:宿主机可用磁盘空间(一般是指根目录)
  • nodefs.inodesFree:宿主机可用inode(df -i可查看总量)
3.5.2、创建配置文件
cat > /opt/kubernetes/cfg/kubelet.conf << EOF
KUBELET_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--hostname-override=k8s-master1 \\
--network-plugin=cni \\
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\
--config=/opt/kubernetes/cfg/kubelet-config.yml \\
--cert-dir=/opt/kubernetes/ssl \\
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
EOF

配置说明:

  • –hostname-override :kubectl get node显示的名称,集群唯一,保持和主机名一致即可(不可重复)
  • –network-plugin:启用CNI(官方解读)
  • –kubeconfig:空路径,会自动生成,后面用于连接apiserver
  • –bootstrap-kubeconfig:首次启动向apiserver申请证书的配置(下一步就是生成这个配置)
  • –config:配置文件参数(上一步配置的参数文件)
  • –cert-dir:kubelet证书目录
  • –pod-infra-container-image :管理Pod网络的pause容器的镜像
3.5.3、生成bootstrap.kubeconfig文件
# 临时变量
KUBE_CONFIG="/opt/kubernetes/cfg/bootstrap.kubeconfig"
KUBE_APISERVER="https://192.168.100.101:6443"
TOKEN="a2dfd3748230d54213367c6dcb63efde" # !!与/opt/kubernetes/cfg/token.csv文件中数据保持一致

# 生成配置
kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=${KUBE_CONFIG}
  
kubectl config set-credentials "kubelet-bootstrap" \
  --token=${TOKEN} \
  --kubeconfig=${KUBE_CONFIG}
  
kubectl config set-context default \
  --cluster=kubernetes \
  --user="kubelet-bootstrap" \
  --kubeconfig=${KUBE_CONFIG}  

kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
3.5.4、授权kubelet-bootstrap用户允许请求证书

    在启动kubelet后,kubelet会自动用上一步的kubeconfig配置去向apiserver申请证书,而配置里的client用户是kubelet-bootstrap,所以要先给该用户一个权限才可以

kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
3.5.5、配置systemd管理、启动服务
cat > /usr/lib/systemd/system/kubelet.service << EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service
 
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf
ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target
EOF

# 启动
systemctl daemon-reload
systemctl start kubelet
systemctl status kubelet
3.5.6、批准kubelet的证书申请
# 查看证书申请csr(certificatesigningrequest),状态为pending等待中
[root@k8s-master1 ~]# kubectl get csr
NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           REQUESTEDDURATION   CONDITION
node-csr-6m-PtPGVEiw089UJ9dnNf3cjbiMdKizuq27umnYdD7I   86s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   <none>              Pending

# 批准kubelet证书申请
[root@k8s-master1 ~]# kubectl certificate approve node-csr-6m-PtPGVEiw089UJ9dnNf3cjbiMdKizuq27umnYdD7I
certificatesigningrequest.certificates.k8s.io/node-csr-6m-PtPGVEiw089UJ9dnNf3cjbiMdKizuq27umnYdD7I approved

# 查看csr状态,状态为Approved,Issued(已批准)
[root@k8s-master1 ~]# kubectl get csr
NAME                                                   AGE     SIGNERNAME                                    REQUESTOR           REQUESTEDDURATION   CONDITION
node-csr-6m-PtPGVEiw089UJ9dnNf3cjbiMdKizuq27umnYdD7I   6m12s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   <none>              Approved,Issued

 # 查看node(cni网络插件还没安装,所以当前还是NotReady状态)
[root@k8s-master1 ~]# kubectl get nodes
NAME          STATUS     ROLES    AGE   VERSION
k8s-master1   NotReady   <none>   39s   v1.23.15
3.6、部署kube-proxy
3.6.1、生成证书
# 切换到工作目录
cd ~/TLS/k8s
 
# 创建证书请求文件
cat > kube-proxy-csr.json << EOF
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "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 kube-proxy-csr.json | cfssljson -bare kube-proxy
3.6.2、生成kubeconfig配置文件
KUBE_CONFIG="/opt/kubernetes/cfg/kube-proxy.kubeconfig"
KUBE_APISERVER="https://192.168.100.101:6443"
 
kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=${KUBE_CONFIG}
  
kubectl config set-credentials kube-proxy \
  --client-certificate=./kube-proxy.pem \
  --client-key=./kube-proxy-key.pem \
  --embed-certs=true \
  --kubeconfig=${KUBE_CONFIG}
  
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-proxy \
  --kubeconfig=${KUBE_CONFIG}
  
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
3.6.3、定义配置参数,指定kubeconfig文件
cat > /opt/kubernetes/cfg/kube-proxy-config.yml << EOF
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
metricsBindAddress: 0.0.0.0:10249
clientConnection:
  kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfig
hostnameOverride: k8s-master1
#mode: "ipvs"

clusterCIDR: 10.244.0.0/16
EOF

单独介绍下mode参数
这个是配置kube-proxy的工作模式,目前用的基本就是这两种,都是基于内核的netfilter实现的:

  • iptables: 默认使用的模式,通过创建一条条iptables规则链来访问集群内service。这种模式pod内ping不通service的IP
  • ipvs: 专门用来做负载均衡的技术,lvs就用的这个。pod可以ping通service的IP

这里就先不展开详细说了,要单独开单章说明。
这里部署就先用默认的iptables模式就可以,在服务量级不大的时候,iptables和ipvs性能差不多

3.6.4、创建配置文件
cat > /opt/kubernetes/cfg/kube-proxy.conf << EOF
KUBE_PROXY_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--config=/opt/kubernetes/cfg/kube-proxy-config.yml"
EOF
3.6.5、配置systemd管理、启动服务
cat > /usr/lib/systemd/system/kube-proxy.service << EOF
[Unit]
Description=Kubernetes Proxy
After=network.target
 
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.conf
ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target
EOF

# 启动服务
systemctl daemon-reload
systemctl start kube-proxy
systemctl enable kube-proxy
systemctl status kube-proxy
3.7、安装cni网络插件

这里选择用calico来作为网络插件使用

calico官网:https://www.tigera.io/project-calico/

查看版本对应关系
官网文档说明里得知,calico-v3.23版本支持k8s的v1.23版本,所以这里就选择安装v3.23版本好了
在这里插入图片描述

3.7.1、拉取配置

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

mkdir /opt/kubernetes/calico && cd /opt/kubernetes/calico

# 下载官方yaml文件
curl https://projectcalico.docs.tigera.io/archive/v3.23/manifests/calico.yaml -O
3.7.2、根据环境修改文件配置项

修改calico.yaml中calico-node容器的env环境变量
a、改CALICO_IPV4POOL_CIDR项为我们上边定义的clusterCIDR(指定pod的IP池)

      containers:

        - name: calico-node
          image: docker.io/calico/node:v3.23.5
..........
            - name: CALICO_IPV4POOL_CIDR
              value: "10.244.0.0/16"

b、添加 IP_AUTODETECTION_METHOD 环境变量:

      containers:

        - name: calico-node
          image: docker.io/calico/node:v3.23.5
..........
  env:
    # 这是需要我们添加的环境变量
            - name: IP_AUTODETECTION_METHOD
              value: "interface=ens33"
    #我这里网卡是ens33,就填的ens33

如果这个不指定的话,可能calico-node启动会报这个错

Readiness probe failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/calico/bird.ctl: connect: connection refused

3.7.3、启动服务

可以提前把yaml里container所需镜像下好,再启动

# 拉起
kubectl apply -f calico.yaml

# 查看服务
[root@k8s-master1 calico]# kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-54756b744f-nkxxm   1/1     Running   0          4m36s
calico-node-8kmr5                          1/1     Running   0          4m36s

# 等calico的pod都Running后,查看node状态也变为ready
[root@k8s-master1 calico]# kubectl get nodes
NAME          STATUS   ROLES    AGE   VERSION
k8s-master1   Ready    <none>   97m   v1.23.15

如果有启动失败,可以describe查看event或者docker logs查看容器日志排错

这样一个单节点集群就完成了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 性能测试的目的

    目的是验证软件系统是否能够达到用户提出的性能指标 同时发现软件系统中存在的性能瓶颈 优化软件 最后起到优化系统的目的 包括以下几个方面 1 评估系统的能力 测试中得到的负荷和响应时间数据可以被用于验证所计划的模型的能力 并帮助作出决策 2
  • Django 在Django项目里单独运行某个py文件

    Python文件开头写以下代码 import os import django 在environ字典里设置默认Django环境 xxxx settings 指Django项目的配置文件 os environ setdefault DJANG
  • echarts渐变色实现方法

    我使用的是echarts 4 2版本 在管网的文档中可查看其配置项 以柱状图为例 首先在series中找type line 然后找到areaStyle 在color中有方法能生成渐变色 线性渐变 前四个参数分别是 x0 y0 x2 y2 范
  • IT项目管理——项目范围(附带案例,案例为本人项目,并非传统案例)

    IT项目管理 项目范围 项目范围理论部分 前言 项目范围阐述 项目产品范围与项目工作范围的关系 项目范围控制 项目范围控制能带来什么 项目范围控制步骤 6个阶段 案例实战 须知 项目范围阐述 项目范围控制 项目范围管理的困难 工作分解结构
  • IOl流写一段文本存到本地文件中

    一 FileOutputStream中的小细节 1 创建对象 细节1 参数是字符串表示的路径或者File对象都是可以哦 细节2 如果文件不存在 会创建一个新的文件 但是要保证父级路径是正确的 细节3 如果文件已经存在 则会清空文件 2 写出
  • java设计模式——策略模式(Strategy Pattern)

    概述 在策略模式中 我们可以定义一些独立的类来封装不同的算法 每一个类封装一种具体的算法 在这里 每一个封装算法的类我们都可以称之为一种策略 Strategy 为了保证这些策略在使用时具有一致性 一般会提供一个抽象的策略类来做规则的定义 而
  • openssl命令基础用法:生成密码

    生成密码需要使用的标准命令为 passwd 用法如下 openssl passwd crypt 1 apr1 salt string in file stdin noverify quiet table password 常用选项有 1 使
  • Matlab实现回归分析的案例

    下面是一个简单的线性回归分析的Matlab实现案例 假定我们有一组数据 其中一个变量是自变量 另一个变量是因变量 我们想要使用线性回归来建立两个变量之间的关系模型 假设我们有以下数据 x 1 2 3 4 5 y 1 5 3 5 4 5 7
  • 查看url里面是否存在某个参数js

    场景 最近在做一个H5微信公众号的开发 微信分享出去的东西 用户点击进入 使用微信code授权之后 还是总提示code无效 code已使用的问题 原因 用户点击进入之后 会先进行登录 会获取到一次code 但是 在进行其他操作时再次用到这个
  • kafka学习(五):消费者分区策略(再平衡机制)

    kafka再平衡机制 指的是kafka consumer锁订阅的topic发生变化时 发生的一种分区重分配机制 一般有三种情况会出发consumer的分区分配策略 再平衡机制 1 consumer group 中新增或删除某个consume
  • java 将word转为pdf文件的两种方式【spire.doc.free】【documents4j】

    场景 如资产证明等场景下 一般要求同时生成word与pdf两种格式的证明文件 且两者格式需保持一致 可以各自单独生成 但那样可能需要维护两个模板文件 所以也可以仅定义一份word的模板文件 使用模板生成word文件 再将word转换为pdf
  • cmake中文手册pdf_【电脑技巧】第50期:来了!Python3.8.3官方中文手册

    介绍 Python 作为一门相当简洁的计算机语言 目前已经拥有诸多用户 而英文的帮助文件或多或少给英语水平不太好的用户带来了一定的不便 事实上 官网就有中文手册 为了大家的方便 这里下载下来中英两种格式的PDF文件 并合并为一个带书签的总文
  • mysql关系运算选择投影连接,数据库关系代数操作 并 差 积 选择 投影 连接等操作...

    首先我们需要明白 关系代数操作分为下面两种操作 并操作 首先需要满足并相容性 并相容性指的是 关系R与关系S存在相容性 当且仅当 1 关系R和关系S的属性数目必须相同 2 对于任意i 关系R的第i个属性的域必须和关系S的第i个属性的域相同
  • 通过jxls + poi 解决导出excel表格和动态合并单元格

    技术 jxls 通过模板导出数据 poi 解决第一列中相同值的单元格合并 第一步 依赖导入
  • 表单ajax提交插件,与表单(Form)插件的交互(AJAX 提交) - 手册网

    jQuery Validate 插件 与表单 Form 插件的交互 AJAX 提交 warning color red jQuery function mockjax url login action response function s
  • 第一讲:反事实因果分析框架(1)

    1 因果关系的定义 举个栗子 背景 小明是个土财主 有一天他打了佣人一棍子 第二天佣人死了 问题 打的那棍子是造成佣人死亡的原因么 在因果推断中 是否打人是处理变量 是否死亡是响应变量 影响我们判断的乱七八糟的其他因素是混淆变量 如果我们认
  • Spark实时数据流分析与可视化:实战指南【上进小菜猪大数据系列】

    上进小菜猪 沈工大软件工程专业 爱好敲代码 持续输出干货 本文介绍了如何利用Apache Spark技术栈进行实时数据流分析 并通过可视化技术将分析结果实时展示 我们将使用Spark Streaming进行数据流处理 结合常见的数据处理和可
  • [每日习题]年终奖(动态规划) 迷宫问题(DFS+回溯)——牛客习题

    hello 大家好 这里是bang bang 本篇记录2道牛客习题 年终奖 简单 迷宫问题 中等 如有需要 希望能有所帮助 目录 1 年终奖 2 迷宫问题 1 年终奖 年终奖 牛客题霸 牛客网 nowcoder com 描述 小东所在公司要
  • auto_copy.py

    coding utf 8 author DT date 20190118 import os import os path import shutil import time datetime def del file path for f
  • k8s1.23.15版本二进制部署/扩容及高可用架构详解

    前言 众所周知 kubernetes在2020年的1 20版本时就提出要移除docker 这次官方消息表明在1 24版本中彻底移除了dockershim 即移除docker 但是在1 24之前的版本中还是可以正常使用docker的 考虑到可