《k8s 集群搭建》不要讓貧窮扼殺了你學 k8s 的興趣!


大家好,歡迎來到小菜個人 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的同學肯定第一時間想到dockerdocker 的容器化部署方式確實給我們帶來了很多便利,但是問題也是存在的,有時候這些問題會被我們刻意性的回避,因為 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

image-20210410200006452

  • 然后就可以看到安裝過程:

  • 過一會便會看到讓我們選擇語言的界面,這里選擇中文並繼續

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

  • 然后我們需要點擊 網絡和主機名 進入網絡配置

  • 我們在 tarbar 欄點擊 編輯 -> 虛擬網絡編輯器 查看虛擬機的子網IP

  • 這邊我們手動自定義添加 Ipv4 的地址,DNS服務器可填阿里雲的

我們分配的地址需要排除 25502 這兩個地址,分別是廣播和網關地址。

我是這樣配置的:

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服務從網絡同步時間,三台服務器需做同樣的操作

  • 禁用iptablesfirewalld服務

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

selinuxlinux系統下的一個安全服務,如果不關閉它,在安裝集群中會產生各種各樣的奇葩問題

# 永久關閉
[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 功能

kubernetesservice有兩種代理模型,一種是基於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、然后安裝kubeadmkubeletkubectl 三個組件

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支持多種網絡插件,比如flannelcalicocanal等等,這里選擇使用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 組件來梳理一下各個組件的調用關系:

  1. kubernetes 啟動后,無論是 master 節點 亦或者 node 節點,都會將自身的信息存儲到 etcd 數據庫中

  2. 創建 nginx 服務,首先會將安裝請求發送到 master 節點上的 apiServer 組件中

  3. apiServer 組件會調用 scheduler 組件來決定應該將該服務安裝到哪個 node 節點上。這個時候就需要用到 etcd 數據庫了,scheduler會從 etcd 中讀取各個 node 節點的信息,然后按照一定的算法進行選擇,並將結果告知給 apiServer

  4. apiServer 調用 controllerManager 去調度 node 節點,並安裝 nginx 服務

  5. node 節點上的 kubelet 組件接收到指令后,會通知docker,然后由 docker 來啟動一個 nginxpod

    podkubernetes 中的最小操作單元,容器都是跑在 pod

  6. 以上步驟完成后,nginx 服務便運行起來了,如果需要訪問 nginx,就需要通過 kube-proxy 來對 pod 產生訪問的代理,這樣外部用戶就能訪問到這個 nginx 服務

以上便是運行一個服務的全過程,不知道看完之后有沒有一種 肅然起敬 的感覺,設計是在太巧妙了,因此到這里,難道就不准備看 k8s 使用下文!如果准備看的話,小手將關注點起來哦!

END

以上便是 k8s 集群的搭建過程,有了 k8s 的環境,你還怕學不會 k8s 的使用嗎!在自己的虛擬機上盡情折騰,弄壞了也就一個恢復快照的事~ 我是小菜,路漫漫,與你一同求索!

看完不贊,都是壞蛋

今天的你多努力一點,明天的你就能少說一句求人的話!

我是小菜,一個和你一起學習的男人。 💋

微信公眾號已開啟,小菜良記,沒關注的同學們記得關注哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM