国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

k8s1.23.15版本二進(jìn)制部署/擴(kuò)容及高可用架構(gòu)詳解

這篇具有很好參考價(jià)值的文章主要介紹了k8s1.23.15版本二進(jìn)制部署/擴(kuò)容及高可用架構(gòu)詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

????眾所周知,kubernetes在2020年的1.20版本時(shí)就提出要移除docker。這次官方消息表明在1.24版本中徹底移除了dockershim,即移除docker。但是在1.24之前的版本中還是可以正常使用docker的??紤]到可能并不是所有項(xiàng)目環(huán)境都緊跟新版換掉了docker,本次就再最后體驗(yàn)一下可支持docker的最新k8s版本1.23.15,后續(xù)可能就研究怎么使用其他CRI,例如containerd了。

一、部署介紹及規(guī)劃:

本次部署各組件版本:

順便簡(jiǎn)單過一下組件作用

  • etcd: 3.5.6????????負(fù)責(zé)存儲(chǔ)集群的持久化數(shù)據(jù)
  • k8s-server: 1.23.15(所有基礎(chǔ)組件版本)
    • kube-apiserver:核心樞紐,提供了資源操作的唯一入口,并提供認(rèn)證、授權(quán)、訪問控制、API注冊(cè)和發(fā)現(xiàn)等機(jī)制;
    • kube-controller-manager:集群的管理控制中心,負(fù)責(zé)維護(hù)集群狀態(tài)
    • kube-scheduler:調(diào)度中心,負(fù)責(zé)節(jié)點(diǎn)資源管理,調(diào)度創(chuàng)建pod等
    • kube-proxy:網(wǎng)絡(luò)代理,負(fù)責(zé)為Service提供cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡
    • kubelet:負(fù)責(zé)維護(hù)pod生命周期
    • kubctl:管理集群命令
    • ……
明確目標(biāo):

部署: 快速部署三節(jié)點(diǎn)單master集群;
擴(kuò)容: 新增一個(gè)節(jié)點(diǎn),擴(kuò)為雙master集群,部署keepalived+nginx實(shí)現(xiàn)apiserver高可用,有條件的可以擴(kuò)為三master集群

本次測(cè)試節(jié)點(diǎn)信息:
主機(jī)名(角色) IP地址 節(jié)點(diǎn)規(guī)劃
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(待擴(kuò)容機(jī)器) 192.168.100.104 kube-apiserver、kube-controller-manager、kube-proxy、kubelet、nginx、keepalived
VIP(負(fù)載均衡器) 192.168.100.105

服務(wù)器版本:

[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

二、部署前準(zhǔn)備

(所有節(jié)點(diǎn)均操作)

系統(tǒng)初始化

為了方便二次執(zhí)行,直接全部復(fù)制,改了IP執(zhí)行就可

# 1、關(guān)閉防火墻和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、關(guān)閉swap分區(qū)(避免有性能等其他問題)
swapoff -a  #臨時(shí)關(guān)閉
sed -i "s/^.*swap*/#&/" /etc/fstab   #永久關(guān)閉
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

拓展內(nèi)容(可忽略,直接跳到第三步)

1、上邊初始化時(shí)net.bridge.bridge-nf-call-ip6tables參數(shù)說明

為什么要開啟 net.bridge.bridge-nf-call-ip6tables 配置(啟用iptables過濾bridge網(wǎng)橋流量)
簡(jiǎn)述:
網(wǎng)橋是處于二層,iptables工作于三層

  • 1、集群內(nèi)一pod訪問其他的service ip,會(huì)經(jīng)過三層iptables的DNAT轉(zhuǎn)發(fā)到pod_ip:port
  • 2、當(dāng)不開啟此配置,當(dāng)被訪pod回復(fù)請(qǐng)求時(shí),如果發(fā)現(xiàn)目標(biāo)是在同一個(gè)節(jié)點(diǎn),即同一網(wǎng)橋時(shí),會(huì)直接走網(wǎng)橋到源pod,這樣雖然能到源pod,但是由于沒有原路返回,客戶端與服務(wù)端的通信就不在一個(gè) “頻道” 上,不認(rèn)為處在同一個(gè)連接,也就無法正常通信。

常見的問題現(xiàn)象就是偶現(xiàn)DNS解析失敗,當(dāng) coredns 所在節(jié)點(diǎn)上的 pod 解析 dns 時(shí),dns 請(qǐng)求落到當(dāng)前節(jié)點(diǎn)的 coredns pod 上時(shí),就可能發(fā)生這個(gè)問題。
感興趣可以看詳細(xì)說明:為什么 kubernetes 環(huán)境要求開啟 bridge-nf-call-iptables ? - 騰訊云開發(fā)者社區(qū)-騰訊云 (tencent.com)
官方解讀看這里:Network Plugins | Kubernetes

2、簡(jiǎn)單了解下TLS證書

????因?yàn)閗8s集群需要PKI證書來基于TLS/SSL來做認(rèn)證,組件之間的通信都是通過證書來完成,可以理解為“口令”,組件通信時(shí)驗(yàn)證證書無誤后,才會(huì)建立聯(lián)系,交互信息,所以證書在部署及環(huán)境使用過程中也是比較重要的一項(xiàng)。

基礎(chǔ)概念
  • CA(Certification Authority):認(rèn)證機(jī)構(gòu):負(fù)責(zé)頒發(fā)證書的權(quán)威機(jī)構(gòu)(發(fā)送與接收組件雙方之間的信任紐帶)
  • CSR(Certificate Signing Request):它是向CA機(jī)構(gòu)申請(qǐng)數(shù)字簽名證書時(shí)使用的請(qǐng)求文件

請(qǐng)求中會(huì)附上公鑰信息以及國(guó)家,城市,域名,Email等信息,準(zhǔn)備好CSR文件后就可以提交給CA機(jī)構(gòu),等待他們給我們簽名,簽好名后我們會(huì)收到crt文件,即證書。

證書:

CA機(jī)構(gòu)對(duì)申請(qǐng)者的身份驗(yàn)證成功后,用CA的根證書對(duì)申請(qǐng)人的一些基本信息以及申請(qǐng)人的公鑰進(jìn)行簽名(相當(dāng)于加蓋發(fā)證書機(jī) 構(gòu)的公章)后形成的一個(gè)數(shù)字文件。實(shí)際上,數(shù)字證書就是經(jīng)過CA認(rèn)證過的公鑰,除了公鑰,還有其他的信息,比如Email,國(guó)家,城市,域名等。

證書的編碼格式:
  • PEM(Privacy Enhanced Mail):通常用于數(shù)字證書認(rèn)證機(jī)構(gòu)CA,擴(kuò)展名為.pem, .crt, .cer, 和.key。內(nèi)容為Base64編碼的ASCII碼文件,有類似"-----BEGIN CERTIFICATE-----" 和 "-----END CERTIFICATE-----"的頭尾標(biāo)記
  • DER(Distinguished Encoding Rules):與PEM不同之處在于其使用二進(jìn)制而不是Base64編碼的ASCII。擴(kuò)展名為.der或者.cer
公鑰私鑰:
  • 每個(gè)人都有一個(gè)公鑰與私鑰
  • 私鑰用來進(jìn)行解密和簽名,是給自己用的。
  • 公鑰由本人公開,用于加密和驗(yàn)證簽名,是給別人用的。
  • 當(dāng)該用戶發(fā)送文件時(shí),用私鑰簽名,別人用他給的公鑰解密,可以保證該信息是由他發(fā)送的。即數(shù)字簽名。
  • 當(dāng)該用戶接受文件時(shí),別人用他的公鑰加密,他用私鑰解密,可以保證該信息只能由他看到。即安全傳輸。
簡(jiǎn)述CA原理

CA的產(chǎn)生,是因?yàn)槎鄠€(gè)組件之間通信時(shí),需要加一第三方來判斷數(shù)據(jù)來源是否合規(guī),保證通信的安全性。
引入一個(gè)看到的比較好的例子,用介紹信來介紹原理

普通的介紹信

假設(shè) A 公司的張三先生要到 B 公司去拜訪,但是 B 公司的所有人都不認(rèn)識(shí)他,常用的辦法是帶公司開的一張介紹信,在信中說:茲有張三先生前往貴公司辦理業(yè)務(wù),請(qǐng)給予接洽…云云。然后在信上敲上A公司的公章。

張三先生到了 B 公司后,把介紹信遞給 B 公司的前臺(tái)李四小姐。李小姐一看介紹信上有 A 公司的公章,而且 A 公司是經(jīng)常和 B 公司有業(yè)務(wù)往來的,這位李小姐就相信張先生不是歹人了。

這里,A公司就是CA機(jī)構(gòu),介紹信及頒發(fā)給張三的證書

引入中介權(quán)威機(jī)構(gòu)的介紹信

如果和 B 公司有業(yè)務(wù)往來的公司很多,每個(gè)公司的公章都不同,那前臺(tái)就要懂得分辨各種公章,非常麻煩。
所以,有C公司專門開設(shè)了一項(xiàng)“代理公章”的業(yè)務(wù)。
 今后,A 公司的業(yè)務(wù)員去 B 公司,需要帶2個(gè)介紹信:
  介紹信1
  含有 C 公司的公章及 A 公司的公章。并且特地注明:C 公司信任 A 公司。
  介紹信2
  僅含有 A 公司的公章,然后寫上:茲有張三先生前往貴公司辦理業(yè)務(wù),請(qǐng)給予接洽…云云。
主要的好處在于: 對(duì)于B公司而言,就不需要記住各個(gè)公司的公章分別是什么;他只需要記住中介公司 C 的公章即可。當(dāng)他拿到兩份介紹信之后,先對(duì)介紹信1的 C 公章,驗(yàn)明正身;確認(rèn)無誤之后,再比對(duì)介紹信1和介紹信2的兩個(gè) A 公章是否一致。如果是一樣的,那就可以證明介紹信2,即A公司是可以信任的了。

最后直白一點(diǎn),其實(shí)我們的身份證一定程度上也相當(dāng)于是頒發(fā)給我們的證書~

本次集群內(nèi)部署使用的為自簽的CA證書

三、開始部署

1、etcd集群部署

??????Etcd 是 CoreOS 推出的高可用的分布式鍵值存儲(chǔ)系統(tǒng),內(nèi)部采用 raft 協(xié)議作為一致性算法,主要用于k8s集群的服務(wù)發(fā)現(xiàn)及存儲(chǔ)集群的狀態(tài)和配置等,所以先部署ETCD數(shù)據(jù)庫。
??????本次使用三臺(tái)組建集群(集群模式最少三節(jié)點(diǎn)),與k8s集群復(fù)用三臺(tái)節(jié)點(diǎn)(k8s-master1、k8s-node1、k8s-node2),也可以放在集群之外,網(wǎng)絡(luò)互通即可。

三節(jié)點(diǎn),可容忍一個(gè)節(jié)點(diǎn)故障;
五節(jié)點(diǎn),可容忍兩個(gè)節(jié)點(diǎn)故障

1.1、使用cfssl工具配置證書 (重點(diǎn))

CFSSL是CloudFlare開源的一款PKI/TLS工具。 CFSSL 包含一個(gè)命令行工具 和一個(gè)用于 簽名,驗(yàn)證并且捆綁TLS證書的 HTTP API 服務(wù)。 使用Go語言編寫。
是一個(gè)開源的證書管理工具,使用json文件生成證書,相比openssl更方便使用。
詳細(xì)的不多說,直接開始(master1節(jié)點(diǎn)操作)

如果下載不下來,可以點(diǎn)這里下載,為本次文章使用的所有軟件包,官方拉取純凈版

# 下載工具包
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
# 復(fù)制到/usr/local/bin目錄,并賦予執(zhí)行權(quán)限
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、創(chuàng)建給etcd使用的自簽證書頒發(fā)機(jī)構(gòu)(CA)
1.2.1、創(chuàng)建工作目錄
mkdir -p ~/TLS/{etcd,k8s} && cd ~/TLS/etcd
1.2.2、配置證書生成策略,讓CA軟件知道頒發(fā)有什么功能的證書
cat > ca-config.json << EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "etcd": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

可用參數(shù)介紹:
這個(gè)策略,有一個(gè)default默認(rèn)的配置,和一個(gè)profiles,profiles可以設(shè)置多個(gè)profile,這里的profile是etcd。

  • default:默認(rèn)策略,指定了證書的默認(rèn)有效期是一年(8760h)
  • etcd:表示該配置(profile)的用途是為etcd生成證書及相關(guān)的校驗(yàn)工作
    • expiry:也表示過期時(shí)間,如果不寫以default中的為準(zhǔn)
    • signing:表示該證書可用于簽名其它證書;生成的 ca.pem 證書中 CA=TRUE
    • key encipherment:密鑰加密
    • server auth:表示可以該CA 對(duì) server 提供的證書進(jìn)行驗(yàn)證
    • client auth:表示可以用該 CA 對(duì) client 提供的證書進(jìn)行驗(yàn)證
1.2.3、創(chuàng)建用來生成 CA 證書簽名請(qǐng)求(CSR)的 JSON 配置文件
cat > ca-csr.json << EOF
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "ShangHai",
            "ST": "ShangHai"
        }
    ]
}
EOF

可用參數(shù)介紹:

  • CN:Common Name,CA名字
  • key:生成證書的算法
  • hosts:表示哪些主機(jī)名(域名)或者IP可以使用此csr申請(qǐng)證書,為空或者""表示所有的都可以使用
  • names:一些其它的屬性
    • C:Country, 國(guó)家
    • ST:State,州或者是省份
    • L:Locality Name,地區(qū),城市
    • O:Organization Name,組織名稱,公司名稱(在k8s中常用于指定Group,進(jìn)行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

# 當(dāng)前目錄下會(huì)生成 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簽發(fā)etcd證書
1.3.1、配置etcd請(qǐng)求證書申請(qǐng)文件
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項(xiàng)中ip為etcd集群內(nèi)部通信的ip,如果后續(xù)etcd集群有擴(kuò)容需求,那么在hosts項(xiàng)里可以預(yù)留幾個(gè)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節(jié)點(diǎn)操作,后邊把配置拷貝到另外兩個(gè)節(jié)點(diǎn)修改啟動(dòng)etcd即可

# 下載二進(jìn)制包
cd /opt/software
wget https://github.com/etcd-io/etcd/releases/download/v3.5.6/etcd-v3.5.6-linux-amd64.tar.gz

# 創(chuàng)建工作目錄
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: 節(jié)點(diǎn)名稱,集群中唯一
  • ETCD_DATA_DIR:數(shù)據(jù)存放目錄
  • ETCD_LISTEN_PEER_URLS:集群通訊監(jiān)聽地址
  • ETCD_LISTEN_CLIENT_URLS:客戶端訪問監(jiān)聽地址
  • ETCD_INITIAL_CLUSTER:集群節(jié)點(diǎn)地址
  • ETCD_INITIALCLUSTER_TOKEN:集群Token
  • ETCD_INITIALCLUSTER_STATE:加入集群的狀態(tài):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、拷貝配置到另外兩個(gè)節(jié)點(diǎn)
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、修改另外兩個(gè)節(jié)點(diǎn)中的etcd配置
#[Member]
ETCD_NAME="etcd-1"    # 節(jié)點(diǎn)名稱,可改為etcd-2和etcd-3
ETCD_DATA_DIR="/home/data/"   # 自定義數(shù)據(jù)目錄
ETCD_LISTEN_PEER_URLS="https://192.168.100.101:2380"    #改為當(dāng)前節(jié)點(diǎn)IP
ETCD_LISTEN_CLIENT_URLS="https://192.168.100.101:2379"    #改為當(dāng)前節(jié)點(diǎn)IP

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.100.101:2380"    #改為當(dāng)前節(jié)點(diǎn)IP
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.100.101:2379"    #改為當(dāng)前節(jié)點(diǎn)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、啟動(dòng)etcd

需要注意的是三臺(tái)節(jié)點(diǎn)的etcd服務(wù)需要同時(shí)啟動(dòng),就三臺(tái)機(jī)器,命令行工具多窗口執(zhí)行即可

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


# 查看集群節(jié)點(diǎn)狀態(tài)如下即正常(記得修改命令中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

所有節(jié)點(diǎn)都操作

# 安裝
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

# 啟動(dòng)
systemctl start docker
systemctl enable docker

# 修改docker數(shù)據(jù)目錄(可選操作)
cat > /etc/docker/daemon.json << EOF
{
   "data-root": "/home/docker"
}
EOF

# 重啟
systemctl restart docker

3、部署master節(jié)點(diǎn)

3.1、部署kube-apiver
3.1.1、生成kube-apiserver證書

自簽CA證書(這個(gè)和上邊那個(gè)etcd的CA區(qū)分開,單獨(dú)給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簽發(fā)kube-apiserver的證書

hosts里要寫入集群內(nèi)的所有節(jié)點(diǎn)IP,包括后續(xù)要用的負(fù)載均衡VIP的IP,如果有擴(kuò)容需求,可以預(yù)留幾個(gè)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、下載二進(jìn)制包,調(diào)整配置

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

如果下載不下來,可以點(diǎn)這里下載,為本次文章使用的所有軟件包,官方拉取純凈版

# 下載/配置
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

創(chuàng)建配置文件

兩個(gè)\必須要啊。第一個(gè)是轉(zhuǎn)義符,使用轉(zhuǎn)義符是為了使用EOF保留換行符;第二個(gè)是換行符,不然就跑一行去了
好像不加換行符服務(wù)啟動(dòng)識(shí)別有點(diǎn)問題

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 :?jiǎn)⒂萌罩荆╰rue為輸出到標(biāo)準(zhǔn)輸出,false為輸出到日志文件里)
  • –v :日志等級(jí)
  • –log-dir :日志目錄
  • –etcd-servers :etcd集群地址
  • –bind-address :監(jiān)聽地址
  • –secure-port :https安全端口
  • –advertise-address :集群通告地址
  • –allow-privileged :?jiǎn)?dòng)授權(quán)
  • –service-cluster-ip-range :Service虛擬IP地址段,這里掩碼給16位,可以創(chuàng)建(2的16次方-2)=65534個(gè)地址
  • –enable-admission-plugins : 準(zhǔn)入控制模塊
  • –authorization-mode :認(rèn)證授權(quán),啟用RBAC授權(quán)和節(jié)點(diǎn)自管理
  • –enable-bootstrap-token-auth :?jiǎn)⒂肨LS bootstrap機(jī)制
  • –token-auth-file :bootstrap token文件
  • –service-node-port-range :Service nodeport類型默認(rèn)分配端口范圍
  • –kubelet-client-xxx :apiserver訪問kubelet客戶端證書
  • –tls-xxx-file :apiserver https證書
  • –service-account-issuer:此參數(shù)可作為服務(wù)賬號(hào)令牌發(fā)放者的身份標(biāo)識(shí)(Identifier)詳細(xì)可參考官方解析和阿里云解析
  • –service-account-signing-key-file:指向包含當(dāng)前服務(wù)賬號(hào)令牌發(fā)放者的私鑰的文件路徑
  • –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:?jiǎn)?dòng)聚合層網(wǎng)關(guān)配置
  • –audit-log-xxx :審計(jì)日志

更多參數(shù)可查看官方介紹

拷貝生成證書到工作目錄

cp ~/TLS/k8s/*.pem /opt/kubernetes/ssl/
3.1.3、啟用TLS bootstrapping機(jī)制

當(dāng)集群開啟了 TLS 認(rèn)證后,每個(gè)節(jié)點(diǎn)的 kubelet 組件都要使用由 apiserver 使用的 CA 簽發(fā)的有效證書才能與 apiserver 通訊,此時(shí)如果節(jié)點(diǎn)多起來,為每個(gè)節(jié)點(diǎn)單獨(dú)簽署證書將是一件非常繁瑣的事情;TLS bootstrapping 功能就是讓 kubelet 先使用一個(gè)預(yù)定的低權(quán)限用戶連接到 apiserver,然后向 apiserver 申請(qǐng)證書,kubelet 的證書由 apiserver 動(dòng)態(tài)簽署
詳細(xì)內(nèi)容見官方說明
工作流程:

k8s二進(jìn)制部署詳解,kubernetes,kubernetes,架構(gòu),docker,云計(jì)算

創(chuàng)建令牌認(rèn)證文件

# 生成隨機(jī)數(shù)
[root@k8s-master1 cfg]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
a2dfd3748230d54213367c6dcb63efde

# 將生成的數(shù)創(chuàng)建token文件(將上邊生成的數(shù)替換第一個(gè)值)
cat > /opt/kubernetes/cfg/token.csv << EOF
a2dfd3748230d54213367c6dcb63efde,kubelet-bootstrap,10001,"system:node-bootstrapper"
EOF
3.1.4、配置systemd管理服務(wù)
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

啟動(dòng)服務(wù)

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

小提示:
啟動(dòng)會(huì)報(bào)下邊這倆錯(cuò),忽略就行,這個(gè)是說這倆參數(shù)準(zhǔn)備棄用了,但是現(xiàn)在還能用(就跟前幾年說移除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
# 創(chuàng)建證書請(qǐng)求文件
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文件 (重點(diǎn))

該文件存放一些集群組件之間交互的認(rèn)證信息,用于集群組件訪問apiserver,操作分為四步
前三步都會(huì)往配置文件里寫入一些內(nèi)容,可以每歩執(zhí)行前后對(duì)照著內(nèi)容看看
A.生成kubeconfig文件,設(shè)置集群參數(shù)

# 配置個(gè)臨時(shí)變量
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:設(shè)置集群的名字(這里設(shè)置為kubernetes)
  • –certificate-authority:集群的CA證書
  • –embed-certs:將ca.pem證書內(nèi)容嵌入到生成的 kubectl.kubeconfig 文件中(不加時(shí),寫入的是證書文件路徑)。
  • –server:apiserver地址
  • –kubeconfig:文件名稱,這里給controller-manager用,就叫做kube-controller-manager.kubeconfig

該命令執(zhí)行完會(huì)在指定目錄下生成一個(gè)我們命名的那個(gè)叫kube-controller-manager.kubeconfig的文件,文件里只有集群的信息和CA證書內(nèi)容

B.設(shè)置客戶端認(rèn)證參數(shù)

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:設(shè)置客戶端名字,這里用連接apiserver的組件名稱
  • –client-certificate:客戶端的證書文件,apiserver用來做驗(yàn)證
  • –client-key:也是客戶端證書,key文件

上邊這兩歩,就相當(dāng)于之前說的范例里A公司和中介C公司的介紹信內(nèi)容內(nèi)嵌在這個(gè)配置文件中,去拜訪B公司時(shí)候使用

C.設(shè)置上下文參數(shù)

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

配置介紹:

  • set-context:設(shè)置上下文,設(shè)置配置文件中的contexts項(xiàng),后邊跟上下文名稱,這里設(shè)置為default(多用于操作多個(gè)k8s集群時(shí)區(qū)分當(dāng)前是在哪個(gè)上下文,即哪個(gè)集群里操作的)
  • –cluster:集群名稱,要和上邊第一步的名稱完全一致
  • –user:用戶名稱,要和第二歩的客戶端名稱完全一致

D.設(shè)置當(dāng)前默認(rèn)上下文
使用kubeconfig中的一個(gè)環(huán)境項(xiàng)作為當(dāng)前配置,官方解讀

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

# 等集群拉起后,可以通過這個(gè)命令查看當(dāng)前所在的是哪個(gè)集群的上下文
kubectl config current-context

配置說明:

  • 設(shè)置context(上下文)用哪個(gè)kubeconfig,這里就是設(shè)置default的上下文,使用我們上邊配置的kube-controller-manager.kubeconfig
3.2.3、創(chuàng)建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:當(dāng)該組件啟動(dòng)多個(gè)時(shí),自動(dòng)選舉(HA)
  • –cluster-signing-cert-file:自動(dòng)為kubelet頒發(fā)證書的CA
  • –cluster-signing-key-file:自動(dòng)為kubelet頒發(fā)證書的CA
3.2.4、配置systemd管理、啟動(dòng)服務(wù)
# 配置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

# 啟動(dòng)服務(wù)
systemctl daemon-reload
systemctl start kube-controller-manager
systemctl enable kube-controller-manager
systemctl status kube-controller-manager

小提示:
啟動(dòng)會(huì)額外有這倆報(bào)錯(cuò),是因?yàn)闆]有配置cloud-provider參數(shù),這個(gè)對(duì)于內(nèi)部使用的集群基本用不著

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文件、創(chuàng)建配置文件、systemd管理及啟動(dòng)服務(wù)

3.3.1、生成證書
# 切換工作目錄
cd ~/TLS/k8s
 
# 創(chuàng)建證書請(qǐng)求文件
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、創(chuàng)建服務(wù)配置文件
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管理、服務(wù)啟動(dòng)
# 配置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

# 啟動(dòng)
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、驗(yàn)證

各組件狀態(tài)正常即可

[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也是要作為節(jié)點(diǎn)存在的,所以也要部署kubelet和kube-proxy

3.5.1、定義kubelet配置參數(shù)
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

配置說明:
更多配置詳情可翻閱官方范例和官方參數(shù)解讀

  • evictionHard:驅(qū)逐資源硬限制(當(dāng)達(dá)到下面配置項(xiàng)的閾值后會(huì)觸發(fā)驅(qū)逐)
  • imagefs.available:容器運(yùn)行時(shí)鏡像存儲(chǔ)空間剩余量
  • memory.available:宿主機(jī)可用內(nèi)存
  • nodefs.available:宿主機(jī)可用磁盤空間(一般是指根目錄)
  • nodefs.inodesFree:宿主機(jī)可用inode(df -i可查看總量)
3.5.2、創(chuàng)建配置文件
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顯示的名稱,集群唯一,保持和主機(jī)名一致即可(不可重復(fù))
  • –network-plugin:?jiǎn)⒂肅NI(官方解讀)
  • –kubeconfig:空路徑,會(huì)自動(dòng)生成,后面用于連接apiserver
  • –bootstrap-kubeconfig:首次啟動(dòng)向apiserver申請(qǐng)證書的配置(下一步就是生成這個(gè)配置)
  • –config:配置文件參數(shù)(上一步配置的參數(shù)文件)
  • –cert-dir:kubelet證書目錄
  • –pod-infra-container-image :管理Pod網(wǎng)絡(luò)的pause容器的鏡像
3.5.3、生成bootstrap.kubeconfig文件
# 臨時(shí)變量
KUBE_CONFIG="/opt/kubernetes/cfg/bootstrap.kubeconfig"
KUBE_APISERVER="https://192.168.100.101:6443"
TOKEN="a2dfd3748230d54213367c6dcb63efde" # !!與/opt/kubernetes/cfg/token.csv文件中數(shù)據(jù)保持一致

# 生成配置
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、授權(quán)kubelet-bootstrap用戶允許請(qǐng)求證書

????在啟動(dòng)kubelet后,kubelet會(huì)自動(dòng)用上一步的kubeconfig配置去向apiserver申請(qǐng)證書,而配置里的client用戶是kubelet-bootstrap,所以要先給該用戶一個(gè)權(quán)限才可以

kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
3.5.5、配置systemd管理、啟動(dòng)服務(wù)
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

# 啟動(dòng)
systemctl daemon-reload
systemctl start kubelet
systemctl status kubelet
3.5.6、批準(zhǔn)kubelet的證書申請(qǐng)
# 查看證書申請(qǐng)csr(certificatesigningrequest),狀態(tài)為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

# 批準(zhǔn)kubelet證書申請(qǐng)
[root@k8s-master1 ~]# kubectl certificate approve node-csr-6m-PtPGVEiw089UJ9dnNf3cjbiMdKizuq27umnYdD7I
certificatesigningrequest.certificates.k8s.io/node-csr-6m-PtPGVEiw089UJ9dnNf3cjbiMdKizuq27umnYdD7I approved

# 查看csr狀態(tài),狀態(tài)為Approved,Issued(已批準(zhǔn))
[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網(wǎng)絡(luò)插件還沒安裝,所以當(dāng)前還是NotReady狀態(tài))
[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
 
# 創(chuàng)建證書請(qǐng)求文件
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、定義配置參數(shù),指定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

單獨(dú)介紹下mode參數(shù)
這個(gè)是配置kube-proxy的工作模式,目前用的基本就是這兩種,都是基于內(nèi)核的netfilter實(shí)現(xiàn)的:

  • iptables: 默認(rèn)使用的模式,通過創(chuàng)建一條條iptables規(guī)則鏈來訪問集群內(nèi)service。這種模式pod內(nèi)ping不通service的IP
  • ipvs: 專門用來做負(fù)載均衡的技術(shù),lvs就用的這個(gè)。pod可以ping通service的IP

這里就先不展開詳細(xì)說了,要單獨(dú)開單章說明。
這里部署就先用默認(rèn)的iptables模式就可以,在服務(wù)量級(jí)不大的時(shí)候,iptables和ipvs性能差不多

3.6.4、創(chuàng)建配置文件
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管理、啟動(dòng)服務(wù)
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

# 啟動(dòng)服務(wù)
systemctl daemon-reload
systemctl start kube-proxy
systemctl enable kube-proxy
systemctl status kube-proxy
3.7、安裝cni網(wǎng)絡(luò)插件

這里選擇用calico來作為網(wǎng)絡(luò)插件使用

calico官網(wǎng):https://www.tigera.io/project-calico/

查看版本對(duì)應(yīng)關(guān)系
從官網(wǎng)文檔說明里得知,calico-v3.23版本支持k8s的v1.23版本,所以這里就選擇安裝v3.23版本好了
k8s二進(jìn)制部署詳解,kubernetes,kubernetes,架構(gòu),docker,云計(jì)算

3.7.1、拉取配置

如果拉取不到,可以點(diǎn)這里下載,為本次文章使用的所有軟件包,官方拉取純凈版

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

# 下載官方y(tǒng)aml文件
curl https://projectcalico.docs.tigera.io/archive/v3.23/manifests/calico.yaml -O
3.7.2、根據(jù)環(huán)境修改文件配置項(xiàng)

修改calico.yaml中calico-node容器的env環(huán)境變量
a、改CALICO_IPV4POOL_CIDR項(xiàng)為我們上邊定義的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 環(huán)境變量:

      containers:

        - name: calico-node
          image: docker.io/calico/node:v3.23.5
..........
  env:
    # 這是需要我們添加的環(huán)境變量
            - name: IP_AUTODETECTION_METHOD
              value: "interface=ens33"
    #我這里網(wǎng)卡是ens33,就填的ens33

如果這個(gè)不指定的話,可能calico-node啟動(dòng)會(huì)報(bào)這個(gè)錯(cuò)

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、啟動(dòng)服務(wù)

可以提前把yaml里container所需鏡像下好,再啟動(dòng)

# 拉起
kubectl apply -f calico.yaml

# 查看服務(wù)
[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狀態(tài)也變?yōu)閞eady
[root@k8s-master1 calico]# kubectl get nodes
NAME          STATUS   ROLES    AGE   VERSION
k8s-master1   Ready    <none>   97m   v1.23.15

如果有啟動(dòng)失敗,可以describe查看event或者docker logs查看容器日志排錯(cuò)

這樣一個(gè)單節(jié)點(diǎn)集群就完成了??

3.8、配置apiserver訪問kubelet權(quán)限

允許使用kubectl來查看pod日志

不然會(huì)有如下報(bào)錯(cuò)

Error from server (Forbidden): Forbidden (user=kubernetes, verb=get, resource=nodes, subresource=proxy) ( pods/log calico-node-8kmr5)

編輯配置并啟動(dòng)

mkdir /opt/kubernetes/yaml && cd /opt/kubernetes/yaml

# 配置
cat > apiserver-to-kubelet-rbac.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: system:kube-apiserver-to-kubelet
rules:
  - apiGroups:
      - ""
    resources:
      - nodes/proxy
      - nodes/stats
      - nodes/log
      - nodes/spec
      - nodes/metrics
      - pods/log
    verbs:
      - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:kube-apiserver
  namespace: ""
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:kube-apiserver-to-kubelet
subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: kubernetes
EOF

kubectl apply -f apiserver-to-kubelet-rbac.yaml

這樣再去執(zhí)行kubectl logs就可以了

4、新增Worker節(jié)點(diǎn)

現(xiàn)在192.168.100.101(master)已經(jīng)拉起一套單節(jié)點(diǎn)的k8s集群,后邊就是把另外兩個(gè)node節(jié)點(diǎn)也給加進(jìn)來

4.1、node節(jié)點(diǎn)準(zhǔn)備
mkdir -p /opt/kubernetes/{cfg,bin,log,ssl}
4.2、把master上的配置信息拷貝到node節(jié)點(diǎn)中(master節(jié)點(diǎn)操作)

注:這里注意,要把cfg/kubelet.kubeconfig這個(gè)文件刪除,因?yàn)槭莂piserver那邊頒發(fā)證書后自動(dòng)生成的,每個(gè)節(jié)點(diǎn)不一樣

scp /opt/kubernetes/cfg/{kubelet*,kube-proxy*,bootstrap*} 192.168.100.102:/opt/kubernetes/cfg/
scp /opt/kubernetes/cfg/{kubelet*,kube-proxy*,bootstrap*} 192.168.100.103:/opt/kubernetes/cfg/

scp /opt/kubernetes/bin/{kubelet*,kube-proxy*} 192.168.100.102:/opt/kubernetes/bin/
scp /opt/kubernetes/bin/{kubelet*,kube-proxy*} 192.168.100.103:/opt/kubernetes/bin/

scp /opt/kubernetes/ssl/ca.pem 192.168.100.102:/opt/kubernetes/ssl/
scp /opt/kubernetes/ssl/ca.pem 192.168.100.103:/opt/kubernetes/ssl/

scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service 192.168.100.102:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service 192.168.100.103:/usr/lib/systemd/system/
4.3、修改配置(node節(jié)點(diǎn)操作)
# a. 修改cfg/kubelet.conf文件中hostname-override值為所在node節(jié)點(diǎn)主機(jī)名
vim cfg/kubelet.conf
..... 
--hostname-override=k8s-node1 \
.....

# b.修改cfg/kube-proxy-config.yml文件中hostnameOverride值為所在node節(jié)點(diǎn)主機(jī)名
vim kube-proxy-config.yml
.....
hostnameOverride: k8s-node1
......

# c.刪除kubelet.kubconfig
rm /opt/kubernetes/cfg/kubelet.kubeconfig
4.4、啟動(dòng)服務(wù)(node節(jié)點(diǎn)操作)
systemctl daemon-reload
systemctl start kubelet kube-proxy
systemctl enable kubelet kube-proxy
4.5、master中查看證書申請(qǐng)并同意
[root@k8s-master1 kubernetes]# kubectl get csr
NAME                                                   AGE     SIGNERNAME                                    REQUESTOR           REQUESTEDDURATION   CONDITION
node-csr-1seYXEb3ZkQvuSPVuW5_jKM8y0MhCOBZ5xX4qkcigUo   13s     kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   <none>              Pending
node-csr-V2YmiDZhAu1CY87EZbZAKCweGHF1JZb635oecD39l-c   3m14s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   <none>              Pending
[root@k8s-master1 kubernetes]#
[root@k8s-master1 kubernetes]# kubectl certificate approve node-csr-1seYXEb3ZkQvuSPVuW5_jKM8y0MhCOBZ5xX4qkcigUo node-csr-V2YmiDZhAu1CY87EZbZAKCweGHF1JZb635oecD39l-c
certificatesigningrequest.certificates.k8s.io/node-csr-1seYXEb3ZkQvuSPVuW5_jKM8y0MhCOBZ5xX4qkcigUo approved
certificatesigningrequest.certificates.k8s.io/node-csr-V2YmiDZhAu1CY87EZbZAKCweGHF1JZb635oecD39l-c approved
4.6、查看集群node狀態(tài)

會(huì)在新加節(jié)點(diǎn)上啟動(dòng)一些初始服務(wù),如calico-node,所以需要稍等一會(huì)狀態(tài)就可變?yōu)閞eady

[root@k8s-master1 kubernetes]# kubectl get nodes
NAME          STATUS   ROLES    AGE     VERSION
k8s-master1   Ready    <none>   151m    v1.23.15
k8s-node1     Ready    <none>   4m49s   v1.23.15
k8s-node2     Ready    <none>   4m49s   v1.23.15

到此,簡(jiǎn)易的單master,雙node的三節(jié)點(diǎn)集群就搭建完成了

5、部署Coredns

????一般情況下,pod之間通信都是用service的clusterIP,但是ip有難以記憶等問題,所以需要加一個(gè)DNS來解析,可以使用service_name來進(jìn)行服務(wù)之間相互調(diào)用。大概是從k8s的1.11版本以來,k8s就直接從kube-dns轉(zhuǎn)為coredns了,所以本次DNS選擇coredns

????還是一如既往的去看下coredns和k8s之間的版本聯(lián)系,通過這里官方給出的kubeadm部署使用的版本記錄得出,coredns:1.8.6肯定是可以在k8s1.23版本中使用的,所以本次就使用1.8.6版本的coredns了
k8s二進(jìn)制部署詳解,kubernetes,kubernetes,架構(gòu),docker,云計(jì)算

5.1、拉取配置

如果配置和鏡像下載不下來,可以點(diǎn)這里下載,為本次文章使用的所有軟件包,官方拉取純凈版

# 這里就用容器形式部署DNS了,方便快捷
mkdir /opt/kubernetes/coredns && cd /opt/kubernetes/coredns
curl https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/coredns/coredns.yaml.base -O
mv coredns.yaml.base coredns.yaml
5.2、修改配置

修改coredns.yaml中的帶有__DNS__的值

1、原文:__DNS__DOMAIN__
    改為:cluster.local (dns域,和上邊kubelet中配置的保持一致)
2、原文:__DNS__MEMORY__LIMIT__
    改為:500Mi
3、原文:__DNS__SERVER__
    改為:10.0.0.240  (這里是dns的svc—ip,要和上邊kubelet中配置的clusterDNS值一致)

修改使用鏡像

原文:image: registry.k8s.io/coredns/coredns:v1.10.0
改為:image: coredns/coredns:1.8.6
5.3、運(yùn)行
kubectl apply -f coredns.yaml
[root@k8s-master1 coredns]# kubectl get pod,svc -n kube-system
NAME                                           READY   STATUS    RESTARTS   AGE
pod/calico-kube-controllers-54756b744f-p9n9m   1/1     Running   0          5h2m
pod/calico-node-6k4xn                          1/1     Running   0          5h2m
pod/calico-node-cnzm9                          1/1     Running   0          5h2m
pod/calico-node-qqwnr                          1/1     Running   0          5h2m
pod/coredns-57c6b56d8d-hcn58                   1/1     Running   0          21m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.0.0.240   <none>        53/UDP,53/TCP,9153/TCP   22m
5.4、測(cè)試
# 查看當(dāng)前的svc
[root@k8s-master1 coredns]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.0.0.1       <none>        443/TCP   6h59m

# 啟動(dòng)一個(gè)臨時(shí)pod(busybox)測(cè)試解析
[root@k8s-master1 coredns]# kubectl run -ti --rm busybox-test --image=busybox:1.35 sh
/ # nslookup kubernetes
Server:         10.0.0.240
Address:        10.0.0.240:53

** server can't find kubernetes.cluster.local: NXDOMAIN

Name:   kubernetes.default.svc.cluster.local
Address: 10.0.0.1
# 測(cè)試端口
/ # nc -vz kubernetes 443
kubernetes (10.0.0.1:443) open
/ #

/ # nc -vz 10.0.0.1 443
10.0.0.1 (10.0.0.1:443) open

6、部署一個(gè)官方的dashboard

根據(jù)官方配置即可kubernetes/dashboard:用于 Kubernetes 集群的通用 Web UI (github.com)

6.1、拉取官方配置文件

如果拉取不到,可以點(diǎn)這里下載,為本次文章使用的所有軟件包,官方拉取純凈版

mkdir /opt/kubernetes/dashboard && cd /opt/kubernetes/dashboard
curl https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml -O
6.2、修改配置

集群角色簡(jiǎn)介:

  • ClusterRole:是集群的權(quán)限
  • ServiceAccount:是集群的用戶
  • ClusterRoleBinding:起到把權(quán)限和用戶綁在一起的作用

官方的配置里創(chuàng)建的serviceaccount用戶(kubernetes-dashboard)沒有權(quán)限打開面板頁面

所以我們把默認(rèn)用戶綁到集群原有的cluster-admin規(guī)則上即可,修改配置

# ClusterRoleBinding 這塊內(nèi)容修改為如下內(nèi)容,需要修改的地方是roleRef.name,
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  #name: kubernetes-dashboard
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard

    namespace: kubernetes-dashboard
    
# 修改service
# 默認(rèn)是ClusterIP類型,要改為NodePort方便訪問(加一行即可)
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
6.3、拉起服務(wù)
[root@k8s-master1 dashboard]# kubectl apply -f recommended.yaml
[root@k8s-master1 dashboard]# kubectl get pod,svc -n kubernetes-dashboard
NAME                                             READY   STATUS    RESTARTS   AGE
pod/dashboard-metrics-scraper-6f669b9c9b-6hkkf   1/1     Running   0          56m
pod/kubernetes-dashboard-758765f476-nh988        1/1     Running   0          56m

NAME                                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
service/dashboard-metrics-scraper   ClusterIP   10.0.203.46   <none>        8000/TCP        56m
service/kubernetes-dashboard        NodePort    10.0.51.31    <none>        443:30143/TCP   56m
6.4、獲取token
[root@k8s-master1 dashboard]# kubectl get secret -n kubernetes-dashboard |grep dashboard-token
kubernetes-dashboard-token-2qcjl   kubernetes.io/service-account-token   3      10m
[root@k8s-master1 dashboard]# kubectl describe secret kubernetes-dashboard-token-2qcjl -n kubernetes-dashboard
Name:         kubernetes-dashboard-token-2qcjl
Namespace:    kubernetes-dashboard
.......
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6.......# 復(fù)制這段內(nèi)容,是下邊登錄的密碼
6.5、訪問測(cè)試(Chrome)

現(xiàn)在新版本可以直接在Chrome訪問了

192.168.100.101:30143(IP是集群任意節(jié)點(diǎn)IP,端口是上邊service/kubernetes-dashboard的port值)
k8s二進(jìn)制部署詳解,kubernetes,kubernetes,架構(gòu),docker,云計(jì)算

輸入上一步獲取的token后,登錄有如下內(nèi)容即為成功

k8s二進(jìn)制部署詳解,kubernetes,kubernetes,架構(gòu),docker,云計(jì)算

7、再裝一個(gè)metrics

實(shí)現(xiàn)目的:可以通過kubectl top xxx看狀態(tài)等

7.1、拉取官方配置

如果拉取不到,可以點(diǎn)這里下載,為本次文章使用的所有軟件包,官方拉取純凈版

mkdir /opt/kubernetes/metrics && cd /opt/kubernetes/metrics
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
7.2、修改配置

因?yàn)閥aml里用的鏡像是國(guó)外的,所以要改一下

先找一個(gè)可用的鏡像

[root@k8s-master1 metrics]# docker search metrics-server
NAME                                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mirrorgooglecontainers/metrics-server-amd64                                                   17
bitnami/metrics-server                        Bitnami Docker Image for Metrics Server         13                   [OK]
rancher/metrics-server                                                                        5
rancher/metrics-server-amd64          
                                                    2

修改yaml中鏡像

原內(nèi)容:
        image: k8s.gcr.io/metrics-server/metrics-server:v0.6.2
        imagePullPolicy: IfNotPresent
改為:
        image: bitnami/metrics-server:0.6.2
        imagePullPolicy: IfNotPresent

添加不驗(yàn)證證書配置

不然啟動(dòng)后describe時(shí)events里會(huì)報(bào)Readiness probe failed: HTTP probe failed with statuscode: 500

原內(nèi)容:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s

        image: bitnami/metrics-server:0.6.2
新增:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls    # 新增的這個(gè),不驗(yàn)證證書

        image: bitnami/metrics-server:0.6.2
7.3、拉起服務(wù)及驗(yàn)證
kubectl apply -f components.yaml
[root@k8s-master1 metrics]# kubectl get pod -n kube-system |grep metr
metrics-server-7c65894ccb-8dxnr            1/1     Running   0          5m32s

 # 驗(yàn)證
 [root@k8s-master1 metrics]# kubectl top nodes
NAME          CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8s-master1   176m         8%     1329Mi          70%
k8s-node1     76m          3%     985Mi           52%
k8s-node2     83m          4%     1065Mi          56%

到此,基本上就差不多了,下邊為擴(kuò)展(集群擴(kuò)容、高可用)內(nèi)容

四、擴(kuò)容-新增master節(jié)點(diǎn)(高可用架構(gòu))

k8s集群利用deployment實(shí)現(xiàn)對(duì)pod應(yīng)用級(jí)的高可用,那么master節(jié)點(diǎn)上的etcd、apiserver、scheduler和controller manager要怎么實(shí)現(xiàn)高可用呢?
首先這四者的運(yùn)行高可用方式是有區(qū)別的

etcd: 我們這次就已經(jīng)部署分布式的三節(jié)點(diǎn)etcd集群了,即為高可用

scheduler、controller manager:

  • 是依賴ETCD實(shí)現(xiàn)選主的功能,同一時(shí)間只有一個(gè)leader節(jié)點(diǎn)工作。
  • 他們每個(gè)節(jié)點(diǎn)都會(huì)在etcd中注冊(cè)endpoint信息,會(huì)定期更新注冊(cè)信息(相當(dāng)于心跳了)
  • 每個(gè)從節(jié)點(diǎn)的服務(wù)會(huì)定期檢查endpoint的信息,如果endpoint的信息在時(shí)間范圍內(nèi)沒有更新,它們會(huì)嘗試更新自己為leader節(jié)點(diǎn)。

apiserver:

  • 接入層服務(wù),集群的唯一入口,相當(dāng)于一個(gè)無狀態(tài)的服務(wù)
  • 不同于scheduler和controller,需要借助etcd來選主,多節(jié)點(diǎn)時(shí),無論在哪個(gè)apiserver節(jié)點(diǎn)請(qǐng)求,都是相同的結(jié)果
  • 高可用可以多建幾個(gè)apiserver的實(shí)例,然后通過nginx負(fù)載均衡+keepalived(VIP)來實(shí)現(xiàn)高可用

粗淺的高可用架構(gòu)圖
k8s二進(jìn)制部署詳解,kubernetes,kubernetes,架構(gòu),docker,云計(jì)算

話不多說,繼續(xù)

1、部署新增master2節(jié)點(diǎn)

按照規(guī)劃,這里要新增一臺(tái)192.168.100.104機(jī)器,劃為master2

1.1、系統(tǒng)初始化+安裝docker

這個(gè)前邊步驟里都有,就不贅述了,按照前邊的步驟
【二.1、系統(tǒng)初始化】和【三.2、安裝docker】操作即可

1.2、開始部署

因master2的部署操作和master1基本一致,所以就把配置文件拷貝過來,修改下啟動(dòng)服務(wù)即可

# 創(chuàng)建etcd的ssl目錄(master2中操作)
mkdir /opt/etcd

# 拷貝master1文件(master1中操作)
scp -r /opt/kubernetes/ 192.168.100.104:/opt/
scp -r /opt/etcd/ssl/ 192.168.100.104:/opt/etcd/
scp /usr/lib/systemd/system/kube* 192.168.100.104:/usr/lib/systemd/system/
scp /usr/bin/kubectl 192.168.100.104:/usr/bin/

# 刪除kubelet自動(dòng)生成的配置(master2中操作)
rm -f /opt/kubernetes/cfg/kubelet.kubeconfig 
rm -f /opt/kubernetes/ssl/kubelet*
1.3、修改配置(master2中操作)
vim /opt/kubernetes/cfg/kube-apiserver.conf 
...
--bind-address=192.168.100.104 \
--advertise-address=192.168.100.104 \
...

vim /opt/kubernetes/cfg/kube-controller-manager.kubeconfig
server: https://192.168.100.104:6443

vim /opt/kubernetes/cfg/kube-scheduler.kubeconfig
server: https://192.168.100.104:6443

vim /opt/kubernetes/cfg/kubelet.conf
--hostname-override=k8s-master2

vim /opt/kubernetes/cfg/kube-proxy-config.yml
hostnameOverride: k8s-master2

vim ~/.kube/config
...
server: https://192.168.100.104:6443
1.4、啟動(dòng)服務(wù)(master2中操作)
systemctl daemon-reload
systemctl start kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy
systemctl enable kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy
systemctl status kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy
1.5、審批kubelet的申請(qǐng)(master1中操作)
[root@k8s-master1 opt]# kubectl get csr
NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           REQUESTEDDURATION   CONDITION
node-csr-iMojU9INDQmkgNOCvh8IbW33qj8CQ4sj2Tsizet-mKQ   10m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   <none>              Pending
[root@k8s-master1 opt]# kubectl certificate approve node-csr-iMojU9INDQmkgNOCvh8IbW33qj8CQ4sj2Tsizet-mKQ
certificatesigningrequest.certificates.k8s.io/node-csr-iMojU9INDQmkgNOCvh8IbW33qj8CQ4sj2Tsizet-mKQ approved
[root@k8s-master1 opt]# kubectl get csr
NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           REQUESTEDDURATION   CONDITION
node-csr-iMojU9INDQmkgNOCvh8IbW33qj8CQ4sj2Tsizet-mKQ   11m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   <none>              Approved,Issued
1.6、驗(yàn)證
# master1中操作
[root@k8s-master1 opt]# kubectl get nodes -owide
NAME          STATUS     ROLES    AGE   VERSION    INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
k8s-master1   Ready      <none>   8d    v1.23.15   192.168.100.101   <none>        CentOS Linux 7 (Core)   3.10.0-1127.el7.x86_64   docker://20.10.21
k8s-master2   NotReady   <none>   38s   v1.23.15   192.168.100.104   <none>        CentOS Linux 7 (Core)   3.10.0-1127.el7.x86_64   docker://20.10.21
k8s-node1     Ready      <none>   8d    v1.23.15   192.168.100.102   <none>        CentOS Linux 7 (Core)   3.10.0-1127.el7.x86_64   docker://20.10.21
k8s-node2     Ready      <none>   8d    v1.23.15   192.168.100.103   <none>        CentOS Linux 7 (Core)   3.10.0-1127.el7.x86_64   docker://20.10.21

# 需要等待片刻,等calico在master2節(jié)點(diǎn)上拉起后,節(jié)點(diǎn)才會(huì)變?yōu)閞eady

# master2中操作
[root@k8s-master2 opt]# kubectl get nodes -owide
NAME          STATUS   ROLES    AGE   VERSION    INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
k8s-master1   Ready    <none>   8d    v1.23.15   192.168.100.101   <none>        CentOS Linux 7 (Core)   3.10.0-1127.el7.x86_64   docker://20.10.21
k8s-master2   Ready    <none>   11m   v1.23.15   192.168.100.104   <none>        CentOS Linux 7 (Core)   3.10.0-1127.el7.x86_64   docker://20.10.21
k8s-node1     Ready    <none>   8d    v1.23.15   192.168.100.102   <none>        CentOS Linux 7 (Core)   3.10.0-1127.el7.x86_64   docker://20.10.21
k8s-node2     Ready    <none>   8d    v1.23.15   192.168.100.103   <none>        CentOS Linux 7 (Core)   3.10.0-1127.el7.x86_64   docker://20.10.21

到此,實(shí)現(xiàn)了雙master集群,有條件的,上三master,這里條件有限,測(cè)試就兩個(gè)了。生產(chǎn)環(huán)境最好是三個(gè)起。

2、部署nginx+keepalived高可用架構(gòu)

按照上圖的架構(gòu),在集群中需要增加

  • 一個(gè)nginx,實(shí)現(xiàn)請(qǐng)求負(fù)載均衡apiserver
  • 一個(gè)keepalived,實(shí)現(xiàn)用VIP訪問nginx,故障時(shí)VIP轉(zhuǎn)移,保證nginx始終可被訪問

如果是公有云的服務(wù),如騰訊云、阿里云之類的,可直接用他們的CLB、SLB什么的,效果一樣

2.1、安裝nginx+keepalived(master1/2都操作)
yum install epel-release -y
# 要安裝stream模塊
yum install nginx nginx-mod-stream keepalived -y
2.2、添加stream配置(master1/2都操作)
cat >> /etc/nginx/nginx.conf << "EOF"
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.100.101:6443;   # Master1 APISERVER IP:PORT
       server 192.168.100.104:6443;   # Master2 APISERVER IP:PORT
    }
    
    server {
       listen 16443; # 由于nginx與master節(jié)點(diǎn)復(fù)用,這個(gè)監(jiān)聽端口不能是6443,否則會(huì)沖突
       proxy_pass k8s-apiserver;
    }
}
EOF
2.3、檢測(cè)并啟動(dòng)nginx(master1/2都操作)
[root@k8s-master1 nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@k8s-master1 nginx]# systemctl start nginx
[root@k8s-master1 nginx]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

# 測(cè)試訪問一下
[root@k8s-master1 nginx]# curl -k https://192.168.100.105:16443/version
{
  "major": "1",
  "minor": "23",
  "gitVersion": "v1.23.15",
  "gitCommit": "b84cb8ab29366daa1bba65bc67f54de2f6c34848",
  "gitTreeState": "clean",
  "buildDate": "2022-12-08T10:42:57Z",
  "goVersion": "go1.17.13",
  "compiler": "gc",
  "platform": "linux/amd64"
}[root@k8s-master1 nginx]#
2.4、配置keepalived(master1/2都操作)

這里要注意修改配置

  • router_id:master1節(jié)點(diǎn)中值為nginx_master,master2節(jié)點(diǎn)中值為nginx_backup
  • state:master1節(jié)點(diǎn)中值為MASTER,master2節(jié)點(diǎn)中值為BACKUP
  • priority:master1節(jié)點(diǎn)中值為100,master2節(jié)點(diǎn)值修改為90
cd /etc/keepalived/
mv keepalived.conf keepalived.conf_bak
cat > 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    #每個(gè)keepalived節(jié)點(diǎn)的唯一標(biāo)識(shí)
}
vrrp_script check_nginx {    #監(jiān)測(cè)nginx的狀態(tài)
    script "/etc/keepalived/check_nginx.sh"    #監(jiān)控腳本
    interval 3    #檢測(cè)間隔時(shí)間,即兩秒檢測(cè)一次
    fall 2    #檢測(cè)失敗的最大次數(shù),超過兩次認(rèn)為節(jié)點(diǎn)資源發(fā)生故障
    weight -20    #自動(dòng)調(diào)整優(yōu)先級(jí)的參數(shù),檢測(cè)成功優(yōu)先級(jí)不變,失敗則優(yōu)先級(jí)-20,就會(huì)發(fā)生切換
}

vrrp_instance VI_1 {
    state MASTER    #虛擬路由器的初始狀態(tài),可選擇MASTER或者BACKUP
    interface ens33    #要修改為實(shí)際網(wǎng)卡名
    virtual_router_id 51    #每個(gè)虛擬路由的唯一標(biāo)識(shí)ID,本次master和backup同屬一個(gè)路由,所以值要保持一致
    priority 100    #當(dāng)前節(jié)點(diǎn)的優(yōu)先級(jí),值越大越優(yōu)先,主節(jié)點(diǎn)比備節(jié)點(diǎn)大即可
    advert_int 1    #VRRP通告的時(shí)間間隔,默認(rèn)為1秒
    authentication {    #設(shè)置同一虛擬路由之間的認(rèn)證機(jī)制
        auth_type PASS    #認(rèn)證類型,這里用密碼
        auth_pass 1111    #預(yù)共享密鑰,僅前8位有效(就是配置的密碼,可以配置為隨機(jī)數(shù),但是master和backup要一致)
    }
    virtual_ipaddress {    #配置VIP
        192.168.100.105/24    #要保證這個(gè)IP沒有被占用
    }
    track_script {    #定義執(zhí)行的跟蹤腳本
        check_nginx
    }
}

EOF
2.5、配置檢測(cè)nginx狀態(tài)腳本

實(shí)現(xiàn)效果:

  • 使用ss命令去檢測(cè)nginx的16443端口是否存活
    • 如果端口存在,則返回狀態(tài)0,keepalived不做任何處理
    • 如果端口不存在,則嘗試重啟nginx,重新判斷端口是否存活
      • 如果端口不存在,則返回狀態(tài)為1,keepalived會(huì)做master降級(jí),VIP漂移操作
      • 如果端口存在,則返回狀態(tài)為0,keepalived不做任何處理
cat > check_nginx.sh << "EOF"
#!/bin/bash
count=$(ss -antp |grep 16443 |wc -l)

if [ "$count" -eq 0 ];then
    systemctl restart nginx    # 嘗試重啟nginx
    sleep 2
    count=$(ss -antp |grep 16443 |wc -l)  # 這里要重新賦值才行
    if [ $count -eq 0 ];then
      echo "$count"
      exit 1
    else
      exit 0
  fi
else
  exit 0
fi
EOF
chmod +x check_nginx.sh
2.6、啟動(dòng)keepalived
systemctl start keepalived
systemctl enable keepalived

# 驗(yàn)證,剛開始啟動(dòng),因?yàn)閙aster1優(yōu)先級(jí)高,所以VIP是在master1上
[root@k8s-master1 keepalived]# ip a |grep ens33 -A 3
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:3a:0d:16 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.101/24 brd 192.168.100.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.100.105/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::30c0:4897:a86f:f217/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

# 測(cè)試訪問
[root@k8s-master1 keepalived]# curl -k https://192.168.100.105:16443/version
{
  "major": "1",
  "minor": "23",
  "gitVersion": "v1.23.15",
  "gitCommit": "b84cb8ab29366daa1bba65bc67f54de2f6c34848",
  "gitTreeState": "clean",
  "buildDate": "2022-12-08T10:42:57Z",
  "goVersion": "go1.17.13",
  "compiler": "gc",
  "platform": "linux/amd64"
}[root@k8s-master1 keepalived]#
2.7、測(cè)試VIP漂移效果

首先要注釋掉nginx檢測(cè)腳本里的重啟nginx指令,不然停止nginx后,keepalived又自動(dòng)拉起了

# 注釋掉重啟命令,測(cè)試完別忘了打開
[root@k8s-master1 keepalived]# cat check_nginx.sh
......
    #systemctl restart nginx
......

master1中手動(dòng)停止nginx

[root@k8s-master1 keepalived]# systemctl stop nginx
[root@k8s-master1 keepalived]# ss -antp |grep 16443
# master1中查看vip是否還在
[root@k8s-master1 keepalived]# ip a |grep ens33 -A 3
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:3a:0d:16 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.101/24 brd 192.168.100.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::30c0:4897:a86f:f217/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
# 查看keepalived狀態(tài)
[root@k8s-master1 keepalived]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-12-31 16:15:33 CST; 11min ago
 Main PID: 88195 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─88195 /usr/sbin/keepalived -D
           ├─88196 /usr/sbin/keepalived -D
           ├─88197 /usr/sbin/keepalived -D
           ├─99640 /usr/sbin/keepalived -D
           ├─99642 /bin/bash /etc/keepalived/check_nginx.sh
           └─99658 sleep 2

Dec 31 16:26:14 k8s-master1 Keepalived_vrrp[88197]: /etc/keepalived/check_nginx.sh exited with status 1
Dec 31 16:26:17 k8s-master1 Keepalived_vrrp[88197]: /etc/keepalived/check_nginx.sh exited with status 1
Dec 31 16:26:20 k8s-master1 Keepalived_vrrp[88197]: /etc/keepalived/check_nginx.sh exited with status 1
......          

master2中查看效果

[root@k8s-master2 keepalived]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-12-31 16:13:01 CST; 15min ago
 Main PID: 50116 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─50116 /usr/sbin/keepalived -D
           ├─50117 /usr/sbin/keepalived -D
           └─50118 /usr/sbin/keepalived -D

Dec 31 16:24:53 k8s-master2 Keepalived_vrrp[50118]: Sending gratuitous ARP on ens33 for 192.168.100.105
Dec 31 16:24:53 k8s-master2 Keepalived_vrrp[50118]: Sending gratuitous ARP on ens33 for 192.168.100.105
......
[root@k8s-master2 keepalived]# ip a |grep ens33 -A 3
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ad:ec:3f brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.104/24 brd 192.168.100.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.100.105/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::e166:6ae9:6fa:258e/64 scope link noprefixroute
       valid_lft forever preferred_lft forever 

測(cè)試訪問

注意:別在master1上curl,不然會(huì)有16443的進(jìn)程,被keepalived檢測(cè)到,就會(huì)導(dǎo)致VIP又漂到master1上了

[root@k8s-master2 keepalived]# curl -k https://192.168.100.105:16443/version
{
  "major": "1",
  "minor": "23",
  "gitVersion": "v1.23.15",
  "gitCommit": "b84cb8ab29366daa1bba65bc67f54de2f6c34848",
  "gitTreeState": "clean",
  "buildDate": "2022-12-08T10:42:57Z",
  "goVersion": "go1.17.13",
  "compiler": "gc",
  "platform": "linux/amd64"
}[root@k8s-master2 keepalived]#

請(qǐng)求日志

[root@k8s-master2 keepalived]# tail -f /var/log/nginx/k8s-access.log
192.168.100.104 192.168.100.101:6443 - [31/Dec/2022:16:06:16 +0800] 200 418
192.168.100.104 192.168.100.101:6443 - [31/Dec/2022:16:10:46 +0800] 200 85
192.168.100.104 192.168.100.104:6443 - [31/Dec/2022:16:10:52 +0800] 200 418

驗(yàn)證沒問題之后,可以把master1上的nginx檢測(cè)腳本恢復(fù),就會(huì)自動(dòng)把nginx拉起了

3、調(diào)整所有節(jié)點(diǎn)上的server配置

之前部署時(shí),所有kube服務(wù)里的apiserver配置還都是192.168.100.101:6443,即master1的apiserver地址
所以現(xiàn)在雖然VIP已經(jīng)生效,但是服務(wù)并沒有去調(diào)用這個(gè)地址
因此最后一步就是,修改所有節(jié)點(diǎn)上的配置文件(包括master和node),讓服務(wù)去調(diào)用

說是配置文件,其實(shí)也就只是kubeconfig文件

sed -i "s/192.168.100.101:6443/192.168.100.105:16443/g" /opt/kubernetes/cfg/*


# 驗(yàn)證訪問
[root@k8s-master1 cfg]# kubectl get nodes
NAME          STATUS   ROLES    AGE   VERSION
k8s-master1   Ready    <none>   9d    v1.23.15
k8s-master2   Ready    <none>   21h   v1.23.15
k8s-node1     Ready    <none>   9d    v1.23.15
k8s-node2     Ready    <none>   9d    v1.23.15

好了,這次是真結(jié)束了,恭喜,一套二進(jìn)制部署的高可用k8s集群就完成了??
End…文章來源地址http://www.zghlxwxcb.cn/news/detail-792442.html

到了這里,關(guān)于k8s1.23.15版本二進(jìn)制部署/擴(kuò)容及高可用架構(gòu)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • k8s 1.28版本二進(jìn)制安裝

    k8s 1.28版本二進(jìn)制安裝

    ??二進(jìn)制安裝比較復(fù)雜,但是也比較穩(wěn)定,適用于線上環(huán)境使用。 ??本筆記參考自:https://github.com/cby-chen/Kubernetes ,針對(duì)文中內(nèi)容,有部分鏡像無法拉取等,還有一部分有點(diǎn)小問題,自己有做一些小的提示、修改。建議參考本文安裝即可。 kubernetes(k8s)二進(jìn)制高可用安

    2024年02月04日
    瀏覽(26)
  • k8s的二進(jìn)制部署(源碼包部署)

    k8s的二進(jìn)制部署(源碼包部署)

    實(shí)驗(yàn)條件: 主機(jī)名 IP地址 組件 作用 master01 20.0.0.17 kube-apiserver、kube-controller-manager、kube-scheduler、etcd k8s部署 master02 20.0.0.27 kube-apiserver、kube-controller-manager、kube-scheduler node01 20.0.0.37 kubelet、kube-proxy、etcd node02 20.0.0.47 kubelet、kube-proxy、etcd nginx01 20.0.0.11 nginx、keepalived 負(fù)載均衡

    2024年02月04日
    瀏覽(19)
  • K8S二進(jìn)制部署詳解,一文教會(huì)你部署高可用K8S集群

    Pod網(wǎng)段: 10.0.0.0/16 Service網(wǎng)段: 10.255.0.0/16 集群角色 ip 主機(jī)名 安裝組件 控制節(jié)點(diǎn) 10.10.0.10 master01 apiserver、controller-manager、scheduler、etcd、docker、keepalived、nginx 控制節(jié)點(diǎn) 10.10.0.11 master02 apiserver、controller-manager、scheduler、etcd、docker、keepalived、nginx 控制節(jié)點(diǎn) 10.10.0.12 master03 apiser

    2024年04月28日
    瀏覽(29)
  • K8s集群部署(二進(jìn)制安裝部署詳細(xì)手冊(cè))

    K8s集群部署(二進(jìn)制安裝部署詳細(xì)手冊(cè))

    ? ?一、簡(jiǎn)介 K8s部署主要有兩種方式: 1、Kubeadm Kubeadm是一個(gè)K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。 2、二進(jìn)制 ? 從github下載發(fā)行版的二進(jìn)制包,手動(dòng)部署每個(gè)組件,組成Kubernetes集群。 ?本文通過二進(jìn)制安裝部署的方式在centos7上搭建kubernetes集群

    2024年02月15日
    瀏覽(20)
  • 二進(jìn)制安裝1.26版本k8s(docker)

    二進(jìn)制安裝1.26版本k8s(docker)

    v1.24.0 - v1.26.0 之前支持docker,但是需要額外安裝cri-docker來充當(dāng)墊片 由于工作原因作者會(huì)同時(shí)使用Ubuntu和CentOS,因此本次將兩個(gè)系統(tǒng)的K8S安裝一起記錄一下(與CentOS7.9、Ubuntu2004驗(yàn)證) 證書采用cfssl工具制作 使用二進(jìn)制方式部署3主1從高可用集群 etcd采用二進(jìn)制部署,復(fù)用3個(gè)管理

    2024年02月10日
    瀏覽(36)
  • k8s v1.27.4二進(jìn)制部署記錄

    k8s v1.27.4二進(jìn)制部署記錄

    記錄二進(jìn)制部署過程 CPU不足,有兩個(gè)節(jié)點(diǎn)calico沒起來

    2024年02月12日
    瀏覽(48)
  • 【云原生K8s】二進(jìn)制部署單master K8s+etcd集群

    【云原生K8s】二進(jìn)制部署單master K8s+etcd集群

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mater節(jié)點(diǎn) master01 192.168.190.10 kube-apiserver kube-controller-manager kube-scheduler etcd ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? node節(jié)點(diǎn) node01 192.168.190.20 kubelet kube-proxy docker (容器引擎) node02 192.168.190.30 kubelet kube-proxy do

    2024年02月14日
    瀏覽(30)
  • [kubernetes]二進(jìn)制部署k8s集群-基于containerd

    k8s從1.24版本開始不再直接支持docker,但可以自行調(diào)整相關(guān)配置,實(shí)現(xiàn)1.24版本后的k8s還能調(diào)用docker。其實(shí)docker自身也是調(diào)用containerd,與其k8s通過docker再調(diào)用containerd,不如k8s直接調(diào)用containerd,以減少性能損耗。 除了containerd,比較流行的容器運(yùn)行時(shí)還有podman,但是podman官方安裝

    2024年02月12日
    瀏覽(30)
  • 【云原生】二進(jìn)制部署k8s集群(中)搭建node節(jié)點(diǎn)

    【云原生】二進(jìn)制部署k8s集群(中)搭建node節(jié)點(diǎn)

    在上文已經(jīng)成功部署了etcd分布式數(shù)據(jù)庫、master01節(jié)點(diǎn), 本文將承接上文的內(nèi)容,繼續(xù)部署Kubernetes集群中的 worker node 節(jié)點(diǎn)和 CNI 網(wǎng)絡(luò)插件 kubelet 采用 TLS Bootstrapping 機(jī)制,自動(dòng)完成到 kube-apiserver 的注冊(cè),在 node 節(jié)點(diǎn)量較大或者后期自動(dòng)擴(kuò)容時(shí)非常有用。 ? Master apiserver 啟用 T

    2024年02月09日
    瀏覽(28)
  • 【云原生】K8S二進(jìn)制搭建二:部署CNI網(wǎng)絡(luò)組件

    【云原生】K8S二進(jìn)制搭建二:部署CNI網(wǎng)絡(luò)組件

    解決了什么問題? 容器鏡像(帶有應(yīng)用程序規(guī)范的文件)必須以標(biāo)準(zhǔn)化,安全和隔離的方式啟動(dòng) 標(biāo)準(zhǔn)化,因?yàn)闊o論它們?cè)诤翁庍\(yùn)行,都需要標(biāo)準(zhǔn)的操作規(guī)則。 安全,因?yàn)槟悴幌M魏尾粦?yīng)該訪問它的人,對(duì)它操作。 隔離,因?yàn)槟悴幌M麘?yīng)用程序影響其他應(yīng)用,或受其他應(yīng)用

    2024年02月10日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包