什么是K8S
Kubernetes 是一個(gè)跨主機(jī)集群的開(kāi)源的容器調(diào)度平臺(tái)昧捷,它可以自動(dòng)化應(yīng)用容器的部署、擴(kuò)展和操作 , 提供以容器為中心的基礎(chǔ)架構(gòu)。谷歌旗下開(kāi)源軟件唆涝,江湖人稱K8S。
K8S能做什么
- 自動(dòng)化容器部署和復(fù)制
- 隨時(shí)擴(kuò)展和收縮容器規(guī)模
- 容器分組Group唇辨,并且提供容器間的負(fù)載均衡
- 實(shí)時(shí)監(jiān)控廊酣,及時(shí)故障發(fā)現(xiàn),自動(dòng)替換
只需要通過(guò)腳本規(guī)劃好容器在哪臺(tái)服務(wù)器運(yùn)行赏枚、運(yùn)行多少副本亡驰,K8S都能自動(dòng)創(chuàng)建部署,K8S還支持自動(dòng)或者手動(dòng)的調(diào)節(jié)容器規(guī)模饿幅,例如數(shù)據(jù)庫(kù)壓力大時(shí)凡辱,動(dòng)態(tài)增加數(shù)據(jù)的計(jì)算單元,服務(wù)器壓力小時(shí)動(dòng)態(tài)縮減tomcat的數(shù)量栗恩。K8S還支持容器間的負(fù)載均衡透乾,通常在項(xiàng)目中做集群部署,大多使用Nginx做前置服務(wù)器分發(fā)請(qǐng)求磕秤,但是現(xiàn)在完全可以交給K8S去做負(fù)載均衡续徽,因?yàn)镵8S提供了容器間的負(fù)載均衡。K8S還支持實(shí)時(shí)監(jiān)控亲澡,自動(dòng)處理故障钦扭,當(dāng)某個(gè)應(yīng)用服務(wù)掛掉時(shí),K8S會(huì)剔除掉對(duì)應(yīng)服務(wù)并嘗試自動(dòng)重啟服務(wù)床绪。
K8S的幾個(gè)關(guān)鍵概念
- pod
- container(容器)
- Label(標(biāo)簽)
- Replication Controller(復(fù)制控制器)
- service(服務(wù))
- Node(節(jié)點(diǎn))
- Kubernetes Master(K8S主節(jié)點(diǎn))
上圖是一個(gè)通過(guò)K8S搭建的集群環(huán)境客情,采用三臺(tái)物理機(jī)搭建(三臺(tái)機(jī)器是K8S搭建集群的最低要求),我先簡(jiǎn)單介紹一下幾個(gè)重點(diǎn)名詞癞己。
Kubernetes Master 是K8S的主服務(wù)器膀斋,容器的部署、發(fā)布痹雅、復(fù)制都是通過(guò)它發(fā)起的命令仰担,一般是部署在單獨(dú)的物理機(jī)上。同時(shí)所有外界的數(shù)據(jù)包也都是先經(jīng)過(guò)Kubernetes Master绩社,由它來(lái)進(jìn)行分配摔蓝。
-
Node 是集群的節(jié)點(diǎn),它可以是一個(gè)獨(dú)立的物理機(jī)愉耙,也可以是一個(gè)虛擬機(jī)贮尉,在每個(gè)節(jié)點(diǎn)中都有一個(gè)以上的pod。Node里面的功能都是通過(guò)docker朴沿、kubelet猜谚、kube-proxy這三個(gè)應(yīng)用程序?qū)崿F(xiàn)败砂。
- docker,K8S容器編排技術(shù)就是dokcer容器實(shí)現(xiàn)的魏铅,必備組件昌犹。
- kubelet是用來(lái)處理master 下發(fā)的任務(wù), 管理pod 中的容器, 注冊(cè)自身所在的節(jié)點(diǎn),以系統(tǒng)服務(wù)的方式呈現(xiàn)览芳。
- kube-proxy用于實(shí)現(xiàn)K8S跨主機(jī)跨容器的網(wǎng)路通信斜姥,之前我們提到的Pod與Pod之間、容器與容器之間(Pause)的通信都是通過(guò)它來(lái)實(shí)現(xiàn)路操。
-
pod是K8S獨(dú)有的概念疾渴,也是最基礎(chǔ)最重要的概念。 中文釋義有豆莢屯仗,豌豆的意思搞坝。它是K8S里面最小的控制單元,相比docker中容器是最小的控制單元魁袜,他們之間又有什么聯(lián)系與區(qū)別呢?
Pod是“容器”的容器桩撮,可以包含多個(gè)”Container”,這就是與docker容器的區(qū)別峰弹,Pod就像一個(gè)豌豆莢包含了多個(gè)豆子店量,他包含了多個(gè)容器
Pod是K8S最小可部署單元,一個(gè)Pod就是一個(gè)進(jìn)程鞠呈,擁有自己獨(dú)立的資源
Pod都是部署完整的應(yīng)用或模塊融师,一般情況下一個(gè)Pod中應(yīng)該是一整套完整的服務(wù),或者一整套功能性的模塊
-
Pod內(nèi)部容器網(wǎng)絡(luò)互通的(通過(guò)Pause實(shí)現(xiàn))蚁吝,每個(gè)Pod都有獨(dú)立虛擬IP旱爆,Pod與Pod之間的通信通過(guò)Service服務(wù)實(shí)現(xiàn),所有的通信底層都是基于kube-proxy的窘茁。
- Pause是Pod的組成部分之一怀伦,Pause的一個(gè)作用是讓同一個(gè)Pod的容器間可以直接使用localhost加端口號(hào)的形式互相訪問(wèn)
- Pause還提供同一個(gè)Pod內(nèi)所有容器的公共數(shù)據(jù)卷掛載功能
- Label 標(biāo)簽可以理解為每一個(gè)Pod的別名
- Replication Controller 復(fù)制控制器的職責(zé)是對(duì)Pod數(shù)量進(jìn)行監(jiān)控,例如我們命令中需要三個(gè)Pod山林,但是現(xiàn)在只有兩個(gè)房待,那么Replication Controller會(huì)自動(dòng)創(chuàng)建一個(gè)新的Pod,當(dāng)它發(fā)現(xiàn)某個(gè)Pod沒(méi)有響應(yīng)時(shí)驼抹,Replication Controller會(huì)自動(dòng)剔除這個(gè)Pod桑孩,如果有必要會(huì)創(chuàng)建新的Pod。它讓我們可以通過(guò)一個(gè)參數(shù)直接修改Pod的數(shù)量砂蔽。
K8S安裝教程
環(huán)境準(zhǔn)備
Centos 7 Master * 1 (注意必須是雙核以上的CPU洼怔,否則無(wú)法初始化K8S)
- 192.168.220.131
Centos 7 Node * 2
- 192.168.220.132
- 192.168.220.133
- 設(shè)置主機(jī)名與時(shí)區(qū)
timedatectl set-timezone Asia/Shanghai
hostnamectl set-hostname master #131執(zhí)行
hostnamectl set-hostname node1 #132執(zhí)行
hostnamectl set-hostname node2 #133執(zhí)行
- 為了便于區(qū)分,三臺(tái)機(jī)器均配置以下hosts
vim /etc/hosts
192.168.220.131 master
192.168.220.132 node1
192.168.220.133 node2
- 關(guān)閉Linux自帶的安全增強(qiáng)模塊左驾,設(shè)置臨時(shí)生效,并且關(guān)閉防火墻
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
K8S安裝前置環(huán)境配置(三臺(tái)機(jī)器都要執(zhí)行)
- 將鏡像包上傳至服務(wù)器每個(gè)節(jié)點(diǎn),里面包含了K8S诡右、docker安岂、以及各類配置文件,后面會(huì)有概述各個(gè)文件的作用帆吻。
mkdir /usr/local/k8s-install
cd /usr/local/k8s-install
將文件上傳至該目錄
網(wǎng)盤(pán)地址:https://pan.baidu.com/s/1NiAdf0Gp24qjVx2v_HqqyQ
提取碼:aew7
- 每個(gè)Centos上安裝Docker域那,注意不要使用19.0以上的docker版本,目前最新的1.15版本K8S也暫時(shí)不支持19.0的版本
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf docker-ce-18.09.tar.gz
cd docker
yum localinstall -y *.rpm #加載當(dāng)前目錄下的所有rpm文件自動(dòng)完成安裝
systemctl start docker
systemctl enable docker
- 確保cgroup driver都是 groupfs
- cgroups是control groups的簡(jiǎn)稱猜煮,它為L(zhǎng)inux內(nèi)核提供了一種任務(wù)聚集和劃分的機(jī)制次员,通過(guò)一組參數(shù)集合將一些任務(wù)組織成一個(gè)或多個(gè)子系統(tǒng)。
- cgroups是實(shí)現(xiàn)IaaS虛擬化(kvm王带、lxc等)淑蔚,PaaS容器沙箱(Docker等)的資源管理控制部分的底層基礎(chǔ)。
- 子系統(tǒng)是根據(jù)cgroup對(duì)任務(wù)的劃分功能將任務(wù)按照一種指定的屬性劃分成的一個(gè)組愕撰,主要用來(lái)實(shí)現(xiàn)資源的控制刹衫。
- 在cgroup中,劃分成的任務(wù)組以層次結(jié)構(gòu)的形式組織搞挣,多個(gè)子系統(tǒng)形成一個(gè)數(shù)據(jù)結(jié)構(gòu)中類似多根樹(shù)的結(jié)構(gòu)带迟。cgroup包含了多個(gè)孤立的子系統(tǒng),每一個(gè)子系統(tǒng)代表單一的資源
雖然在現(xiàn)在版本的K8S會(huì)提示使用Linux自帶的“Systemd”做為cgroup driver囱桨,但Systemd與cgroupfs作用相同仓犬,只不過(guò)cgroupfs是docker自帶的,而systemd是linux系統(tǒng)自帶的舍肠。早期k8s并沒(méi)有建議使用Systemd搀继,所以一直沿用到1.14。除非是極端情況下貌夕,默認(rèn)使用docker自帶的cgroupfs即可律歼。
執(zhí)行以下命令
docker info | grep cgroup
如果不是groupfs,執(zhí)行下列語(yǔ)句
cat << EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
EOF
systemctl daemon-reload && systemctl restart docker\
- 安裝kubeadm,kubeadm是集群部署管理工具啡专,可用來(lái)安裝K8S的一個(gè)工具险毁,極大簡(jiǎn)化安裝流程
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm
- 關(guān)閉交換區(qū),Linux的交換區(qū)類似windows系統(tǒng)中虛擬內(nèi)存们童,不太建議使用這個(gè)選項(xiàng)畔况,關(guān)閉掉
swapoff -a
vi /etc/fstab
將最后一行注釋
- 配置網(wǎng)橋,iptables是Linux的一個(gè)網(wǎng)絡(luò)規(guī)則慧库,對(duì)我們的包按規(guī)則進(jìn)行過(guò)濾跷跪。該配置讓K8S容器間通過(guò)網(wǎng)橋通訊的時(shí)候也要遵循iptables的規(guī)則,提高網(wǎng)絡(luò)傳輸安全性
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
- 加載k8s的docker鏡像
cd /usr/local/k8s-install/kubernetes-1.14
docker load -i k8s-114-images.tar.gz #加載K8S鏡像
docker load -i flannel-dashboard.tar.gz #集群可視化管理組件
運(yùn)行docker images可以看到以下幾個(gè)關(guān)鍵應(yīng)用
kube-proxy 容器間通訊代理齐板、kube-apiserver API服務(wù)端吵瞻、kube-scheduler 任務(wù)調(diào)度器葛菇、kube-controller-manager 集群控制器、coredns K8S內(nèi)置的 DNS 服務(wù)器橡羞、etcd 用于保存集群所有的網(wǎng)絡(luò)配置和對(duì)象的狀態(tài)信息眯停、pause前面已經(jīng)提到用于容器間的通訊以及數(shù)據(jù)卷的掛載。至此K8S安裝完成
K8S集群安裝配置
- master主服務(wù)器配置卿泽,kubernetes-version表示安裝K8S的版本莺债,pod-network-cidr設(shè)置pod的虛擬IP范圍
kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16
圖中的第一個(gè)紅框的命令是需要管理員手動(dòng)復(fù)制,然后在master服務(wù)器上執(zhí)行的签夭。
mkdir -p $HOME/.kube #創(chuàng)建.kube目錄
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config #拷貝admin.conf文件到剛剛創(chuàng)建的目錄
sudo chown $(id -u):$(id -g) $HOME/.kube/config #進(jìn)行相應(yīng)的授權(quán)
PS: admin.conf是kubeadm集群管理的核心配置文件齐邦,包含整個(gè)集群各個(gè)節(jié)點(diǎn)的授權(quán)信息,以及本身的一些配置信息
第二個(gè)紅框中的命令是在node節(jié)點(diǎn)上執(zhí)行第租,里面包含了一個(gè)加入集群的token認(rèn)證信息以及ca證書(shū)的hashcode措拇。通過(guò)該token可以加入K8S集群.
- 執(zhí)行 kubectl get nodes 查看當(dāng)前集群的所有節(jié)點(diǎn)
從圖中看到master節(jié)點(diǎn)處于NotReady狀態(tài),說(shuō)明節(jié)點(diǎn)中存在有問(wèn)題的Pod煌妈,查看存在問(wèn)題的pod儡羔,執(zhí)行以下命令查看所有Pod狀態(tài)
kubectl get pod --all-namespaces
如果某個(gè)Pod的STATUS處于CrashLoopBackOff狀態(tài)表示創(chuàng)建失敗了,那么它會(huì)不斷自動(dòng)重新創(chuàng)建璧诵。上圖中兩個(gè)coredns處于pending狀態(tài)汰蜘,原因是我們沒(méi)有配置K8S網(wǎng)絡(luò)通訊協(xié)議fannel,從上傳的文件中加載并創(chuàng)建flannel網(wǎng)絡(luò)組件
kubectl create -f kube-flannel.yml
3.在node節(jié)點(diǎn)上執(zhí)行剛剛由kubeadm生成的節(jié)點(diǎn)加入命令
kubeadm join 192.168.220.131:6443 --token 25x9dp.3k4ysps4xeuv7lm5 \
--discovery-token-ca-cert-hash sha256:ef7751d4347df3a8b401c53588c8ee8376cb100c7f14c550c2d175a266b8b6a9
如果出現(xiàn)反復(fù)無(wú)法加入節(jié)點(diǎn)的情況之宿,運(yùn)行 kubeadm reset 這條命令還原當(dāng)前節(jié)點(diǎn)上 kubeadm init 或者 kubeadm join 所做的所有更改族操。當(dāng)想加入新節(jié)點(diǎn)忘記token時(shí)可以使用 kubeadm token list 查看token,或者 kubeadm token create創(chuàng)建token,采用跳過(guò)ca安全認(rèn)證的方式加入節(jié)點(diǎn)比被。
kubeadm join 192.168.220.131:6443 --token 25x9dp.3k4ysps4xeuv7lm5 --discovery-token-unsafe-skip-ca-verification
4.三臺(tái)機(jī)器設(shè)置kubelet開(kāi)機(jī)自啟,至此通過(guò)kubeadm集群配置完成
systemctl enable kubelet
安裝K8S可視化儀表盤(pán)
在主節(jié)點(diǎn)上執(zhí)行以下命令色难,以下三個(gè)配件都是已經(jīng)配置好的,裝載即可等缀。
kubectl apply -f kubernetes-dashboard.yaml # web-ui 配置文件
kubectl apply -f admin-role.yaml # 角色配置
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml #角色的權(quán)限配置
kubectl -n kube-system get svc #獲取系統(tǒng)命名空間下的所有服務(wù)
圖中dashboard服務(wù)已經(jīng)被創(chuàng)建枷莉,配置文件中關(guān)閉了密碼驗(yàn)證,只需要瀏覽器打開(kāi) http://192.168.220.131:32000無(wú)需登錄尺迂。