《k8s 集群搭建》不要讓貧窮扼殺了你學 k8s 的興趣!
大家好,歡迎來到小菜個人 solo 學堂。在這里,知識免費,不吝吸收!關注免費,不吝動手!死鬼~看完記得給我來個三連哦!

本文主要介紹
kubernetes集群的搭建如有需要,可以參考
如有幫助,不忘 點贊 ?
微信公眾號已開啟,小菜良記,沒關注的同學們記得關注哦!
閱讀這篇文章先需要對 docker 的基本知識有所了解!相關閱讀請移步:Docker上手,看完覺得自己又行了!
相信點進來的小伙伴應該都對 k8s 有所耳聞,甚至于已經(jīng)使用上了。而如果是因為對標題感到好奇的小伙伴也別急著劃走,因為我勸你一定要學習 Kubernetes(k8s)。而標題也并非標題黨,由于 k8s 集群大體上分為兩大類:
- 一主多從:一臺 master 節(jié)點和多臺 node 節(jié)點,搭建比較簡單,但是有可能出現(xiàn) master 單機故障
- 多主多從: 多臺 master 節(jié)點和多臺 node 節(jié)點,搭建比較麻煩,但是安全性高
不管是 一主多從?亦或者是 多主多從 ,這里至少都是需要三臺服務器,而且每臺服務器的規(guī)格至少得在 2G內(nèi)存 2顆CPU 配置起步,而我們?nèi)绻儗贋榱似綍r練習使用,花費一筆錢去投資服務器,可能有部分人是不愿意的,所以這里就呼應了標題~接下來小菜將帶給你比較節(jié)省的方案去學習 k8s集群的搭建!
開頭說到,我勸你一定要學習 k8s 這并非是一句空話。當下,云原生也并非是一個新名詞,它已經(jīng)指定了一條新的開發(fā)道路,**敏捷、可擴展、可復制、最大化利用...**便是這條道路的代名詞!這篇文章不單單介紹 Kubernetes 的搭建,如果對 Kubernetes 有所熟悉的同學可以直接跳轉(zhuǎn)到 Kubernetes 集群搭建 的部分,如果不熟悉的同學建議先看看前半部分,先對 Kubernetes 有所了解一下。
Kubernetes
一、K8s 事前了解
有些同學可能感到有點奇怪,為什么一會說 kubernetes,一會說 k8s,這兩個是同一個東西嗎?答案是肯定的
Kubernetes 簡稱 k8s,是用 8 來代替 8 個字符 “ubernete” ?的縮寫
這個一個用來管理云平臺中多個主機上的容器化應用,它的目的便是讓部署容器化的應用簡單且高效,它提供了應用部署,規(guī)劃,更新,維護的一種機制。
我們先來看看部署應用的迭代過程:
傳統(tǒng)部署: 直接將應用程序部署在物理機上
虛擬化部署: 可以在一臺物理機上運行多個虛擬機,每個虛擬機都是獨立的一個環(huán)境
容器化部署: 與虛擬機類似, 但是共享了操作系統(tǒng)

看了以上部署方式,想想看你們公司現(xiàn)在是用的哪一種~說到容器化部署,學過docker的同學肯定第一時間想到docker ,docker 的容器化部署方式確實給我們帶來了很多便利,但是問題也是存在的,有時候這些問題會被我們刻意性的回避,因為 docker 實在是有點好用,讓人有點不忍心對它產(chǎn)生質(zhì)疑,但是又不得不面對:
一個容器故障停機了,怎么樣保證高可用讓另外一個容器立刻啟動去替補上停機的容器
當并發(fā)訪問量上來的時候,是否可以做到自動擴容,并發(fā)訪問量下去的時候是否可以做到自動縮容
...
容器的問題確實有時候挺值得深思的,而這些容器管理的問題統(tǒng)稱為 容器編排 問題,我們能想到的問題,自然有人去解決,例如 docker 自家就推出了 Docker Swarm 容器編排工具,Apache?推出了 Mesos 資源統(tǒng)一管控工具,Google 推出了Kubernetes容器編排工具,而這也是我們要說到的主角!
1)K8s優(yōu)點
- 自我修復:一旦某一個容器崩潰,能夠在1秒左右迅速啟動新的容器
- 彈性伸縮:可以根據(jù)需要,自動對集群中正在運行的容器數(shù)量進行調(diào)整
- 服務發(fā)現(xiàn):服務可以通過自動發(fā)現(xiàn)的形式找到它所依賴的服務
- 負載均衡:如果一個服務啟動了多個容器,能夠自動實現(xiàn)請求的負載均衡
- 版本回退:如果發(fā)現(xiàn)新發(fā)布的程序版本有問題,可以立即回退到原來的版本
- 存儲編排:可以根據(jù)容器自身的需求自動創(chuàng)建存儲卷
2)K8s 構成組件
一個完整的 Kubernetes 集群是由 控制節(jié)點 master 、工作節(jié)點 node 構成的,因此這種集群方式也分為 一主多從 和 多主多從,而每個節(jié)點上又會安裝不同組件以提供服務。
1、Master
集群的控制平面,負責集群的決策(管理)。它旗下存在以下組件
- ApiServer :資源操作的唯一入口,接收用戶輸入的命令,提供認證、授權、Api 注冊和發(fā)現(xiàn)等機制
- Scheduler:負責集群資源調(diào)度,按照預定的調(diào)度策略將 pod 調(diào)度到相應的 node 節(jié)點上
- ControllerManager:負責維護集群的狀態(tài),比如程序部署安排,故障檢測,自動擴展,滾動更新等
- Etcd:負責存儲集群中各種資源對象的信息
2、Node
集群的數(shù)據(jù)平面,負責為容器提供運行環(huán)境(干活)。它旗下存在以下組件
- Kubelet:負責維護容器的生命周期,即通過控制 docker 來創(chuàng)建、更新、銷毀容器
- KubeProxy:負責提供集群內(nèi)部的服務發(fā)現(xiàn)和負載均衡

看完了以上介紹,那我們接下來就開始進行 k8s 集群的搭建!
二、k8s 集群搭建
1)Centos7 安裝
首先我們需要軟件:
- VMware Workstation Pro
- Centos 7.0 鏡像
虛擬機軟件可百度查找下載,如若沒有聯(lián)系小菜,小菜給你提供
鏡像可訪問阿里云進行下載,如下圖:下載地址

完成虛擬機的安裝后我們便可在 VMware 中安裝 Centos7
- 我們選擇 創(chuàng)建新的虛擬機

- 選擇自定義安裝
典型安裝:VMware會將主流的配置應用在虛擬機的操作系統(tǒng)上,對于新手來很友好。
自定義安裝:自定義安裝可以針對性的把一些資源加強,把不需要的資源移除。避免資源的浪費。

- 兼容性一般向下兼容

- 選擇我們下載好的 centos 鏡像

- 給自己的虛擬機分配名稱和安裝地址,我們需要安裝三臺,所以名稱我這里分別命名為(master、node01、node02)

- 給自己的虛擬機分配資源,最低要求一般是 2核2G內(nèi)存


- 這里使用 NAT 網(wǎng)絡類型
橋接:選擇橋接模式的話虛擬機和宿主機在網(wǎng)絡上就是平級的關系,相當于連接在同一交換機上。
NAT:NAT模式就是虛擬機要聯(lián)網(wǎng)得先通過宿主機才能和外面進行通信。
僅主機:虛擬機與宿主機直接連起來

- 接下來一直下一步,然后點擊完成即可






- 安裝完后我們便可以在頁面看到以下結(jié)果,點擊開啟此虛擬機:

- 選擇 install CentOS7
image-20210410200006452- 然后就可以看到安裝過程:

- 過一會便會看到讓我們選擇語言的界面,這里選擇中文并繼續(xù)

- 軟件選擇我們可以選
基礎設施服務器,安裝位置可選自動分區(qū)

- 然后我們需要點擊 網(wǎng)絡和主機名 進入網(wǎng)絡配置

- 我們在 tarbar 欄點擊 編輯 -> 虛擬網(wǎng)絡編輯器 查看虛擬機的子網(wǎng)IP


- 這邊我們手動自定義添加 Ipv4 的地址,DNS服務器可填阿里云的
我們分配的地址需要排除 255 和 02 這兩個地址,分別是廣播和網(wǎng)關地址。
我是這樣配置的:
master 節(jié)點 :
192.168.108.100node01 節(jié)點 :
192.168.108.101node02 節(jié)點 :
192.168.108.102

- 配置完選擇保存并點擊完成,然后設置主機名
我是這樣配置的:
master 節(jié)點 :
masternode01 節(jié)點 :
node01node02 節(jié)點 :
node02

- 完成以上配置后,大致是如下樣子

- 點擊開始安裝后,我們來到了以下頁面,然后配置以下兩個信息

完成以上配置后,重啟便可以使用,其他兩個節(jié)點也是同樣的配置,可以直接選擇克隆,網(wǎng)絡配置和主機名 記得改~ 然后我們便得到以下配置的三個服務器:
| 主機名 | IP | 配置 |
|---|---|---|
| master | 192.168.108.100 | 2 核 2G內(nèi)存 30G硬盤 |
| node01 | 192.168.108.101 | 2 核 2G內(nèi)存 30G硬盤 |
| node02 | 192.168.108.102 | 2 核 2G內(nèi)存 30G硬盤 |
2)環(huán)境配置
完成以上服務器的搭建后,我們可以利用 shell 工具 進行連接,開始搭建 k8s 環(huán)境
- 主機名解析
為了集群節(jié)點間的直接調(diào)用,我們需要配置一下主機名解析,分別在三臺服務器上編輯 /etc/hosts

- 同步時間
集群中的時間必須要精確一致,我們可以直接使用chronyd服務從網(wǎng)絡同步時間,三臺服務器需做同樣的操作

- 禁用iptables和firewalld服務
kubernetes和docker在運行中會產(chǎn)生大量的iptables規(guī)則,為了不讓系統(tǒng)規(guī)則跟它們混淆,直接關閉系統(tǒng)的規(guī)則。三臺虛擬機需做同樣操作:
#?1?關閉firewalld服務
[root@master?~]#?systemctl?stop?firewalld
[root@master?~]#?systemctl?disable?firewalld
#?2?關閉iptables服務
[root@master?~]#?systemctl?stop?iptables
[root@master?~]#?systemctl?disable?iptables
- 禁用selinux
selinux是linux系統(tǒng)下的一個安全服務,如果不關閉它,在安裝集群中會產(chǎn)生各種各樣的奇葩問題
#?永久關閉
[root@master?~]#?sed?-i?'s/enforcing/disabled/'?/etc/selinux/config
#?臨時關閉
[root@master?~]#?setenforce?0
- 禁用swap分區(qū)
swap分區(qū)指的是虛擬內(nèi)存分區(qū),它的作用是在物理內(nèi)存使用完之后,將磁盤空間虛擬成內(nèi)存來使用啟用swap設備會對系統(tǒng)的性能產(chǎn)生非常負面的影響,因此kubernetes要求每個節(jié)點都要禁用swap設備但是如果因為某些原因確實不能關閉swap分區(qū),就需要在集群安裝過程中通過明確的參數(shù)進行配置說明
#?臨時關閉
[root@master?~]#?swapoff?-a
#?永久關閉
[root@master?~]#?vim?/etc/fstab
注釋掉swap分區(qū)那一行

- 修改linux的內(nèi)核參數(shù)
我們需要修改linux的內(nèi)核參數(shù),添加網(wǎng)橋過濾和地址轉(zhuǎn)發(fā)功能,編輯/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
net.bridge.bridge-nf-call-ip6tables?=?1
net.bridge.bridge-nf-call-iptables?=?1
net.ipv4.ip_forward?=?1
添加后進行以下操作:
#?重新加載配置
[root@master?~]#?sysctl?-p
#?加載網(wǎng)橋過濾模塊
[root@master?~]#?modprobe?br_netfilter
#?查看網(wǎng)橋過濾模塊是否加載成功
[root@master?~]#?lsmod?|?grep?br_netfilter
同樣是在三臺服務器都進行操作,成功信息如下:

- 配置 ipvs 功能
在kubernetes中service有兩種代理模型,一種是基于iptables的,一種是基于ipvs的 相比較的話,ipvs的性能明顯要高一些,但是如果要使用它,需要手動載入ipvs模塊
#?安裝ipset和ipvsadm
[root@master?~]#?yum?install?ipset?ipvsadmin?-y
#?添加需要加載的模塊寫入腳本文件
[root@master?~]#?cat?<<EOF?>?/etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe?--?ip_vs
modprobe?--?ip_vs_rr
modprobe?--?ip_vs_wrr
modprobe?--?ip_vs_sh
modprobe?--?nf_conntrack_ipv4
EOF
#?為腳本文件添加執(zhí)行權限
[root@master?~]#?chmod?+x?/etc/sysconfig/modules/ipvs.modules
#?執(zhí)行腳本文件
[root@master?~]#?/bin/bash?/etc/sysconfig/modules/ipvs.modules
#?查看對應的模塊是否加載成功
[root@master?~]#?lsmod?|?grep?-e?ip_vs?-e?nf_conntrack_ipv4

- 完成以上配置后重啟服務器
[root@master?~]#?reboot
3)docker安裝
第一步:
#?獲取鏡像源
[root@master?~]#?wget?https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo?-O?/etc/yum.repos.d/docker-ce.repo
第二步:
#?安裝特定版本的docker-ce
#?必須指定--setopt=obsoletes=0,否則yum會自動安裝更高版本
[root@master?~]#?yum?install?--setopt=obsoletes=0?docker-ce-18.06.3.ce-3.el7?-y
第三步:
#?添加一個配置文件
#?Docker在默認情況下使用的Cgroup?Driver為cgroupfs,而kubernetes推薦使用systemd來代替cgroupfs
[root@master?~]#?mkdir?/etc/docker
第四步:
#?添加阿里云?yum?源,?可從阿里云容器鏡像管理中復制鏡像加速地址
[root@master?~]#?cat?<<EOF?>?/etc/docker/daemon.json
{
"registry-mirrors":?["https://xxxx.mirror.aliyuncs.com"]
}
EOF
第五步:
#?啟動docker
[root@master?~]#?systemctl?enable?docker?&&?systemctl?start?docker
完成以上5步,也就完成了 docker 的安裝,離成功更近一步~
4)集群初始化
1、由于 kubernetes 的鏡像源在國外,速度比較慢,因此我們需要切換成國內(nèi)的鏡像源
#?編輯?/etc/yum.repos.d/kubernetes.repo?添加一下配置
[root@master?~]#?vim?/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

2、然后安裝kubeadm、kubelet和kubectl 三個組件
yum?install?--setopt=obsoletes=0?kubeadm-1.17.4-0?kubelet-1.17.4-0
kubectl-1.17.4-0?-y

3、配置 kubelet 的group
#?編輯?/etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

4、這步是來初始化集群的,因此只需在 master 服務器上執(zhí)行即可,上面那些是每個服務器都需要執(zhí)行!
#?創(chuàng)建集群
#?由于默認拉取鏡像地址?k8s.gcr.io?國內(nèi)無法訪問,這里指定阿里云鏡像倉庫地址
[root@master?~]#?kubeadm?init?\
--apiserver-advertise-address=192.168.108.100?\
--image-repository?registry.aliyuncs.com/google_containers?\
--kubernetes-version=v1.17.4?\
--pod-network-cidr=10.244.0.0/16?\
--service-cidr=10.96.0.0/12?
#使用?kubectl?工具
[root@master?~]#?mkdir?-p?$HOME/.kube
[root@master?~]#?sudo?cp?-i?/etc/kubernetes/admin.conf?$HOME/.kube/config
[root@master?~]#?sudo?chown?$(id?-u):$(id?-g)?$HOME/.kube/config

然后我們需要將node 節(jié)點加入集群中,在 node 服務器 上執(zhí)行上述紅框的命令:
[root@master?~]#?kubeadm?join?192.168.108.100:6443?--token?xxx?\?
--discovery-token-ca-cert-hash?sha256:xxx
便可在 master 節(jié)點 獲取到節(jié)點信息:

但是我們這個時候查看集群狀態(tài)都是為NotReady,這是因為還沒有配置網(wǎng)絡插件
5、安裝網(wǎng)絡插件
kubernetes支持多種網(wǎng)絡插件,比如flannel、calico、canal等等,這里選擇使用flanne
下載 flanneld-v0.13.0-amd64.docker ?:下載地址

下載完成后,上傳至 master 服務器 執(zhí)行以下命令
docker?load?<?flanneld-v0.13.0-amd64.docker
執(zhí)行完成后便可看到多了個 flannel 鏡像:

然后我們需要獲取flannel的配置文件來部署 flannel 服務
[root@master?~]#?wget?https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#?使用配置文件啟動fannel
[root@master?~]#?kubectl?apply?-f?kube-flannel.yml
#?再次查看集群節(jié)點的狀態(tài)
[root@master?~]#?kubectl?get?nodes

這個時候所有節(jié)點的狀態(tài)都是Ready 的狀態(tài),到此為止,我們的 k8s 集群就算搭建完成了!
5)集群功能驗證
接下來就是我們的驗證時間,之前我們學 docker 的時候往往會啟動一個 nginx 容器來測試是否可用,k8s 我們也同樣來部署一個 nginx 來測試下服務是否可用~
(下面例子為測試例子,如果不清楚每個指令的作用也不要緊,后面我們會出篇 k8s 的教學文章來說明 k8s 如果使用?。?/p>
- 首先我們創(chuàng)建一個 deployment
[root@master?~]#?kubectl?create?deployment?nginx?--image=nginx:1.14-alpine
deployment.apps/nginx?created
[root@master?~]#?kubectl?get?deploy
NAME????READY???UP-TO-DATE???AVAILABLE???AGE
nginx???1/1?????1????????????1???????????31s
- 然后創(chuàng)建一個 service 來讓外界能夠訪問到我們 nginx 服務
[root@master?~]#?kubectl?expose?deploy?nginx?--port=80?--target-port=80?--type=NodePort
service/nginx?exposed
[root@master?~]#?kubectl?get?svc?
NAME?????????TYPE????????CLUSTER-IP???????EXTERNAL-IP???PORT(S)????????AGE
nginx????????NodePort????10.110.224.214???<none>????????80:31771/TCP???5s
然后我們通過 node 節(jié)點的 IP 加上service 暴露出來的 nodePort 來訪問我們的 nginx 服務:

也可以直接在集群中通過 service 的 IP 加上映射出來的 port 來訪問我們的服務:

從結(jié)果上看兩種訪問都是可用的,說明我們的 nginx 服務部署成功,不妨點個關注助助興~
公眾號搜索:小菜良記
更多干貨值得閱讀哦!
那么為什么我們可以訪問到 nginx?我們不妨結(jié)合上面說到的 k8s 組件來梳理一下各個組件的調(diào)用關系:

kubernetes 啟動后,無論是 master 節(jié)點 亦或者 node 節(jié)點,都會將自身的信息存儲到 etcd 數(shù)據(jù)庫中
創(chuàng)建 nginx 服務,首先會將安裝請求發(fā)送到 master 節(jié)點上的 apiServer 組件中
apiServer 組件會調(diào)用 scheduler 組件來決定應該將該服務安裝到哪個 node 節(jié)點上。這個時候就需要用到 etcd 數(shù)據(jù)庫了,scheduler會從 etcd 中讀取各個 node 節(jié)點的信息,然后按照一定的算法進行選擇,并將結(jié)果告知給 apiServer
apiServer 調(diào)用 controllerManager 去調(diào)度 node 節(jié)點,并安裝 nginx 服務
node 節(jié)點上的 kubelet 組件接收到指令后,會通知docker,然后由 docker 來啟動一個 nginx 的pod
pod 是 kubernetes 中的最小操作單元,容器都是跑在 pod 中
以上步驟完成后,nginx 服務便運行起來了,如果需要訪問 nginx,就需要通過 kube-proxy 來對 pod 產(chǎn)生訪問的代理,這樣外部用戶就能訪問到這個 nginx 服務
以上便是運行一個服務的全過程,不知道看完之后有沒有一種 肅然起敬 的感覺,設計是在太巧妙了,因此到這里,難道就不準備看 k8s 使用下文!如果準備看的話,小手將關注點起來哦!
END
以上便是 k8s 集群的搭建過程,有了 k8s 的環(huán)境,你還怕學不會 k8s 的使用嗎!在自己的虛擬機上盡情折騰,弄壞了也就一個恢復快照的事~ 我是小菜,路漫漫,與你一同求索!
看完不贊,都是壞蛋今天的你多努力一點,明天的你就能少說一句求人的話!
我是小菜,一個和你一起學習的男人。
??微信公眾號已開啟,小菜良記,沒關注的同學們記得關注哦!
