1. 程式人生 > 其它 >kubernetes 叢集環境搭建

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
    

環境初始化

  1. 檢查作業系統的版本
# 此方式下安裝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即可獲取