kubernetes 叢集環境搭建
kubernetes元件
一個kubernetes叢集主要是由控制節點(master)、工作節點(node)構成,每個節點上都會安裝不同的元件。
master:叢集的控制平面,負責叢集的決策 ( 管理 )
ApiServer : 資源操作的唯一入口,接收使用者輸入的命令,提供認證、授權、API註冊和發現等機制
Scheduler : 負責叢集資源排程,按照預定的排程策略將Pod排程到相應的node節點上
ControllerManager : 負責維護叢集的狀態,比如程式部署安排、故障檢測、自動擴充套件、滾動更新等
**Etcd **:負責儲存叢集中各種資源物件的資訊
**node:叢集的資料平面,負責為容器提供執行環境 ( 幹活 ) **
Kubelet : 負責維護容器的生命週期,即通過控制docker,來建立、更新、銷燬容器
KubeProxy : 負責提供叢集內部的服務發現和負載均衡
Docker : 負責節點上容器的各種操作
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叢集大體上分為兩類:一主多從和多主多從。
- 一主多從:一臺Master節點和多臺Node節點,搭建簡單,但是有單機故障風險,適合用於測試環境
- 多主多從:多臺Master節點和多臺Node節點,搭建麻煩,安全性高,適合用於生產環境
安裝方式
kubernetes有多種部署方式,目前主流的方式有kubeadm、minikube、二進位制包
- minikube:一個用於快速搭建單節點kubernetes的工具
- kubeadm:一個用於快速搭建kubernetes叢集的工具
- 二進位制包 :從官網下載每個元件的二進位制包,依次去安裝,此方式對於理解kubernetes元件更加有效
說明:現在需要安裝kubernetes的叢集環境,但是又不想過於麻煩,所以選擇使用kubeadm方式
主機規劃
作用 | IP地址 | 作業系統 | 配置 |
---|---|---|---|
Master | 192.168.160.128 | Centos7.5 基礎設施伺服器 | 2顆CPU 2G記憶體 50G硬碟 |
Node1 | 192.168.160.129 | Centos7.5 基礎設施伺服器 | 2顆CPU 2G記憶體 50G硬碟 |
Node2 | 192.168.160.130 | Centos7.5 基礎設施伺服器 | 2顆CPU 2G記憶體 50G硬碟 |
環境搭建
本次環境搭建需要安裝三臺Centos伺服器(一主二從),然後在每臺伺服器中分別安裝docker(18.06.3),kubeadm(1.17.4)、kubelet(1.17.4)、kubectl(1.17.4)程式。
主機安裝
安裝虛擬機器過程中注意下面選項的設定:
-
作業系統環境:CPU(2C) 記憶體(2G) 硬碟(50G)
-
語言選擇:中文簡體
-
軟體選擇:基礎設施伺服器
-
分割槽選擇:自動分割槽
-
網路配置:按照下面配置網路地址資訊
網路地址:192.168.160.128 (每臺主機都不一樣 分別為128、129、130) 子網掩碼:255.255.255.0 預設閘道器:192.168.160.2 DNS: 114.114.114.114
環境初始化
- 檢查作業系統的版本
# 此方式下安裝kubernetes叢集要求Centos版本要在7.5或之上
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
2) 主機名解析
為了方便後面叢集節點間的直接呼叫,在這配置一下主機名解析,企業中推薦使用內部DNS伺服器
# 主機名成解析 編輯三臺伺服器的/etc/hosts檔案,新增下面內容
192.168.160.128 master
192.168.160.129 node1
192.168.160.130 node2
3) 時間同步
kubernetes要求叢集中的節點時間必須精確一致,這裡直接使用chronyd服務從網路同步時間。
企業中建議配置內部的時間同步伺服器
# 啟動chronyd服務
[root@master ~]# systemctl start chronyd
# 設定chronyd服務開機自啟
[root@master ~]# systemctl enable chronyd
# chronyd服務啟動稍等幾秒鐘,就可以使用date命令驗證時間了
[root@master ~]# date
4) 禁用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
5) 禁用selinux
selinux是linux系統下的一個安全服務,如果不關閉它,在安裝叢集中會產生各種各樣的奇葩問題
# 編輯 /etc/selinux/config 檔案,修改SELINUX的值為disabled
# 注意修改完畢之後需要重啟linux服務
SELINUX=disabled
6) 禁用swap分割槽
swap分割槽指的是虛擬記憶體分割槽,它的作用是在實體記憶體使用完之後,將磁碟空間虛擬成記憶體來使用
啟用swap裝置會對系統的效能產生非常負面的影響,因此kubernetes要求每個節點都要禁用swap裝置
但是如果因為某些原因確實不能關閉swap分割槽,就需要在叢集安裝過程中通過明確的引數進行配置說明
# 編輯分割槽配置檔案/etc/fstab,註釋掉swap分割槽一行
# 注意修改完畢之後需要重啟linux服務
UUID=455cc753-7a60-4c17-a424-7741728c44a1 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
# /dev/mapper/centos-swap swap swap defaults 0 0
7)修改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
8)配置ipvs功能
在kubernetes中service有兩種代理模型,一種是基於iptables的,一種是基於ipvs的
兩者比較的話,ipvs的效能明顯要高一些,但是如果要使用它,需要手動載入ipvs模組
# 1 安裝ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadmin -y
# 2 新增需要載入的模組寫入指令碼檔案
[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
# 3 為指令碼檔案新增執行許可權
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 4 執行指令碼檔案
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 5 檢視對應的模組是否載入成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
9) 重啟伺服器
上面步驟完成之後,需要重新啟動linux系統
[root@master ~]# reboot
安裝docker
# 1 切換映象源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2 檢視當前映象源中支援的docker版本
[root@master ~]# yum list docker-ce --showduplicates
# 3 安裝特定版本的docker-ce
# 必須指定--setopt=obsoletes=0,否則yum會自動安裝更高版本
[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 4 新增一個配置檔案
# Docker在預設情況下使用的Cgroup Driver為cgroupfs,而kubernetes推薦使用systemd來代替cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
# 5 啟動docker
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
# 6 檢查docker狀態和版本
[root@master ~]# docker version
安裝kubernetes元件
# 由於kubernetes的映象源在國外,速度比較慢,這裡切換成國內的映象源
# 編輯/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
# 安裝kubeadm、kubelet和kubectl
[root@master ~]# 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"
# 4 設定kubelet開機自啟
[root@master ~]# systemctl enable kubelet
準備叢集映象
# 在安裝kubernetes叢集之前,必須要提前準備好叢集需要的映象,所需映象可以通過下面命令檢視
[root@master ~]# 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
叢集初始化
下面開始對叢集進行初始化,並將node節點加入到叢集中
下面的操作只需要在
master
節點上執行即可
# 建立叢集
[root@master ~]# kubeadm init \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.160.128 (matser節點ip地址)
# 建立必要檔案
[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@node1 ~]# kubeadm join 192.168.160.128:6443 --token 34ss36.7e8h7hsbnofdefo4 --discovery-token-ca-cert-hash sha256:97b77e042abaabf3e7d3df7f10c1932da2cc6b385791496af131165acae99db4
[root@node2 ~]#kubeadm join 192.168.160.128:6443 --token 34ss36.7e8h7hsbnofdefo4 --discovery-token-ca-cert-hash sha256:97b77e042abaabf3e7d3df7f10c1932da2cc6b385791496af131165acae99db4
# 檢視叢集狀態 此時的叢集狀態為NotReady,這是因為還沒有配置網路外掛
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 6m43s v1.17.4
node1 NotReady <none> 22s v1.17.4
node2 NotReady <none> 19s v1.17.4
安裝網路外掛
kubernetes支援多種網路外掛,比如flannel、calico、canal等等,任選一種使用即可,本次選擇flannel
下面操作依舊只在
master
節點執行即可,外掛使用的是DaemonSet的控制器,它會在每個節點上都執行
# 獲取fannel的配置檔案
[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 node
NAME STATUS ROLES AGE VERSION
master Ready master 26d v1.17.4
node1 Ready <none> 26d v1.17.4
node2 Ready <none> 26d v1.17.4
#在node節點執行kubectl命令
scp -r $HOME/.kube node1:$HOME/
scp -r $HOME/.kube node2:$HOME/
#在node節點執行kubectl命令
[root@node1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready master 26d v1.17.4
node1 Ready <none> 26d v1.17.4
node2 Ready <none> 26d v1.17.4
[root@node2 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready master 26d v1.17.4
node1 Ready <none> 26d v1.17.4
node2 Ready <none> 26d v1.17.4
至此,kubernetes的叢集環境搭建完成
需要k8s學習筆記,關注微信公眾號後臺回覆k8s即可獲取