k8s簡介,安裝,配置,測試
應用部署方式演變
在部署應用程式的方式上,主要經歷了三個時代:
-
傳統部署:網際網路早期,會直接將應用程式部署在物理機上
優點:簡單,不需要其它技術的參與
缺點:不能為應用程式定義資源使用邊界,很難合理地分配計算資源,而且程式之間容易產生影響
-
虛擬化部署:可以在一臺物理機上執行多個虛擬機器,每個虛擬機器都是獨立的一個環境
優點:程式環境不會相互產生影響,提供了一定程度的安全性
缺點:增加了作業系統,浪費了部分資源
-
容器化部署:與虛擬化類似,但是共享了作業系統
優點:
可以保證每個容器擁有自己的檔案系統、CPU、記憶體、程序空間等
執行應用程式所需要的資源都被容器包裝,並和底層基礎架構解耦
容器化的應用程式可以跨雲服務商、跨Linux作業系統發行版進行部署
容器化部署方式給帶來很多的便利,但是也會出現一些問題,比如說:
- 一個容器故障停機了,怎麼樣讓另外一個容器立刻啟動去替補停機的容器
- 當併發訪問量變大的時候,怎麼樣做到橫向擴充套件容器數量
這些容器管理的問題統稱為容器編排問題,為了解決這些容器編排問題,就產生了一些容器編排的軟體:
- Swarm:Docker自己的容器編排工具
- Mesos:Apache的一個資源統一管控的工具,需要和Marathon結合使用
- Kubernetes:Google開源的的容器編排工具
kubernetes簡介
kubernetes,是一個全新的基於容器技術的分散式架構領先方案,是谷歌嚴格保密十幾年的祕密武器----Borg系統的一個開源版本,於2014年9月釋出第一個版本,2015年7月釋出第一個正式版本。
kubernetes的本質是一組伺服器叢集,它可以在叢集的每個節點上執行特定的程式,來對節點中的容器進行管理。目的是實現資源管理的自動化,主要提供瞭如下的主要功能:
- 自我修復:一旦某一個容器崩潰,能夠在1秒中左右迅速啟動新的容器
- 彈性伸縮:可以根據需要,自動對叢集中正在執行的容器數量進行調整
- 服務發現:服務可以通過自動發現的形式找到它所依賴的服務
- 負載均衡:如果一個服務起動了多個容器,能夠自動實現請求的負載均衡
- 版本回退:如果發現新發布的程式版本有問題,可以立即回退到原來的版本
- 儲存編排:可以根據容器自身的需求自動建立儲存卷
......
kubernetes元件
一個kubernetes叢集主要是由控制節點(master)
master:叢集的控制平面,負責叢集的決策 ( 管理 )
ApiServer : 資源操作的唯一入口,接收使用者輸入的命令,提供認證、授權、API註冊和發現等機制
Scheduler : 負責叢集資源排程,按照預定的排程策略將Pod排程到相應的node節點上
ControllerManager : 負責維護叢集的狀態,比如程式部署安排、故障檢測、自動擴充套件、滾動更新等
Etcd :負責儲存叢集中各種資源物件的資訊
node:叢集的資料平面,負責為容器提供執行環境 ( 幹活 )
Kubelet : 負責維護容器的生命週期,即通過控制docker,來建立、更新、銷燬容器
KubeProxy : 負責提供叢集內部的服務發現和負載均衡
Docker : 負責節點上容器的各種操作
下面,以部署一個nginx服務來說明kubernetes系統各個元件呼叫關係:
-
首先要明確,一旦kubernetes環境啟動之後,master和node都會將自身的資訊儲存到etcd資料庫中
-
一個nginx服務的安裝請求會首先被髮送到master節點的apiServer元件
-
apiServer元件會呼叫scheduler元件來決定到底應該把這個服務安裝到哪個node節點上
在此時,它會從etcd中讀取各個node節點的資訊,然後按照一定的演算法進行選擇,並將結果告知apiServer
-
apiServer呼叫controller-manager去排程Node節點安裝nginx服務
-
kubelet接收到指令後,會通知docker,然後由docker來啟動一個nginx的pod
pod是kubernetes的最小操作單元,容器必須跑在pod中至此,
-
一個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:暴露的埠
例: