??作者簡介:一名運維工作人員。
??宣言:人生就是B(birth)和D(death)之間的C(choise),做好每一個選擇。
??創(chuàng)作不易,動動小手給個點贊加關(guān)注吧,有什么意見評論區(qū)告訴我,一起學(xué)習(xí)。?
?一、前言
生產(chǎn)環(huán)境中有兩種部署k8s的方法:
? ? ? ?
kubeadm
Kubeadm是一個K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。二進制包
從github下載發(fā)行版的二進制包,手動部署每個組件,組成Kubernetes集群。
小結(jié):Kubeadm降低部署門檻,但屏蔽了很多細節(jié),遇到問題很難排查。如果想更容易可控,推薦使用二進制包部署Kubernetes集群,雖然手動部署麻煩點,期間可以學(xué)習(xí)很多工作原理,也利于后期維護。這里就使用二進制的方式來部署k8s,在企業(yè)中一般也是使用二級制來部署。
1、kubernetes核心概念
- k8s-master 負責任務(wù)調(diào)度,控制節(jié)點
- k8s-node1 承載運行pod(容器)
- k8s-node2 承載運行pod(容器
1)Master
Master主要負責資源調(diào)度,控制pod副本,和提供統(tǒng)一訪問集群的入口。--核心節(jié)點也是管理節(jié)點
2)Node
Node是Kubernetes集群架構(gòu)中運行Pod的服務(wù)節(jié)點。Node是Kubernetes集群操作的單元,用來承載被分配Pod的運行,是Pod運行的宿主機,由Master管理,并匯報容器狀態(tài)給Master,同時根據(jù)Master要求管理容器生命周期。
3)Node IP
? ?Node節(jié)點的IP地址,是Kubernetes集群中每個節(jié)點的物理網(wǎng)卡的IP地址,是真實存在的物理網(wǎng)絡(luò),所有屬于這個網(wǎng)絡(luò)的服務(wù)器之間都能通過這個網(wǎng)絡(luò)直接通信;
4)Pod
? ?Pod直譯是豆莢,可以把容器想像成豆莢里的豆子,把一個或多個關(guān)系緊密的豆子包在一起就是豆莢(一個Pod)。在k8s中我們不會直接操作容器,而是把容器包裝成Pod再進行管理運行于Node節(jié)點上, 若干相關(guān)容器的組合。Pod內(nèi)包含的容器運行在同一宿主機上,使用相同的網(wǎng)絡(luò)命名空間、IP地址和端口,能夠通過localhost進行通信。Pod是k8s進行創(chuàng)建、調(diào)度和管理的最小單位,它提供了比容器更高層次的抽象,使得部署和管理更加靈活。一個Pod可以包含一個容器或者多個相關(guān)容器。
? ?Pod 就是 k8s 集群里的"應(yīng)用";而一個平臺應(yīng)用,可以由多個容器組成。
二、服務(wù)器規(guī)劃
1、一Matser雙Node
因為電腦配置原因,做不了高可用,所以以一主二從為例。
1)服務(wù)器規(guī)劃
主機 | IP | 組件 |
---|---|---|
k8s-master???????? | 192.168.79.148 | kube-apiserver,kube-controller-manager,kube-scheduler,etcd |
k8s-node1 |
192.168.79.149 | kubelet,kube-proxy,docker,etcd |
k8s-node2 | 192.168.79.150 | kubelet,kube-proxy,docker,etcd |
2)服務(wù)器架構(gòu)
?Kubernetes Master:
集群控制節(jié)點,負責整個集群的管理和控制,基本上Kubernetes所有的控制命令都是發(fā)給它,它來負責具體的執(zhí)行過程,我們后面所有執(zhí)行的命令基本都是在Master節(jié)點上運行的;
包含如下組件:
1.Kubernetes API Server
作為Kubernetes系統(tǒng)的入口,其封裝了核心對象的增刪改查操作,以RESTful API接口方式提供給外部客戶和內(nèi)部組件調(diào)用。維護的REST對象持久化到Etcd中存儲。2.Kubernetes Scheduler
為新建立的Pod進行節(jié)點(node)選擇(即分配機器),負責集群的資源調(diào)度。組件抽離,可以方便替換成其他調(diào)度器。3.Kubernetes Controller
負責執(zhí)行各種控制器,目前已經(jīng)提供了很多控制器來保證Kubernetes的正常運行。
? ?Replication Controller
? ? ? ?管理維護Replication Controller,關(guān)聯(lián)Replication Controller和Pod,保證Replication Controller定義的副本數(shù)量與實際運行Pod數(shù)量一致。?? Deployment Controller
? ? ? ?管理維護Deployment,關(guān)聯(lián)Deployment和Replication ?Controller,保證運行指定數(shù)量的Pod。當Deployment更新時,控制實現(xiàn)Replication ?Controller和 Pod的更新。? ?Node Controller
? ? ? 管理維護Node,定期檢查Node的健康狀態(tài),標識出(失效|未失效)的Node節(jié)點。? ?Namespace Controller
? ? ? 管理維護Namespace,定期清理無效的Namespace,包括Namesapce下的API對象,比如Pod、Service等。? ?Service Controller
? ? ? 管理維護Service,提供負載以及服務(wù)代理。? ?EndPoints Controller
? ? ? 管理維護Endpoints,關(guān)聯(lián)Service和Pod,創(chuàng)建Endpoints為Service的后端,當Pod發(fā)生變化時,實時更新Endpoints。? ?Service Account Controller
? ? ? 管理維護Service Account,為每個Namespace創(chuàng)建默認的Service Account,同時為Service Account創(chuàng)建Service Account Secret。? ?Persistent Volume Controller
? ? ? 管理維護Persistent Volume和Persistent Volume ?Claim,為新的Persistent Volume Claim分配Persistent Volume進行綁定,為釋放的Persistent ?Volume執(zhí)行清理回收。? ?Daemon Set Controller
? ? ? 管理維護Daemon Set,負責創(chuàng)建Daemon Pod,保證指定的Node上正常的運行Daemon Pod。Job Controller
? ? ? 管理維護Job,為Jod創(chuàng)建一次性任務(wù)Pod,保證完成Job指定完成的任務(wù)數(shù)目? ?Pod Autoscaler Controller
? ? ? 實現(xiàn)Pod的自動伸縮,定時獲取監(jiān)控數(shù)據(jù),進行策略匹配,當滿足條件時執(zhí)行Pod的伸縮動作。Kubernetes Node:
除了Master,Kubernetes集群中的其他機器被稱為Node節(jié)點,Node節(jié)點才是Kubernetes集群中的工作負載節(jié)點,每個Node都會被Master分配一些工作負載(Docker容器),當某個Node宕機,其上的工作負載會被Master自動轉(zhuǎn)移到其他節(jié)點上去;包含如下組件:
1.Kubelet
負責管控容器,Kubelet會從Kubernetes API Server接收Pod的創(chuàng)建請求,啟動和停止容器,監(jiān)控容器運行狀態(tài)并匯報給Kubernetes API Server。2.Kubernetes Proxy
負責為Pod創(chuàng)建代理服務(wù),Kubernetes Proxy會從Kubernetes API ?Server獲取所有的Service信息,并根據(jù)Service的信息創(chuàng)建代理服務(wù),實現(xiàn)Service到Pod的請求路由和轉(zhuǎn)發(fā),從而實現(xiàn)Kubernetes層級的虛擬轉(zhuǎn)發(fā)網(wǎng)絡(luò)。3.Docker Engine(docker),Docker引擎,負責本機的容器創(chuàng)建和管理工作; ?
4.網(wǎng)絡(luò)插件:解決node之間pod的通信問題。數(shù)據(jù)庫
etcd數(shù)據(jù)庫,可以部署到master、node上,推薦獨立部署
分布式鍵值存儲系統(tǒng)。用于保存集群狀態(tài)數(shù)據(jù),比如Pod、Service等對象信息
3)配置主機映射?
[root@k8s-master ~]# vim /etc/hosts
[root@k8s-master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.79.148 k8s-master
192.168.79.149 k8s-node1
192.168.79.150 k8s-node2
?使用scp將hosts文件發(fā)送給node1和node2。
三、Etc集群
Etcd 是一個分布式鍵值存儲系統(tǒng),Kubernetes使用Etcd進行數(shù)據(jù)存儲,所以先準備一個Etcd數(shù)據(jù)庫,為解決Etcd單點故障,應(yīng)采用集群方式部署,這里使用3臺組建集群,可容忍1臺機器故障,當然,你也可以使用5臺組建集群,可容忍2臺機器故障。
注:為了節(jié)省機器,這里與K8s節(jié)點機器復(fù)用。也可以獨立于k8s集群之外部署,只要apiserver能連接到就行
1、準備cfssl證書生成工具
cfssl是一個開源的證書管理工具,使用json文件生成證書,相比openssl更方便使用。
cfssl工具的網(wǎng)盤
鏈接:https://pan.baidu.com/s/1zf6ZaDYS2r4OZWz0zHr7zQ?pwd=nar2?
提取碼:nar2?
這里我用rz將本地的cfssl工具拷到虛擬機,然后給他們執(zhí)行的命令,為了方便使用這些工具,將這些拷到/usr/bin目錄下。
這樣就可以直接使用cfssl、cfssl-certinfo、cfssljson這三個命令了。
2、生成Etcd證書
1)自簽證書頒發(fā)機構(gòu)(CA)
先創(chuàng)建工作目錄,并進入到該目錄
mkdir opt/etcd -p
cd opt/etcd
[root@k8s-master1 etcd]#vim ca-config.json
[root@k8s-master etcd]# cat ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
[root@k8s-master etcd]# cat ca-csr.json
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
2)生成證書
[root@k8s-master etcd]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
[root@k8s-master etcd]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
可以看到當前目錄多了兩個ca-key.pem ?ca.pem文件,這就是證書文件。
3)使用自簽CA簽發(fā)Etcd HTTPS證書
創(chuàng)建證書申請文件
[root@k8s-master1 etcd]# vim server-csr.json
[root@k8s-master etcd]# cat server-csr.json
{
"CN": "etcd",
"hosts": [
"192.168.79.148",
"192.168.79.149",
"192.168.79.150"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
上述文件hosts字段中IP為所有etcd節(jié)點的集群內(nèi)部通信IP,一個都不能少。
#生成證書
[root@k8s-master1 etcd]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
#查看證書生成情況
[root@k8s-master etcd]# ls *pem
ca-key.pem ca.pem server-key.pem server.pem
又多出server-key.pem和server.pem文件。
3、部署Etcd集群
首先需要etcd的二進制文件。
etcd的二進制文件的網(wǎng)盤。
鏈接:https://pan.baidu.com/s/1va2DkgJSZ-lL5T5xBKVodg?pwd=j5gt?
提取碼:j5gt?
1)獲取etcd的軟件包
注意:我這里為了防止etcd目錄下文件太多太亂,先進入到了家目錄,然后通過rz將本地的etcd包拷到虛擬機。
2)解壓etcd包
?解壓后在etcd-v3.4.9-linux-amd64目錄下有etcd和etcdctl兩個可執(zhí)行的文件。
[root@k8s-master ~]# tar xfz etcd-v3.4.9-linux-amd64.tar.gz
[root@k8s-master ~]# ls
anaconda-ks.cfg cfssl_1.6.4_linux_amd64 cfssl-certinfo_1.6.4_linux_amd64 cfssljson_1.6.4_linux_amd64 etcd-v3.4.9-linux-amd64 etcd-v3.4.9-linux-amd64.tar.gz opt
[root@k8s-master ~]# ls etcd-v3.4.9-linux-amd64
Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
3)創(chuàng)建工作目錄并且將etcd和etcdctl拷到工作目錄
[root@k8s-master ~]# mkdir -p /opt/etcd/{bin,cfg,ssl}
[root@k8s-master ~]# cp etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/
[root@k8s-master ~]# tree /opt/
/opt/
└── etcd
├── bin
│?? ├── etcd
│?? └── etcdctl
├── cfg
└── ssl
這里在/opt/etcd/目錄下創(chuàng)建了bin,cfg,ssl三個文件夾,bin存放的是命令文件,cfg存放的是?
4)創(chuàng)建etcd的配置文件
[root@k8s-master ~]# vim /opt/etcd/cfg/etcd.conf
[root@k8s-master ~]# cat /opt/etcd/cfg/etcd.conf
#[Member]
ETCD_NAME="etcd-1"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.79.148:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.79.148:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.79.148:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.79.148:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.79.148:2380,etcd-2=https://192.168.79.149:2380,etcd-3=https://192.168.79.150:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
?*參數(shù)解釋
?????? ETCD_NAME:節(jié)點名稱,集群中唯一
?????? ETCD_DATA_DIR:數(shù)據(jù)目錄
?????? ETCD_LISTEN_PEER_URLS:集群通信監(jiān)聽地址,填本機ip
?????? ETCD_LISTEN_CLIENT_URLS:客戶端訪問監(jiān)聽地址,填本機ip
?????? ETCD_INITIAL_ADVERTISE_PEERURLS:集群通告地址,填本機ip
?????? ETCD_ADVERTISE_CLIENT_URLS:客戶端通告地址,填本機ip
?????? ETCD_INITIAL_CLUSTER:集群節(jié)點地址
?????? ETCD_INITIALCLUSTER_TOKEN:集群Token
?????? ETCD_INITIALCLUSTER_STATE:加入集群的當前狀態(tài),new是新集群,existing表示加入已有集群
?5)system管理etcd
system管理etcd需要再/usr/lib/systemd/system下編寫相應(yīng)的service文件。
[root@k8s-master ~]# vim /usr/lib/systemd/system/etcd.service
[root@k8s-master ~]# cat /usr/lib/systemd/system/etcd.service
[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
注意這里的證書文件要記得拷到/opt/etcd/bin/目錄下,這里system管理etcd讀取的證書寫到了這個目錄,當然也可以改,就是為了方便整理,是放到了這個文件夾下。
[root@k8s-master ~]# cp opt/etcd/*pem /opt/etcd/ssl/
[root@k8s-master ~]# tree /opt/
/opt/
└── etcd
├── bin
│?? ├── etcd
│?? └── etcdctl
├── cfg
│?? └── etcd.conf
└── ssl
├── ca-key.pem
├── ca.pem
├── server-key.pem
└── server.pem
4 directories, 7 files
將這些證書和etcd.conf以及service的文件、etcd執(zhí)行文件都要拷到node1和node2上,其中etcd.conf內(nèi)需要更改ip。
6)拷貝文件到node1和node2并修改etcd.conf文件
6.1)node1和node2創(chuàng)建相同的工作目錄
mkdir /opt/etcd/{bin,cfg,ssl} -p
拷貝etcd.conf文件
[root@k8s-master ~]# scp /opt/etcd/cfg/etcd.conf k8s-node1:/opt/etcd/cfg/
[root@k8s-master ~]# scp /opt/etcd/cfg/etcd.conf k8s-node2:/opt/etcd/cfg/
#拷貝證書
[root@k8s-master ~]# scp /opt/etcd/ssl/* k8s-node1:/opt/etcd/ssl/
[root@k8s-master ~]# scp /opt/etcd/ssl/* k8s-node2:/opt/etcd/ssl/
#拷貝etcd執(zhí)行文件
[root@k8s-master ~]# scp /opt/etcd/bin/etcd k8s-node1:/opt/etcd/bin/
[root@k8s-master ~]# scp /opt/etcd/bin/etcd k8s-node2:/opt/etcd/bin/
#拷貝system管理etcd文件配置
[root@k8s-master ~]# scp /usr/lib/systemd/system/etcd.service k8s-node1:/usr/lib/systemd/system/
[root@k8s-master ~]# scp /usr/lib/systemd/system/etcd.service k8s-node2:/usr/lib/systemd/system/
6.2)修改node1上的etcd.conf文件
需要修改的位置:
ETCD_NAME
ETCD_LISTEN_PEER_URLS
ETCD_LISTEN_CLIENT_URLS
ETCD_INITIAL_ADVERTISE_PEER_URLS
ETCD_ADVERTISE_CLIENT_URLS
[root@k8s-node1 ~]# cat /opt/etcd/cfg/etcd.conf
#[Member]
ETCD_NAME="etcd-2"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.79.149:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.79.149:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.79.149:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.79.149:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.79.148:2380,etcd-2=https://192.168.79.149:2380,etcd-3=https://192.168.79.150:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
6.3)修改node2上的etcd.conf文件?
需要修改的位置:
ETCD_NAME
ETCD_LISTEN_PEER_URLS
ETCD_LISTEN_CLIENT_URLS
ETCD_INITIAL_ADVERTISE_PEER_URLS
ETCD_ADVERTISE_CLIENT_URLS
[root@k8s-node2 ~]# cat /opt/etcd/cfg/etcd.conf
#[Member]
ETCD_NAME="etcd-3"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.79.150:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.79.150:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.79.150:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.79.150:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.79.148:2380,etcd-2=https://192.168.79.149:2380,etcd-3=https://192.168.79.150:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
node1和node2都要改相應(yīng)的位置。ETCD_NAME這里要保證不能重復(fù)。
?7)啟動etcd
使用systemctl啟動服務(wù)。
這里需要注意:單啟動一個etcd,bash頁面會進入等待狀態(tài),等待集群中的另一臺啟動,因為etcd啟動至少需要集群中的兩臺都啟動,才會真正的啟動。
分別執(zhí)行這三條命令:
systemctl daemon-reload?
systemctl start etcd.service?
systemctl enable etcd.service?
#master
[root@k8s-moster ~]# systemctl daemon-reload
[root@k8s-moster ~]# systemctl start etcd.service
[root@k8s-moster ~]# systemctl enable etcd.service
#node1
[root@k8s-node1 ~]# systemctl daemon-reload
[root@k8s-node1 ~]# systemctl start etcd.service
[root@k8s-node1 ~]# systemctl enable etcd.service
#node2
[root@k8s-node2 ~]# systemctl daemon-reload
[root@k8s-node2 ~]# systemctl start etcd.service
[root@k8s-node2 ~]# systemctl enable etcd.service
因為添加了system控制etcd所以這里需要用systemctl? daemon-reload加載一下文件。?
8)查看etcd集群狀態(tài)
[root@k8s-master ~]# /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.79.148:2379,https://192.168.79.149:2379,https://192.168.79.150:2379" endpoint health --write-out=table
+-----------------------------+--------+-------------+-------+
| ENDPOINT | HEALTH | TOOK | ERROR |
+-----------------------------+--------+-------------+-------+
| https://192.168.79.148:2379 | true | 10.984284ms | |
| https://192.168.79.149:2379 | true | 11.169278ms | |
| https://192.168.79.150:2379 | true | 11.828544ms | |
+-----------------------------+--------+-------------+-------+
?etcd部署成功!如果出現(xiàn)錯誤,可以查看/var/log/messages日志進行排錯。
四、部署Master節(jié)點組件
Master節(jié)點組件:kube-apiserver,kube-controller-manager,kube-scheduler
1、下載kubernetes1.20的二進制包
將kubernetes-v1.20.4-server-linux-amd64.tar.gz拷到虛擬機
該包中包含了k8s中所需要的所有需要的組件。
該包在網(wǎng)盤中,鏈接如下:
鏈接:https://pan.baidu.com/s/1utWPPj-CJ08Tbx0AgKyMNA?pwd=xiji?
提取碼:xiji?
[root@k8s-master k8s]# cd
[root@k8s-master ~]# rz
[root@k8s-master ~]# ls
anaconda-ks.cfg cfssl_1.6.4_linux_amd64 cfssljson_1.6.4_linux_amd64 etcd-v3.4.9-linux-amd64.tar.gz opt
ca cfssl-certinfo_1.6.4_linux_amd64 etcd-v3.4.9-linux-amd64 kubernetes-v1.20.4-server-linux-amd64.tar.gz
還是一樣,我先回到家目錄然后把包拷到家目錄中。
1)創(chuàng)建k8s的部署工作目錄
[root@k8s-master ~]# mkdir /opt/kubernetes/{bin,cfg,ssl} -p
[root@k8s-master ~]# tree /opt/kubernetes/
/opt/kubernetes/
├── bin
├── cfg
└── ssl
3 directories, 0 files
2)拷貝需要的組件?
解壓kubernetes包并將kubernetes/server/bin目錄下中master需要的組件執(zhí)行文件拷到工作目錄下的bin文件夾下。
[root@k8s-master ~]# tar xfz kubernetes-v1.20.4-server-linux-amd64.tar.gz
[root@k8s-master ~]# cp kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager} /opt/kubernetes/bin/
[root@k8s-master ~]# tree /opt/kubernetes/
/opt/kubernetes/
├── bin
│ ├── kube-apiserver
│ ├── kube-controller-manager
│ └── kube-scheduler
├── cfg
└── ssl
3 directories, 3 files
3)拷貝kubectl工具?
?將kubectl拷貝到/usr/bin目錄下,kubectl是Kubernetes的命令行工具,可以用來管理Kubernetes集群。
[root@k8s-master ~]# cp kubernetes/server/bin/kubectl /usr/bin/
2、部署kube-apiserver
作為Kubernetes系統(tǒng)的入口,其封裝了核心對象的增刪改查操作,以RESTful API接口方式提供給外部客戶和內(nèi)部組件調(diào)用。維護的REST對象持久化到Etcd中存儲。
1)生成kube-apiserver證書
首先創(chuàng)建證書工作目錄
[root@k8s-master ~]# mkdir ca/k8s -p
[root@k8s-master ~]# cd ca/k8s
自簽證書頒發(fā)機構(gòu)(CA)
[root@k8s-master k8s]# vim ca-config.json
[root@k8s-master k8s]# cat ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
[root@k8s-master k8s]# vim ca-csr.json
[root@k8s-master k8s]# cat ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
生成證書
[root@k8s-master k8s]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
[root@k8s-master k8s]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
多出ca-csr.pem和ca-key.pem兩個文件。
使用自簽CA簽發(fā)kube-apiserver HTTPS證書。
[root@k8s-master k8s]# vim server-csr.json
[root@k8s-master k8s]# cat server-csr.json
{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"192.168.79.148", #master的ip
"192.168.79.149", #node的ip
"192.168.79.150", #node2的ip
"192.168.79.151", #預(yù)留ip
"192.168.79.133", #預(yù)留ip
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
生成證書
#生成證書
[root@k8s-master k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
#查看證書生成情況
[root@k8s-master k8s]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem server.csr server-csr.json server-key.pem server.pem
將生成的證書都拷貝到/opt/kubernetes/ssl文件夾,一共是四個pem文件。
[root@k8s-master ~]# cp ca/k8s/*pem /opt/kubernetes/ssl/
[root@k8s-master ~]# tree /opt/kubernetes/
/opt/kubernetes/
├── bin
│?? ├── kube-apiserver
│?? ├── kube-controller-manager
│?? └── kube-scheduler
├── cfg
└── ssl
├── ca-key.pem
├── ca.pem
├── server-key.pem
└── server.pem
3 directories, 7 files
多出兩個serber-csr和server-key.pem文件。
2)kube-apiserver配置文件
--etcd-servers=要改為自己的集群ip
--bind-address=改為自己master的ip
--advertise-address=自己的master的ip
--service-cluster-ip-range=10.0.0.0/24虛擬網(wǎng)關(guān)不要改
[root@k8s-master ~]# vim /opt/kubernetes/cfg/kube-apiserver.conf
[root@k8s-master ~]# cat /opt/kubernetes/cfg/kube-apiserver.conf
KUBE_APISERVER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--etcd-servers=https://192.168.79.148:2379,https://192.168.79.149:2379,https://192.168.79.150:2379 \
--bind-address=192.168.79.148 \
--secure-port=6443 \
--advertise-address=192.168.79.148 \
--allow-privileged=true \
--service-cluster-ip-range=10.0.0.0/24 \
--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/server.pem \
--kubelet-client-key=/opt/kubernetes/ssl/server-key.pem \
--tls-cert-file=/opt/kubernetes/ssl/server.pem \
--tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \
--client-ca-file=/opt/kubernetes/ssl/ca.pem \
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \
--service-account-issuer=api \
--service-account-signing-key-file=/opt/kubernetes/ssl/server-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/server.pem \
--proxy-client-key-file=/opt/kubernetes/ssl/server-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"
參考說明
?????? --logtostderr:啟用日志
?????? ---v:日志等級
?????? --log-dir:日志目錄
?????? --etcd-servers:etcd集群地址? ? ? ? ? ? ? ? #k8s集群的所有階段的ip
?????? --bind-address:監(jiān)聽地址? ? ? ? ????????????????#master的ip地址
?????? --secure-port:https安全端口
?????? --advertise-address:集群通告地址? ? ? ? ? ? ? ? #master的ip地址
?????? --allow-privileged:啟用授權(quán)
?????? --service-cluster-ip-range:Service虛擬IP地址段? ? ? ? #10.0.0.0/24這里不用改
?????? --enable-admission-plugins:準入控制模塊
?????? --authorization-mode:認證授權(quán),啟用RBAC授權(quán)和節(jié)點自管理
?????? --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證書
?????? 1.20版本必須加的參數(shù):--service-account-issuer,--service-account-signing-key-file
?????? --etcd-xxxfile:連接Etcd集群證書
?????? --audit-log-xxx:審計日志
?????? 啟動聚合層相關(guān)配置:--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
3)配置token文件
Master apiserver啟用TLS認證后,Node節(jié)點kubelet組件想要加入集群,必須使用CA簽發(fā)的有效證書才能與apiserver通信,當Node節(jié)點很多時,簽署證書是一件很繁瑣的事情,因此有了TLS Bootstrapping機制,kubelet會以一個低權(quán)限用戶自動向apiserver申請證書,kubelet的證書由apiserver動態(tài)簽署。
認證大致工作流程如圖所示:
#生成一個32位的隨機碼
[root@k8s-master ~]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
c47ffb939f5ca36231d9e3121a252940
[root@k8s-master ~]# vim /opt/kubernetes/cfg/token.csv
[root@k8s-master ~]# cat /opt/kubernetes/cfg/token.csv
c47ffb939f5ca36231d9e3121a252940,kubelet-bootstrap,10001,"system:node-bootstrapper"
這里的token可以自己自定義,需要和后續(xù)的配置保持一致,否則后面部署kubelet將會認證錯誤。?
4)systemd管理apiserver
[root@k8s-master ~]# vim /usr/lib/systemd/system/kube-apiserver.service
[root@k8s-master ~]# cat /usr/lib/systemd/system/kube-apiserver.service
[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
5)加載system配置并啟動apiserver設(shè)置開機自啟
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl start kube-apiserver.service
[root@k8s-master ~]# systemctl enable kube-apiserver.service
?查看api-server的服務(wù)狀態(tài)是running。
3、部署kube-controller-manager
負責執(zhí)行各種控制器,目前已經(jīng)提供了很多控制器來保證Kubernetes的正常運行。
1)編寫配置文件
[root@k8s-master ~]# vim /opt/kubernetes/cfg/kube-controller-manager.conf
[root@k8s-master ~]# cat /opt/kubernetes/cfg/kube-controller-manager.conf
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 \
--experimental-cluster-signing-duration=87600h0m0s" #簽證到期時間為10年
參數(shù)說明
?????? --kubeconfig:連接apiserver配置文件
?????? --leader-elect:當該組件啟動多個時,自動選舉(HA)
?????? --cluster-signing-cert-file/--cluster-signing-key-file:自動為kubelet頒發(fā)證書的CA,與apiserver保持一致
2)生成kube-controller-manager證書
到 ca/k8s目錄下。
#到k8s目錄
[root@k8s-master ~]# cd ca/k8s
#編寫生成證書的json文件
[root@k8s-master k8s]# vim kube-controller-manager-csr.json
[root@k8s-master k8s]# cat kube-controller-manager-csr.json
{
"CN": "system:kube-controller-manager",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
生成證書
#生成證書
[root@k8s-master k8s]# cfssl gencert -ca=/root/ca/k8s/ca.pem -ca-key=/root/ca/k8s/ca-key.pem -config=/root/ca/k8s/ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
#查看證書生成情況
[root@k8s-master k8s]# ls kube-controller-manager*
kube-controller-manager.csr kube-controller-manager-csr.json kube-controller-manager-key.pem kube-controller-manager.pem
發(fā)現(xiàn)多出kube-controller-manager-key.pem、kube-controller-manager.pem兩個文件
將生成的證書拷貝到kubernetes/ssl文件夾內(nèi)。
[root@k8s-master k8s]# cp kube-controller-manager*pem /opt/kubernetes/ssl/
[root@k8s-master k8s]# tree /opt/kubernetes/
/opt/kubernetes/
├── bin
│?? ├── kube-apiserver
│?? ├── kube-controller-manager
│?? └── kube-scheduler
├── cfg
│?? ├── kube-apiserver.conf
│?? ├── kube-controller-manager.conf
│?? └── token.csv
└── ssl
├── ca-key.pem
├── ca.pem
├── kube-controller-manager-key.pem
├── kube-controller-manager.pem
├── server-key.pem
└── server.pem
3 directories, 12 files
3)生成manager的kubeconfig文件
因為在生成該文件的時候會用到剛剛生成的證書,為了方便建議進入到存有manager證書的目錄操作
[root@k8s-master k8s]# KUBE_CONFIG="/opt/kubernetes/cfg/kube-controller-manager.kubeconfig" #生成kubeconfig文件的存放位置
[root@k8s-master k8s]# KUBE_APISERVER="https://192.168.79.148:6443" #master的ip
執(zhí)行以下四句命令。?
#設(shè)置集群參數(shù)
[root@k8s-master k8s]# kubectl config set-cluster kubernetes \
> --certificate-authority=/opt/kubernetes/ssl/ca.pem \
> --embed-certs=true \
> --server=${KUBE_APISERVER} \
> --kubeconfig=${KUBE_CONFIG}
#設(shè)置客戶端認證參數(shù)
[root@k8s-master k8s]# kubectl config set-credentials kube-controller-manager --client-certificate=./kube-controller-manager.pem --client-key=/opt/kubernetes/ssl/kube-controller-manager-key.pem --embed-certs=true --kubeconfig=${KUBE_CONFIG}
#設(shè)置上下文參數(shù)
[root@k8s-master k8s]# kubectl config set-context default \
> --cluster=kubernetes \
> --user=kube-controller-manager \
> --kubeconfig=${KUBE_CONFIG}
Context "default" created.
#設(shè)置默認上下文
[root@k8s-master k8s]# kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
?查看kubeconfig生成情況。
[root@k8s-master k8s]# tree /opt/kubernetes/
/opt/kubernetes/
├── bin
│?? ├── kube-apiserver
│?? ├── kube-controller-manager
│?? └── kube-scheduler
├── cfg
│?? ├── kube-apiserver.conf
│?? ├── kube-controller-manager.conf
│?? ├── kube-controller-manager.kubeconfig
│?? └── token.csv
└── ssl
├── ca-key.pem
├── ca.pem
├── kube-controller-manager-key.pem
├── kube-controller-manager.pem
├── server-key.pem
└── server.pem
3 directories, 13 files
在cfg,剛剛指定的位置生成了?kube-controller-manager.kubeconfig文件。
4)systemd管理controller-manager
[root@k8s-master k8s]# vim /usr/lib/systemd/system/kube-controller-manager.service
[root@k8s-master k8s]# cat /usr/lib/systemd/system/kube-controller-manager.service
[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
5)加載service并啟動controller-manager,設(shè)置開機自啟
[root@k8s-master k8s]# systemctl daemon-reload
[root@k8s-master k8s]# systemctl start kube-controller-manager.service
[root@k8s-master k8s]# systemctl enable kube-controller-manager.service
?啟動成功!
?4、部署kube-scheduler
為新建立的Pod進行節(jié)點(node)選擇(即分配機器),負責集群的資源調(diào)度。組件抽離,可以方便替換成其他調(diào)度器。
1)創(chuàng)建配置文件
[root@k8s-master k8s]# vim /opt/kubernetes/cfg/kube-scheduler.conf
[root@k8s-master k8s]# cat /opt/kubernetes/cfg/kube-scheduler.conf
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"
參數(shù)說明
?????? --kubeconfig:連接apiserver配置文件
?????? --leader-elect:當該組件啟動多個時,自動選舉(HA)
2)生成kube-scheduler證書
[root@k8s-master k8s]# vim kube-scheduler-csr.json
[root@k8s-master k8s]# cat kube-scheduler-csr.json
{
"CN": "system:kube-scheduler",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
生成證書
#生成證書
[root@k8s-master k8s]# cfssl gencert -ca=/root/ca/k8s/ca.pem -ca-key=/root/ca/k8s/ca-key.pem -config=/root/ca/k8s/ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler
#查看證書生成情況
[root@k8s-master k8s]# ls kube-scheduler*
kube-scheduler.csr kube-scheduler-csr.json kube-scheduler-key.pem kube-scheduler.pem
將證書拷貝到kubernetes/ssl文件夾。?
[root@k8s-master k8s]# cp kube-scheduler-key*pem /opt/kubernetes/ssl/
該文件夾下多出?kube-scheduler-key.pem 、kube-scheduler.pem兩個文件。
3)生成schedule的kubeconfig文件
#指定生成kubeconfig的路徑
[root@k8s-master k8s]# KUBE_CONFIG="/opt/kubernetes/cfg/kube-scheduler.kubeconfig"
#master的ip
[root@k8s-master k8s]# KUBE_APISERVER="https://192.168.79.148:6443"
執(zhí)行以下四個命令 。
#設(shè)置集群參數(shù)
[root@k8s-master k8s]# kubectl config set-cluster kubernetes \
> --certificate-authority=/opt/kubernetes/ssl/ca.pem \
> --embed-certs=true \
> --server=${KUBE_APISERVER} \
> --kubeconfig=${KUBE_CONFIG}
#設(shè)置客戶端認證參數(shù)
[root@k8s-master k8s-scheduler]# kubectl config set-credentials kube-scheduler \
> --client-certificate=./kube-scheduler.pem \
> --client-key=./kube-scheduler-key.pem \
> --embed-certs=true \
> --kubeconfig=${KUBE_CONFIG}
#設(shè)置上下文參數(shù)
[root@k8s-master k8s]# kubectl config set-context default \
> --cluster=kubernetes \
> --user=kube-scheduler \
> --kubeconfig=${KUBE_CONFIG}
#設(shè)置默認上下文
[root@k8s-master k8s]# kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
查看kubeconfig生成情況。
[root@k8s-master k8s]# tree /opt/kubernetes/
/opt/kubernetes/
├── bin
│?? ├── kube-apiserver
│?? ├── kube-controller-manager
│?? └── kube-scheduler
├── cfg
│?? ├── kube-apiserver.conf
│?? ├── kube-controller-manager.conf
│?? ├── kube-controller-manager.kubeconfig
│?? ├── kube-scheduler.conf
│?? ├── kube-scheduler.kubeconfig
│?? └── token.csv
└── ssl
├── ca-key.pem
├── ca.pem
├── kube-controller-manager-key.pem
├── kube-controller-manager.pem
├── kube-scheduler-key.pem
├── kube-scheduler.pem
├── server-key.pem
└── server.pem
3 directories, 17 files
發(fā)現(xiàn)cfg下多出了kube-scheduler.kubeconfig文件,說明生成成功!
4)systemd管理scheduler
[root@k8s-master k8s]# vim /usr/lib/systemd/system/kube-scheduler.service
[root@k8s-master k8s]# cat /usr/lib/systemd/system/kube-scheduler.service
[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
5)加載service配置,并啟動scheduler,設(shè)置開機啟動
[root@k8s-master k8s]# systemctl daemon-reload
[root@k8s-master k8s]# systemctl start kube-scheduler.service
[root@k8s-master k8s]# systemctl enable kube-scheduler.service
啟動成功!
?5、查看集群狀態(tài)
需要用到kubuctl工具。
1)生成kubectl連接集群的證書
[root@k8s-master k8s]# vim admin-csr.json
[root@k8s-master k8s]# cat admin-csr.json
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
生成證書
#生成證書
[root@k8s-master k8s]# cfssl gencert -ca=/root/ca/k8s/ca.pem -ca-key=/root/ca/k8s/ca-key.pem -config=/root/ca/k8s/ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
#查看證書生成情況
[root@k8s-master k8s]# ls admin*
admin.csr admin-csr.json admin-key.pem admin.pem
該文件夾下多出兩個pem文件。
2)生成kubeconfig文件
?創(chuàng)建存放config的目錄,這里在root下創(chuàng)建一個隱藏的文件夾,因為kubectl是個工具不是服務(wù),就直接在root下創(chuàng)建隱藏的文件夾。
[root@k8s-master k8s]# mkdir /root/.kube
#設(shè)置兩個變量分別表示生成的config的存放位置,和需要用到的master的ip
[root@k8s-master k8s]# KUBE_CONFIG="/root/.kube/config"
[root@k8s-master k8s]# KUBE_APISERVER="https://192.168.79.148:6443"
執(zhí)行以下四句命令
#設(shè)置集群參數(shù)
[root@k8s-master k8s]# kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置客戶端認證參數(shù)
[root@k8s-master k8s]# kubectl config set-credentials cluster-admin \
--client-certificate=./admin.pem \
--client-key=./admin-key.pem \
--embed-certs=true \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置上下文參數(shù)
[root@k8s-master k8s]# kubectl config set-context default \
--cluster=kubernetes \
--user=cluster-admin \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置默認上下文
[root@k8s-master k8s]# kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
3)kubectl查看集群狀態(tài)
[root@k8s-master k8s]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
scheduler Healthy ok
etcd-1 Healthy {"health":"true"}
etcd-2 Healthy {"health":"true"}
#查看命名空間
[root@k8s-master k8s]# kubectl get ns
NAME STATUS AGE
default Active 66m
kube-node-lease Active 66m
kube-public Active 66m
kube-system Active 66m
集群狀態(tài)都是healthy表示集群狀態(tài)正常,如果出錯,查看日志進行排錯。
五、部署node組件
kubelet,kube-proxy,docker,etcd
注:兩臺node的操作是一樣的。
1、安裝docker
1)下載國內(nèi)阿里云的docker源
[root@k8s-node1 ~]# wget -O /etc/yum.repos.d/docker-ce.repo
2)安裝docker(node節(jié)點都要安裝)
[root@k8s-node1 ~]# yum install -y docker-ce
#配置加速器,為了加快docker從dockerhub上pull鏡像的速度
[root@k8s-node1 ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
[root@k8s-node1 ~]# systemctl daemon-reload
[root@k8s-node1 ~]# systemctl start docker
[root@k8s-node1 ~]# systemctl enable docker
node1?
?node2
?2、創(chuàng)建node組件的工作目錄并拷問文件(node都要創(chuàng)建)
#node1
[root@k8s-node1 ~]# mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
[root@k8s-node1 ~]# tree /opt/kubernetes/
/opt/kubernetes/
├── bin
├── cfg
├── logs
└── ssl
#node2
[root@k8s-node2 ~]# mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
[root@k8s-node2 ~]# tree /opt/kubernetes/
/opt/kubernetes/
├── bin
├── cfg
├── logs
└── ssl
master將kubelet和kube-proxy以及k8s需要的ca證書拷貝給node節(jié)點
kubelet和kube-proxy都在master的kubernetes包的server/bin目錄下。
#傳到node1
[root@k8s-master ~]# scp kubernetes/server/bin/{kubelet,kube-proxy} k8s-node1:/opt/kubernetes/bin/
#傳到node2
[root@k8s-master ~]# scp kubernetes/server/bin/{kubelet,kube-proxy} k8s-node2:/opt/kubernetes/bin/
3、部署kubelet
負責管控容器,Kubelet會從Kubernetes API Server接收Pod的創(chuàng)建請求,啟動和停止容器,監(jiān)控容器運行狀態(tài)并匯報給Kubernetes API Server。
1)創(chuàng)建配置文件(node都要創(chuàng)建)
#node1
[root@k8s-node1 ~]# vim /opt/kubernetes/cfg/kubelet.conf
KUBELET_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--hostname-override=k8s-node1 \
--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"
#node2
[root@k8s-node2 ~]# vim /opt/kubernetes/cfg/kubelet.conf
KUBELET_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--hostname-override=k8s-node2 \
--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"
注意:?--hostname-override=不能一樣。其余位置不用改。
參數(shù)說明
?????? --hostname-override:顯示名稱,集群中唯一
?????? --network-plugin:啟用CNI
?????? --kubeconfig:空路徑,會自動生成,后面用于連接apiserver
?????? --bootstrap-kubeconfig:首次啟動向apiserver申請證書
?????? --config:配置參數(shù)文件
?????? --cert-dir:kubelet證書生成目錄
?????? --pod-infra-container-image:管理Pod網(wǎng)絡(luò)容器的鏡像
registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.0"這個鏡像最好提前pull下來。
2)拉取鏡像
#node1
[root@k8s-node1 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.0
#node2
[root@k8s-node2 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.0
3)配置參數(shù)文件(node都要配置)
[root@k8s-node1 ~]# vim /opt/kubernetes/cfg/kubelet-config.yml
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10.0.0.2
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
node1和node2這里的內(nèi)容是一致的,所以可以只用使用scp拷到node2的?/opt/kubernetes/cfg/下
[root@k8s-node1 ~]# scp /opt/kubernetes/cfg/kubelet-config.yml k8s-node2:/opt/kubernetes/cfg/
4)生成kubelet初次加入集群引導(dǎo)kubeconfig文件
這里需要再master節(jié)點操作。
在生成kubernetes證書的目錄下執(zhí)行以下命令生成kubeconfig文件
#授權(quán)kubelet-bootstrap用戶允許請求證書
[root@k8s-master k8s]# kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
[root@k8s-master ~]# cd ca/k8s
[root@k8s-master k8s]# KUBE_CONFIG="/opt/kubernetes/cfg/bootstrap.kubeconfig"
[root@k8s-master k8s]# KUBE_APISERVER="https://192.168.79.148:6443"
#這里的token要和上面/opt/kubernetes/cfg/token.csv的token要一樣
[root@k8s-master k8s]# TOKEN="c47ffb939f5ca36231d9e3121a252940"
執(zhí)行設(shè)置集群參數(shù)、設(shè)置客戶端認證參數(shù)、設(shè)置上下文參數(shù)、設(shè)置默認上下文四步。
#設(shè)置集群參數(shù)
[root@k8s-master k8s]# kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置客戶端認證參數(shù)
[root@k8s-master k8s]# kubectl config set-credentials "kubelet-bootstrap" \
--token=${TOKEN} \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置上下文參數(shù)
[root@k8s-master k8s]# kubectl config set-context default \
--cluster=kubernetes \
--user="kubelet-bootstrap" \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置默認上下文
[root@k8s-master k8s]# kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
5)將生成的kubeconfig拷貝到node節(jié)點
[root@k8s-master k8s]# scp /opt/kubernetes/cfg/bootstrap.kubeconfig k8s-node1:/opt/kubernetes/cfg/
6)systemd管理kubelet(node執(zhí)行)
這一步需要在node節(jié)點操作。
[root@k8s-node1 ~]# vim /usr/lib/systemd/system/kubelet.service
[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
這里的配置,所有node都是一樣的可以直接scp拷到node2的?/usr/lib/systemd/system/目錄下
[root@k8s-node1 ~]# scp /usr/lib/systemd/system/kubelet.service k8s-node2:/usr/lib/systemd/system/
7)啟動kubelet,設(shè)置開機自啟
#node1
[root@k8s-node1 ~]# systemctl daemon-reload
[root@k8s-node1 ~]# systemctl start kubelet.service
[root@k8s-node1 ~]# systemctl enable kubelet.service
#node2
[root@k8s-node2 ~]# systemctl daemon-reload
[root@k8s-node2 ~]# systemctl start kubelet.service
[root@k8s-node2 ~]# systemctl enable kubelet.service
node1?
node2?
?4、批準kubelet證書申請并加入集群
1)查看kubelet證書請求
在master上查看。
[root@k8s-master k8s]# kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-o3SeaoanVHssuQi5DVKfXQKhAJ39CROp4QidAE6u24U 2m5s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
node-csr-p6DbmorzFDSsdfCp7OIWfISKjKC60CKOp9dsCe9o63M 2m5s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
可以看到該申請是pending狀態(tài)。?
2)批準申請
kubectl? certificate? approve? ?申請的NAME
[root@k8s-master k8s]# kubectl certificate approve node-csr-o3SeaoanVHssuQi5DVKfXQKhAJ39CROp4QidAE6u24U
[root@k8s-master k8s]# kubectl certificate approve node-csr-node-csr-node-csr-node-csr-p6DbmorzFDSsdfCp7OIWfISKjKC60CKOp9dsCe9o63M
#再次查看發(fā)現(xiàn)狀態(tài)變?yōu)榱薬pprove
[root@k8s-master k8s]# kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-o3SeaoanVHssuQi5DVKfXQKhAJ39CROp4QidAE6u24U 3m44s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
node-csr-p6DbmorzFDSsdfCp7OIWfISKjKC60CKOp9dsCe9o63M 3m44s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
3)查看node
[root@k8s-master k8s]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-node1 NotReady <none> 3h13m v1.20.4
k8s-node2 NotReady <none> 3h17m v1.20.4
由于網(wǎng)絡(luò)插件還沒有部署,節(jié)點會沒有準備就緒 NotReady?
5、部署kube-proxy
負責為Pod創(chuàng)建代理服務(wù),Kubernetes Proxy會從Kubernetes API ?Server獲取所有的Service信息,并根據(jù)Service的信息創(chuàng)建代理服務(wù),實現(xiàn)Service到Pod的請求路由和轉(zhuǎn)發(fā),從而實現(xiàn)Kubernetes層級的虛擬轉(zhuǎn)發(fā)網(wǎng)絡(luò)。
1)創(chuàng)建證書請求文件(在master節(jié)點)
在/root/ca/k8s下創(chuàng)建證書請求文件
[root@k8s-master k8s]# pwd
/root/ca/k8s
[root@k8s-master k8s]# vim kube-proxy-csr.json
[root@k8s-master k8s]# cat kube-proxy-csr.json
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
生成證書
[root@k8s-master k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
#查看證書生成情況
[root@k8s-master k8s]# ls kube-proxy*
kube-proxy.csr kube-proxy-csr.json kube-proxy-key.pem kube-proxy.pem
2)生成kubeconfig文件(master節(jié)點)
#定義兩個變量
[root@k8s-master k8s]# KUBE_CONFIG="/opt/kubernetes/cfg/kube-proxy.kubeconfig"
[root@k8s-master k8s]# KUBE_APISERVER="https://192.168.79.148:6443"
執(zhí)行以下四條命令
#設(shè)置集群參數(shù)
kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置客戶端認證參數(shù)
kubectl config set-credentials kube-proxy \
--client-certificate=./kube-proxy.pem \
--client-key=./kube-proxy-key.pem \
--embed-certs=true \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置上下文參數(shù)
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置默認上下文
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
3)將?kube-proxy.kubeconfig文件傳到node節(jié)點的cfg下。
兩個node都要傳。
#傳到node1
[root@k8s-master k8s]# scp /opt/kubernetes/cfg/kube-proxy.kubeconfig k8s-node1:/opt/kubernetes/cfg/
#傳到node2
[root@k8s-master k8s]# scp /opt/kubernetes/cfg/kube-proxy.kubeconfig k8s-node2:/opt/kubernetes/cfg/
4)創(chuàng)建kube-proxy配置文件(node節(jié)點)
兩個node一致。
[root@k8s-node1 ~]# vim /opt/kubernetes/cfg/kube-proxy.conf
KUBE_PROXY_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--config=/opt/kubernetes/cfg/kube-proxy-config.yml"
#拷貝到node2上
[root@k8s-node1 ~]# scp /opt/kubernetes/cfg/kube-proxy.conf k8s-node2:/opt/kubernetes/cfg/
5)配置kube-proxy參數(shù)文件(node節(jié)點)
[root@k8s-node1 ~]# vim /opt/kubernetes/cfg/kube-proxy-config.yml
[root@k8s-node1 ~]# cat /opt/kubernetes/cfg/kube-proxy-config.yml
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-node1
clusterCIDR: 10.244.0.0/16
#拷貝到node2上
[root@k8s-node1 ~]# scp kube-proxy.conf kube-proxy-config.yml kube-proxy.kubeconfig k8s-node2:/opt/kubernetes/cfg/
這里的hostnameOverride要改為自己本機的ip或者名。
修改node2上的?hostnameOverride為k8s-node2。
[root@k8s-node2 ~]# cat /opt/kubernetes/cfg/kube-proxy-config.yml
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-node2
clusterCIDR: 10.244.0.0/16
6)system管理kube-proxy(node節(jié)點)
兩個node一致。
[root@k8s-node1 ~]# vim /usr/lib/systemd/system/kube-proxy.service
[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
#拷貝到node2
[root@k8s-node1 ~]# scp /usr/lib/systemd/system/kube-proxy.service k8s-node2:/usr/lib/systemd/system/
7)啟動并設(shè)置開機啟動
[root@k8s-node1 ~]# systemctl daemon-reload
[root@k8s-node1 ~]# systemctl enable kube-proxy
[root@k8s-node1 ~]# systemctl start kube-proxy
[root@k8s-node2 ~]# systemctl daemon-reload
[root@k8s-node2 ~]# systemctl enable kube-proxy
[root@k8s-node2 ~]# systemctl start kube-proxy
node1?
?node2
6、部署網(wǎng)絡(luò)插件(Calico)
Calico是一個純?nèi)龑拥臄?shù)據(jù)中心網(wǎng)絡(luò)方案,是目前Kubernetes主流的網(wǎng)絡(luò)方案。
1)拷貝calico.yaml文件到node(master)
鏈接:https://pan.baidu.com/s/1QhZ3zUrD8OifY5n2FZ0ZZQ?pwd=b22c?
提取碼:b22c?并將該yaml問價拷貝到/opt/kubernetes/cfg/
2)部署Calico(master)
該插件是用yaml以pod的形式部署到node上的所以需要在master上使用kubectl工具。
這個時間可能會久一點幾分鐘也可能是十幾分鐘,直到看到status為running即可就代表部署完成。
[root@k8s-master k8s]# cd /opt/kubernetes/cfg/
[root@k8s-master cfg]# kubectl apply -f calico.yaml
#查看pods的創(chuàng)建情況
[root@k8s-master cfg]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-97769f7c7-vjzdg 1/1 Running 0 99m
calico-node-dx6sr 0/1 Running 0 8s
calico-node-nm4t2 1/1 Running 0 99m
在node主機上查看ip可以看到多了一個網(wǎng)卡,這就是calico。文章來源:http://www.zghlxwxcb.cn/news/detail-671129.html
注:calico.yaml用到了DaemonSet控制器,意思是在所有node上都會創(chuàng)建一個該pod,以后新加入的node會自動創(chuàng)建一個calico的pod在主機上。文章來源地址http://www.zghlxwxcb.cn/news/detail-671129.html
到了這里,關(guān)于二進制部署kubernetes(1.20)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!