大家好,歡迎來到小菜個人 solo 學堂。在這里,知識免費,不吝吸收!關注免費,不吝動手!
死鬼~看完記得給我來個三連哦!
本文主要介紹
kubernetes集群的搭建
如有需要,可以參考
如有幫助,不忘 點贊 ❥
微信公眾號已開啟,小菜良記,沒關注的同學們記得關注哦!
閱讀這篇文章先需要對 docker 的基本知識有所了解!相關閱讀請移步:Docker上手,看完覺得自己又行了!
相信點進來的小伙伴應該都對 k8s 有所耳聞,甚至於已經使用上了。而如果是因為對標題感到好奇的小伙伴也別急着划走,因為我勸你一定要學習 Kubernetes(k8s)。而標題也並非標題黨,由於 k8s 集群大體上分為兩大類:
- 一主多從:一台 master 節點和多台 node 節點,搭建比較簡單,但是有可能出現 master 單機故障
- 多主多從: 多台 master 節點和多台 node 節點,搭建比較麻煩,但是安全性高
不管是 一主多從 異或者是 多主多從 ,這里至少都是需要三台服務器,而且每台服務器的規格至少得在 2G內存 2顆CPU
配置起步,而我們如果純屬為了平時練習使用,花費一筆錢去投資服務器,可能有部分人是不願意的,所以這里就呼應了標題~接下來小菜將帶給你比較節省的方案去學習 k8s集群的搭建!
開頭說到,我勸你一定要學習 k8s 這並非是一句空話。當下,雲原生也並非是一個新名詞,它已經指定了一條新的開發道路,敏捷、可擴展、可復制、最大化利用...便是這條道路的代名詞!這篇文章不單單介紹 Kubernetes 的搭建,如果對 Kubernetes 有所熟悉的同學可以直接跳轉到 Kubernetes 集群搭建 的部分,如果不熟悉的同學建議先看看前半部分,先對 Kubernetes 有所了解一下。
Kubernetes
一、K8s 事前了解
有些同學可能感到有點奇怪,為什么一會說 kubernetes,一會說 k8s,這兩個是同一個東西嗎?答案是肯定的
Kubernetes 簡稱 k8s,是用 8 來代替 8 個字符 “ubernete” 的縮寫
這個一個用來管理雲平台中多個主機上的容器化應用,它的目的便是讓部署容器化的應用簡單且高效,它提供了應用部署,規划,更新,維護的一種機制。
我們先來看看部署應用的迭代過程:
-
傳統部署: 直接將應用程序部署在物理機上
-
虛擬化部署: 可以在一台物理機上運行多個虛擬機,每個虛擬機都是獨立的一個環境
-
容器化部署: 與虛擬機類似, 但是共享了操作系統
看了以上部署方式,想想看你們公司現在是用的哪一種~說到容器化部署,學過docker的同學肯定第一時間想到docker ,docker 的容器化部署方式確實給我們帶來了很多便利,但是問題也是存在的,有時候這些問題會被我們刻意性的回避,因為 docker 實在是有點好用,讓人有點不忍心對它產生質疑,但是又不得不面對:
-
一個容器故障停機了,怎么樣保證高可用讓另外一個容器立刻啟動去替補上停機的容器
-
當並發訪問量上來的時候,是否可以做到自動擴容,並發訪問量下去的時候是否可以做到自動縮容
-
...
容器的問題確實有時候挺值得深思的,而這些容器管理的問題統稱為 容器編排 問題,我們能想到的問題,自然有人去解決,例如 docker 自家就推出了 Docker Swarm 容器編排工具,Apache 退出了 Mesos 資源統一管控工具,Google 推出了Kubernetes
容器編排工具,而這也是我們要說到的主角!
1)K8s優點
- 自我修復:一旦某一個容器崩潰,能夠在1秒左右迅速啟動新的容器
- 彈性伸縮:可以根據需要,自動對集群中正在運行的容器數量進行調整
- 服務發現:服務可以通過自動發現的形式找到它所依賴的服務
- 負載均衡:如果一個服務啟動了多個容器,能夠自動實現請求的負載均衡
- 版本回退:如果發現新發布的程序版本有問題,可以立即回退到原來的版本
- 存儲編排:可以根據容器自身的需求自動創建存儲卷
2)K8s 構成組件
一個完整的 Kubernetes 集群是由 控制節點 master 、工作節點 node 構成的,因此這種集群方式也分為 一主多從 和 多主多從,而每個節點上又會安裝不同組件以提供服務。
1、Master
集群的控制平面,負責集群的決策(管理)。它旗下存在以下組件
- ApiServer :資源操作的唯一入口,接收用戶輸入的命令,提供認證、授權、Api 注冊和發現等機制
- Scheduler:負責集群資源調度,按照預定的調度策略將 pod 調度到相應的 node 節點上
- ControllerManager:負責維護集群的狀態,比如程序部署安排,故障檢測,自動擴展,滾動更新等
- Etcd:負責存儲集群中各種資源對象的信息
2、Node
集群的數據平面,負責為容器提供運行環境(干活)。它旗下存在以下組件
- Kubelet:負責維護容器的生命周期,即通過控制 docker 來創建、更新、銷毀容器
- KubeProxy:負責提供集群內部的服務發現和負載均衡
看完了以上介紹,那我們接下來就開始進行 k8s 集群的搭建!
二、k8s 集群搭建
1)Centos7 安裝
首先我們需要軟件:
- VMware Workstation Pro
- Centos 7.0 鏡像
虛擬機軟件可百度查找下載,如若沒有聯系小菜,小菜給你提供
鏡像可訪問阿里雲進行下載,如下圖:下載地址
完成虛擬機的安裝后我們便可在 VMware 中安裝 Centos7
- 我們選擇 創建新的虛擬機
- 選擇自定義安裝
典型安裝:VMware會將主流的配置應用在虛擬機的操作系統上,對於新手來很友好。
自定義安裝:自定義安裝可以針對性的把一些資源加強,把不需要的資源移除。避免資源的浪費。
- 兼容性一般向下兼容
- 選擇我們下載好的 centos 鏡像
- 給自己的虛擬機分配名稱和安裝地址,我們需要安裝三台,所以名稱我這里分別命名為(master、node01、node02)
- 給自己的虛擬機分配資源,最低要求一般是 2核2G內存
- 這里使用 NAT 網絡類型
橋接:選擇橋接模式的話虛擬機和宿主機在網絡上就是平級的關系,相當於連接在同一交換機上。
NAT:NAT模式就是虛擬機要聯網得先通過宿主機才能和外面進行通信。
僅主機:虛擬機與宿主機直接連起來
- 接下來一直下一步,然后點擊完成即可
- 安裝完后我們便可以在頁面看到以下結果,點擊開啟此虛擬機:
- 選擇 install CentOS7
- 然后就可以看到安裝過程:
- 過一會便會看到讓我們選擇語言的界面,這里選擇中文並繼續
- 軟件選擇我們可以選
基礎設施服務器
,安裝位置可選自動分區
- 然后我們需要點擊 網絡和主機名 進入網絡配置
- 我們在 tarbar 欄點擊 編輯 -> 虛擬網絡編輯器 查看虛擬機的子網IP
- 這邊我們手動自定義添加 Ipv4 的地址,DNS服務器可填阿里雲的
我們分配的地址需要排除 255
和 02
這兩個地址,分別是廣播和網關地址。
我是這樣配置的:
master 節點 :
192.168.108.100
node01 節點 :
192.168.108.101
node02 節點 :
192.168.108.102
- 配置完選擇保存並點擊完成,然后設置主機名
我是這樣配置的:
master 節點 :
master
node01 節點 :
node01
node02 節點 :
node02
- 完成以上配置后,大致是如下樣子
- 點擊開始安裝后,我們來到了以下頁面,然后配置以下兩個信息
完成以上配置后,重啟便可以使用,其他兩個節點也是同樣的配置,可以直接選擇克隆,網絡配置和主機名 記得改~ 然后我們便得到以下配置的三個服務器:
主機名 | IP | 配置 |
---|---|---|
master | 192.168.108.100 | 2 核 2G內存 30G硬盤 |
node01 | 192.168.108.101 | 2 核 2G內存 30G硬盤 |
node02 | 192.168.108.102 | 2 核 2G內存 30G硬盤 |
2)環境配置
完成以上服務器的搭建后,我們可以利用 shell 工具 進行連接,開始搭建 k8s 環境
- 主機名解析
為了集群節點間的直接調用,我們需要配置一下主機名解析,分別在三台服務器上編輯 /etc/hosts
- 同步時間
集群中的時間必須要精確一致,我們可以直接使用chronyd
服務從網絡同步時間,三台服務器需做同樣的操作
- 禁用iptables和firewalld服務
kubernetes和docker在運行中會產生大量的iptables規則,為了不讓系統規則跟它們混淆,直接關閉系統的規則。三台虛擬機需做同樣操作:
# 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系統下的一個安全服務,如果不關閉它,在安裝集群中會產生各種各樣的奇葩問題
# 永久關閉
[root@master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
# 臨時關閉
[root@master ~]# setenforce 0
- 禁用swap分區
swap分區指的是虛擬內存分區,它的作用是在物理內存使用完之后,將磁盤空間虛擬成內存來使用啟用swap設備會對系統的性能產生非常負面的影響,因此kubernetes要求每個節點都要禁用swap設備但是如果因為某些原因確實不能關閉swap分區,就需要在集群安裝過程中通過明確的參數進行配置說明
# 臨時關閉
[root@master ~]# swapoff -a
# 永久關閉
[root@master ~]# vim /etc/fstab
注釋掉swap分區那一行
- 修改linux的內核參數
我們需要修改linux的內核參數,添加網橋過濾和地址轉發功能,編輯/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
# 加載網橋過濾模塊
[root@master ~]# modprobe br_netfilter
# 查看網橋過濾模塊是否加載成功
[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
# 為腳本文件添加執行權限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 執行腳本文件
[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 的鏡像源在國外,速度比較慢,因此我們需要切換成國內的鏡像源
# 編輯 /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 服務器上執行即可
,上面那些是每個服務器都需要執行!
# 創建集群
# 由於默認拉取鏡像地址 k8s.gcr.io 國內無法訪問,這里指定阿里雲鏡像倉庫地址
[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 節點加入集群中,在 node 服務器
上執行上述紅框的命令:
[root@master ~]# kubeadm join 192.168.108.100:6443 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx
便可在 master 節點 獲取到節點信息:
但是我們這個時候查看集群狀態都是為NotReady
,這是因為還沒有配置網絡插件
5、安裝網絡插件
kubernetes支持多種網絡插件,比如flannel、calico、canal等等,這里選擇使用flanne
下載 flanneld-v0.13.0-amd64.docker :下載地址
下載完成后,上傳至 master 服務器 執行以下命令
docker load < flanneld-v0.13.0-amd64.docker
執行完成后便可看到多了個 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
# 再次查看集群節點的狀態
[root@master ~]# kubectl get nodes
這個時候所有節點的狀態都是Ready
的狀態,到此為止,我們的 k8s 集群就算搭建完成了!
5)集群功能驗證
接下來就是我們的驗證時間,之前我們學 docker 的時候往往會啟動一個 nginx 容器來測試是否可用,k8s 我們也同樣來部署一個 nginx 來測試下服務是否可用~
(下面例子為測試例子,如果不清楚每個指令的作用也不要緊,后面我們會出篇 k8s 的教學文章來說明 k8s 如果使用!)
- 首先我們創建一個 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
- 然后創建一個 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 節點的 IP 加上service 暴露出來的 nodePort 來訪問我們的 nginx 服務:
也可以直接在集群中通過 service 的 IP 加上映射出來的 port 來訪問我們的服務:
從結果上看兩種訪問都是可用的,說明我們的 nginx 服務部署成功,不妨點個關注助助興~
公眾號搜索:小菜良記
更多干貨值得閱讀哦!
那么為什么我們可以訪問到 nginx?我們不妨結合上面說到的 k8s 組件來梳理一下各個組件的調用關系:
-
kubernetes 啟動后,無論是 master 節點 亦或者 node 節點,都會將自身的信息存儲到 etcd 數據庫中
-
創建 nginx 服務,首先會將安裝請求發送到 master 節點上的 apiServer 組件中
-
apiServer 組件會調用 scheduler 組件來決定應該將該服務安裝到哪個 node 節點上。這個時候就需要用到 etcd 數據庫了,scheduler會從 etcd 中讀取各個 node 節點的信息,然后按照一定的算法進行選擇,並將結果告知給 apiServer
-
apiServer 調用 controllerManager 去調度 node 節點,並安裝 nginx 服務
-
node 節點上的 kubelet 組件接收到指令后,會通知docker,然后由 docker 來啟動一個 nginx 的pod
pod 是 kubernetes 中的最小操作單元,容器都是跑在 pod 中
-
以上步驟完成后,nginx 服務便運行起來了,如果需要訪問 nginx,就需要通過 kube-proxy 來對 pod 產生訪問的代理,這樣外部用戶就能訪問到這個 nginx 服務
以上便是運行一個服務的全過程,不知道看完之后有沒有一種 肅然起敬
的感覺,設計是在太巧妙了,因此到這里,難道就不准備看 k8s 使用下文!如果准備看的話,小手將關注點起來哦!
END
以上便是 k8s 集群的搭建過程,有了 k8s 的環境,你還怕學不會 k8s 的使用嗎!在自己的虛擬機上盡情折騰,弄壞了也就一個恢復快照的事~ 我是小菜,路漫漫,與你一同求索!
今天的你多努力一點,明天的你就能少說一句求人的話!
我是小菜,一個和你一起學習的男人。
💋
微信公眾號已開啟,小菜良記,沒關注的同學們記得關注哦!