1. 程式人生 > 其它 >k8s簡介,安裝,配置,測試

k8s簡介,安裝,配置,測試

應用部署方式演變

在部署應用程式的方式上,主要經歷了三個時代:

  • 傳統部署:網際網路早期,會直接將應用程式部署在物理機上

    優點:簡單,不需要其它技術的參與

    缺點:不能為應用程式定義資源使用邊界,很難合理地分配計算資源,而且程式之間容易產生影響

  • 虛擬化部署:可以在一臺物理機上執行多個虛擬機器,每個虛擬機器都是獨立的一個環境

    優點:程式環境不會相互產生影響,提供了一定程度的安全性

    缺點:增加了作業系統,浪費了部分資源

  • 容器化部署:與虛擬化類似,但是共享了作業系統

    優點:

    可以保證每個容器擁有自己的檔案系統、CPU、記憶體、程序空間等

    執行應用程式所需要的資源都被容器包裝,並和底層基礎架構解耦

    容器化的應用程式可以跨雲服務商、跨Linux作業系統發行版進行部署

容器化部署方式給帶來很多的便利,但是也會出現一些問題,比如說:

  • 一個容器故障停機了,怎麼樣讓另外一個容器立刻啟動去替補停機的容器
  • 當併發訪問量變大的時候,怎麼樣做到橫向擴充套件容器數量

這些容器管理的問題統稱為容器編排問題,為了解決這些容器編排問題,就產生了一些容器編排的軟體:

  • Swarm:Docker自己的容器編排工具
  • Mesos:Apache的一個資源統一管控的工具,需要和Marathon結合使用
  • Kubernetes:Google開源的的容器編排工具

kubernetes簡介

kubernetes,是一個全新的基於容器技術的分散式架構領先方案,是谷歌嚴格保密十幾年的祕密武器----Borg系統的一個開源版本,於2014年9月釋出第一個版本,2015年7月釋出第一個正式版本。

kubernetes的本質是一組伺服器叢集,它可以在叢集的每個節點上執行特定的程式,來對節點中的容器進行管理。目的是實現資源管理的自動化,主要提供瞭如下的主要功能:

  • 自我修復:一旦某一個容器崩潰,能夠在1秒中左右迅速啟動新的容器
  • 彈性伸縮:可以根據需要,自動對叢集中正在執行的容器數量進行調整
  • 服務發現:服務可以通過自動發現的形式找到它所依賴的服務
  • 負載均衡:如果一個服務起動了多個容器,能夠自動實現請求的負載均衡
  • 版本回退:如果發現新發布的程式版本有問題,可以立即回退到原來的版本
  • 儲存編排:可以根據容器自身的需求自動建立儲存卷

......

kubernetes元件

一個kubernetes叢集主要是由控制節點(master)

工作節點(node)構成,每個節點上都會安裝不同的元件。

master:叢集的控制平面,負責叢集的決策 ( 管理 )

ApiServer : 資源操作的唯一入口,接收使用者輸入的命令,提供認證、授權、API註冊和發現等機制

Scheduler : 負責叢集資源排程,按照預定的排程策略將Pod排程到相應的node節點上

ControllerManager : 負責維護叢集的狀態,比如程式部署安排、故障檢測、自動擴充套件、滾動更新等

Etcd :負責儲存叢集中各種資源物件的資訊

node:叢集的資料平面,負責為容器提供執行環境 ( 幹活 )

Kubelet : 負責維護容器的生命週期,即通過控制docker,來建立、更新、銷燬容器

KubeProxy : 負責提供叢集內部的服務發現和負載均衡

Docker : 負責節點上容器的各種操作

下面,以部署一個nginx服務來說明kubernetes系統各個元件呼叫關係:

  1. 首先要明確,一旦kubernetes環境啟動之後,master和node都會將自身的資訊儲存到etcd資料庫中

  2. 一個nginx服務的安裝請求會首先被髮送到master節點的apiServer元件

  3. apiServer元件會呼叫scheduler元件來決定到底應該把這個服務安裝到哪個node節點上

    在此時,它會從etcd中讀取各個node節點的資訊,然後按照一定的演算法進行選擇,並將結果告知apiServer

  4. apiServer呼叫controller-manager去排程Node節點安裝nginx服務

  5. kubelet接收到指令後,會通知docker,然後由docker來啟動一個nginx的pod

    pod是kubernetes的最小操作單元,容器必須跑在pod中至此,

  6. 一個nginx服務就運行了,如果需要訪問nginx,就需要通過kube-proxy來對pod產生訪問的代理

這樣,外界使用者就可以訪問叢集中的nginx服務了

kubernetes概念

Master:叢集控制節點,每個叢集需要至少一個master節點負責叢集的管控

Node:工作負載節點,由master分配容器到這些node工作節點上,然後node節點上的docker負責容器的執行

Pod:kubernetes的最小控制單元,容器都是執行在pod中的,一個pod中可以有1個或者多個容器

Controller:控制器,通過它來實現對pod的管理,比如啟動pod、停止pod、伸縮pod的數量等等

Service:pod對外服務的統一入口,下面可以維護者同一類的多個pod

Label:標籤,用於對pod進行分類,同一類pod會擁有相同的標籤

NameSpace:名稱空間,用來隔離pod的執行環境

kubernetes叢集環境搭建

環境規劃

安裝方式

Kubernetes 有多種部署方式,目前主流的方式有 kubeadm 、minikube 、二進位制包。

  • ① minikube:一個用於快速搭建單節點的 Kubernetes 工具。

  • ② kubeadm:一個用於快速搭建Kubernetes 叢集的工具(可以用於生產環境)。

  • ③ 二進位制包:從官網上下載每個元件的二進位制包,依次去安裝(建議生產環境使用)。

叢集選擇

Kubernetes 叢集大致分為兩類:一主多從和多主多從。

  • 一主多從:一個 Master 節點和多臺 Node 節點,搭建簡單,但是有單機故障風險,適合用於測試環境。

  • 多主多從:多臺 Master 節點和多臺 Node 節點,搭建麻煩,安全性高,適合用於生產環境。

為了測試方便,本次搭建的是一主多從型別的叢集。

也就是類似這種結構

主機和網路規劃

角色 IP地址 作業系統 配置 hostname
Master 192.168.176.100 CentOS 7.9,基礎設施伺服器 2核CPU,2G記憶體,50G硬碟 master
Node1 192.168.176.101 CentOS 7.9,基礎設施伺服器 2核CPU,2G記憶體,50G硬碟 node1
Node2 192.168.176.102 CentOS 7.9,基礎設施伺服器 2核CPU,2G記憶體,50G硬碟 node2
子網掩碼 255.255.255.0
閘道器 192.168.176.2
DNS 223.5.5.5

軟體和映象準備

VMware 虛擬機器

連結:https://pan.baidu.com/s/1czVESTWnPXIqLDTxyW0t2Q?pwd=j5do
提取碼:j5do

CentOS映象

相關映象地址:

https://www.cnblogs.com/shijunxian/p/12864691.html

映象選擇:

https://www.cnblogs.com/shijunxian/archive/2020/05/14/12866010.html

本文所使用映象:

http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

CentOS系統安裝和配置

語言選擇

簡體中文

軟體選擇

基礎設施伺服器

系統安裝位置

網路和主機名

開啟配置

配置自動連線和所有使用者可連線

配置IPV4 將自動獲取改為靜態

新增ip

由於虛擬機器是NAT模式的,我們需要知道我們的虛擬機器NAT模式網絡卡在哪個網段,開啟編輯->虛擬網路編輯器

現在我們知道了虛擬機器在哪個網段了,開始編輯IPV4設定

配置主機名

設定root使用者密碼

這裡我設定成root

重新啟動和測試

測試

配置沒啥問題

檢視主機名

hostname
# master

以上為master節點的配置

node節點的安裝

node節點的安裝可以按照上面的步驟自己配置,但是這樣太麻煩了,這裡使用VMware 的克隆功能會更方便

參考:https://blog.csdn.net/qq_41125219/article/details/118641132

克隆完成之後需要配置主機名和網路

配置主機名

vi /etc/hostname

:wq儲存退出

配置網路

相關命令:

# 檢視網絡卡
ip addr 
# 修改網路配置(最後一個為網絡卡名稱)
vi /etc/sysconfig/network-scripts/ifcfg-ens33 
# 重啟網路
service network restart

修改為101

重啟一下,重啟即可生效,另一個節點也可以按照這個方式即可

系統初始化(所有節點)

由於是多臺伺服器,不可能說把所有命令在每個會話裡面都敲一遍,所以這裡就要藉助工具了

我用的是這個:http://www.hostbuf.com/t/988.html

檢查作業系統版本

# 檢查作業系統的版本(要求作業系統的版本至少在7.5以上)
cat /etc/redhat-release

關閉防火牆禁止防火牆開機啟動

# 關閉防火牆
systemctl stop firewalld
# 禁止防火牆開機啟動
systemctl disable firewalld

直接傳送到全部會話即可

禁用iptables

kubernetes和docker在執行中會產生大量的iptables規則,為了不讓系統規則跟她們混淆,直接關閉系統的規則

# 關閉iptables
systemctl stop firewalld
# 禁止iptables開機啟動
systemctl disable firewalld

主機名解析

為了方便後面叢集節點間的直接呼叫,需要配置一下主機名解析,企業中推薦使用內部的DNS伺服器。

# 同時修改三臺伺服器的/etc/hosts
cat >> /etc/hosts << EOF
192.168.176.100 master
192.168.176.101 node1
192.168.176.102 node2
EOF

測試

能ping通表示配置成功

時間同步

kubernetes要求叢集中的節點時間必須精確一致,所以在每個節點上新增時間同步

這裡直接使用chronyd服務從網路同步時間

企業中建議配置內部的時間同步伺服器

# 啟動服務
systemctl start chronyd
# 設定服務開機自啟
systemctl enable chronyd
# 使用date命令驗證時間
date

禁用selinux

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

# 檢視selinux是否開啟
getenforce
# 臨時關閉selinux,重啟之後,無效
setenforce 0
# 永久關閉selinux,需要重啟

# 方式一 vi編輯
# 編輯 /etc/selinux/config 檔案,修改SELINUX的值為disabled
vi /etc/selinux/config
# 注意修改完畢之後需要重啟linux服務
SELINUX=disabled

# 方式二 臨時關閉並修改檔案內容
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

# 檢視
 cat /etc/selinux/config

關閉swap分割槽

swap分割槽是指虛擬記憶體分割槽,它的作用實在實體記憶體使用完之後,將磁碟空間虛擬成記憶體來使用

啟用swap裝置會對系統的效能產生非常負面的影響,k8s要求每個節點都禁用swap裝置

但是如果是因為某些原因確實不能關閉swap分割槽,就需要在叢集安裝過程中通過明確的引數進行配置說明

參考:https://github.com/kubernetes/kubernetes/issues/53533

swap優化設定參考:

https://www.jianshu.com/p/8690d6bcf059

# 永久關閉swap分割槽,需要重啟
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 臨時關閉swap分割槽,重啟之後,無效
swapoff -a
# 檢視 已存在的swap分割槽,同時會開啟,注意
swapon -s

# 臨時關閉加永久關閉
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab

修改linux的核心引數

在每個節點上將橋接的IPv4流量傳遞到iptables的鏈

# 修改linux的核心引數,新增網橋過濾和地址轉發功能
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# vm.swappiness的預設值為60,它表示啟用交換之前可用記憶體的百分比。值越低,使用的交換越少
# 0:禁用交換
# 1:不完全禁用交換的最小數量
# 10:當系統中有足夠記憶體時為提高效能而推薦的值
# 100:主動交換
vm.swappiness = 0
EOF

# 由於前面已經禁用了swap這裡可以不設定,所以直接寫入下面的配置即可
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 重新載入配置
sysctl --system

# 載入網橋過濾模組br_netfilter
modprobe br_netfilter

# 檢視是否載入
lsmod | grep br_netfilter

開啟並配置ipvs

在kubernetes中service有兩種代理模型,一種是基於iptables,另一種是基於ipvs的。ipvs的效能要高於iptables的,但是如果要使用它,需要手動載入ipvs模組。

在每個節點安裝ipset和ipvsadm

yum -y install ipset ipvsadm

配置-在所有節點執行如下指令碼

建立配置指令碼

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

為指令碼新增執行許可權

chmod +x /etc/sysconfig/modules/ipvs.modules

執行指令碼

/bin/bash /etc/sysconfig/modules/ipvs.modules

檢視對應模組是否載入成功

lsmod | grep -e ipvs -e nf_conntrack_ipv4

安裝資訊

重啟伺服器

到現在我們已經初始化了相關的配置,有些配置需要重啟才能生效,所以現在重啟所有節點

reboot

k8s和docker之間的版本對應關係

docker和k8s之間是有明確的對應關係的

官方文件:

https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG

如k8s的1.18 對應

安裝docker

切換映象源

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

檢視當前映象源中支援的docker版本

yum list docker-ce --showduplicates

安裝指定版本的docker-ce

# 必須指定--setopt=obsolets=0,否則yum會自動安裝更高版本
yum -y install --setopt=obsolets=0 docker-ce-18.06.3.ce-3.el7 -y

配置docker

# 新增一個配置檔案
# Docker 在預設情況下使用Vgroup Driver為cgroupfs,而Kubernetes推薦使用systemd來替代cgroupfs
# 由於預設映象源預設是國外的,所以將映象改為國內
# 關於映象配置參考https://www.cnblogs.com/makalochen/p/14230753.html#%E8%8E%B7%E5%8F%96%E9%95%9C%E5%83%8F%E5%9C%B0%E5%9D%80

mkdir /etc/docker
cat <<EOF> /etc/docker/daemon.json
{
	"exec-opts": ["native.cgroupdriver=systemd"],
	"registry-mirrors": ["https://68o5mgrg.mirror.aliyuncs.com"]
}
EOF

啟動docker並設定開機自啟動

systemctl enable docker && systemctl start docker

檢視docker版本

docker version

安裝kubernetes元件

配置kubernetes映象源

# 由於kubernetes的映象在國外,速度比較慢,這裡切換成國內的映象源
# 編輯/etc/yum.repos.d/kubernetes.repo,新增下面的配置
# 方式一 直接vi編輯
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=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
			
# 方式二 直接寫入
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安裝kubeadm、kubelet和kubectl

由於版本更新頻繁,這裡指定版本號部署

yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

配置kubelet的cgroup

# 編輯/etc/sysconfig/kubelet, 新增下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

直接使用cat修改

cat > /etc/sysconfig/kubelet << EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

設定kubelet開機自啟

systemctl enable kubelet

準備叢集映象源

檢視所需映象

在安裝kubernetes叢集之前,必須要提前準備好叢集需要的映象,所需映象可以通過下面命令檢視

kubeadm config images list

下載映象

# 下載映象
# 此映象kubernetes的倉庫中,由於網路原因,無法連線,下面提供了一種替換方案
images=(
	kube-apiserver:v1.17.4
	kube-controller-manager:v1.17.4
	kube-scheduler:v1.17.4
	kube-proxy:v1.17.4
	pause:3.1
	etcd:3.4.3-0
	coredns:1.6.5
)

for imageName in ${images[@]};do
	docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
	docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
	docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName 
done

檢視docker映象

docker images

叢集初始化

master節點啟動叢集

下面的操作只需要在master節點上執行即可

# 建立叢集
# 下面是啟動的一些配置,只需要修改一個--apiserver-advertise-address 這個地址為你的master節點的ip地址
kubeadm init \
    --apiserver-advertise-address=192.168.176.100 \
    --kubernetes-version=v1.17.4 \
    --service-cidr=10.96.0.0/12 \
    --pod-network-cidr=10.244.0.0/16
# 建立必要檔案
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

主節點執行

注意看它的提示

這也是為啥建立必要檔案的原因,下面也說了node節點如何加入叢集

node節點加入叢集

下面的操作只需要在node節點上執行即可

將叢集啟動時的命令複製過來到node節點中執行

kubeadm join 192.168.176.100:6443 --token w6sl9b.zn7t2sv278xtnawc \
	--discovery-token-ca-cert-hash sha256:d3d4c028f275ae6b56aa1e2060672994ad022c430c66d9348598fdc3034a0bd2 

加入完成

master檢視節點資訊

在master節點上執行

kubectl get nodes

可以看到節點已經加入進來了,但是為NotReady狀態,這是為什麼呢?這是因為它的網路外掛沒有安裝,他們之間無法正常通訊

網路外掛安裝(只在master節點操作)

只在master節點操作即可

kubernetes支援多種網路外掛,比如flannel、calico、canal等,任選一種即可,本次選擇flannel

下載flannel配置檔案

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果失敗,自行從其他路徑下載

如:

https://www.yuque.com/fairy-era/yg511q/hg3u04#149d60be

[可選]修改flannel.yml 中的映象源

開啟flannel.yml檔案 你會發現,其中有quay.io的倉庫,這個倉庫是國外的倉庫

可以改成國內的quay-mirror.quay.com

使用配置檔案啟動fannel

kubectl apply -f kube-flannel.yml

檢視節點狀態

kubectl get nodes

注意:等待一小會

可以看到已經全部Ready

叢集測試

上面已經將k8s叢集安裝配置完畢

下面在Kubernetes叢集中部署一個Nginx程式,測試下叢集是否正常工作。

部署Nginx

# 建立一個nginx服務
kubectl create deployment nginx  --image=nginx:1.14-alpine

暴露埠

kubectl expose deploy nginx  --port=80 --target-port=80  --type=NodePort

檢視服務

kubectl get pod,svc

檢視pod

訪問

怎麼訪問呢?可以看到nginx暴露的埠有兩個80 和 32644 這兩個那個是對外的呢?

32644是對外的

訪問:

格式:

http://maser節點ip:暴露的埠

例:

http://192.168.176.100:32644