1. 程式人生 > 其它 >艱難的K8s環境準備及叢集安裝--kuberneters

艱難的K8s環境準備及叢集安裝--kuberneters

十年河東,十年河西,莫欺少年窮

學無止境,精益求精

  • Kubernetes叢集大致分為兩類:一主多從和多主多從。
  • 一主多從:一個Master節點和多臺Node節點,搭建簡單,但是有單機故障風險,適合用於測試環境。
  • 多主多從:多臺Master和多臺Node節點,搭建麻煩,安全性高,適合用於生產環境。

 本篇採用一主二從模式進行,該模式用於測試環境,真實環境還得是多主多從,防止單點故障

k8s環境準備

1、準備三臺虛擬機器,分別命名為master 、 node1 、 node2

master  192.168.136.135
node1   192.168.136.136
node2   192.168.136.137

2、檢查作業系統的版本(要求三臺伺服器作業系統的版本至少在7.5以上):

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

3、三臺伺服器上設定分別設定主機名及主機名解析

設定主機名

  • 設定192.168.136.135 的主機名:
hostnamectl set-hostname master
  • 設定192.168.136.136 的主機名:
hostnamectl set-hostname node1
  • 設定192.168.136.137 的主機名:
hostnamectl set
-hostname node2

主機名解析(三臺伺服器均要執行)

vim /etc/hosts

在三臺虛擬機器的 hosts 檔案中增加如下配置

192.168.136.135  master
192.168.136.136  node1
192.168.136.137  node2

此時三臺虛擬機器可以相互 ping 通

我在master 中 ping node1虛擬機器

 4、三臺伺服器上關閉防火牆和禁止防火牆開機啟動【生產環境謹慎操作】

關閉

systemctl stop firewalld

禁用

systemctl disable firewalld

5、三臺伺服器上進行時間同步

安裝時間外掛

yum install ntpdate -y

同步時間

ntpdate time.windows.com

6、三臺伺服器上關閉selinux

檢視selinux是否開啟
getenforce
永久關閉selinux,需要重啟
sed -i 's/enforcing/disabled/' /etc/selinux/config
臨時關閉selinux,重啟之後,無效
setenforce 0

這裡採用永久關閉,關閉後暫不重啟,配置完後,一塊重啟

7、三臺伺服器上關閉swap分割槽

  • 永久關閉swap分割槽,需要重啟:
sed -ri 's/.*swap.*/#&/' /etc/fstab
  • 臨時關閉swap分割槽,重啟之後,無效::
swapoff -a

這裡採用永久關閉,關閉後暫不重啟,配置完後,一塊重啟

8、三臺伺服器上將橋接的IPv4流量傳遞到iptables的鏈

  • 在每個節點上將橋接的IPv4流量傳遞到iptables的鏈:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
載入br_netfilter模組
# 載入br_netfilter模組
modprobe br_netfilter
檢視是否載入
# 檢視是否載入
lsmod | grep br_netfilter
生效
# 生效
sysctl --system

9、三臺伺服器上開啟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 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
  • 檢查是否載入:
lsmod | grep -e ipvs -e nf_conntrack_ipv4

10、重啟三臺伺服器

reboot

以上便完成了K8s環境的搭建

三臺伺服器上安裝K8s所需的元件,Docker、kubeadm、kubelet和kubectl

11、三臺伺服器上安裝docker

指定阿里雲加速

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

安裝指定版本

yum -y install docker-ce-18.06.3.ce-3.el7

開機自啟動docker 

systemctl enable docker && systemctl start docker

檢視docker 版本

docker version
  • 設定Docker映象加速器:
mkdir -p  /etc/docker

設定阿里雲Yum源 【可登入自己的阿里雲,搜尋容器映象服務,配置docker映象加速器】

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],    
  "registry-mirrors": ["https://du3ia00u.mirror.aliyuncs.com"],    
  "live-restore": true,
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"},
  "storage-driver": "overlay2"
}
EOF

載入docker配置 並 重啟docekr 

sudo systemctl daemon-reload

重啟docker

sudo systemctl restart docker

12、三臺伺服器上安裝 kubeadm、kubelet和kubectl 三個元件

新增阿里雲的YUM軟體源
  • 由於kubernetes的映象源在國外,非常慢,這裡切換成國內的阿里雲映象源:
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 -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
  • 為了實現Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建議修改"/etc/sysconfig/kubelet"檔案的內容:
vim /etc/sysconfig/kubelet

修改檔案內容為:

KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
  • 設定為開機自啟動即可,由於沒有生成配置檔案,叢集初始化後自動啟動:
systemctl enable kubelet

至此,K8s的四個元件安裝及配置完畢

部署K8s叢集

13、部署K8s叢集的Master節點

檢視K8s所需映象

kubeadm config images list

14、部署K8s Master 節點【只需在Master節點執行即可,我的master節點的Ip地址為:192.168.136.135】

# 由於預設拉取映象地址k8s.gcr.io國內無法訪問,這裡需要指定阿里雲映象倉庫地址
kubeadm init \
  --apiserver-advertise-address=192.168.136.135 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.18.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16
根據提示,在master節點上做如下配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id
-u):$(id -g) $HOME/.kube/config

14、部署K8s叢集的Node節點,Node節點加入叢集

在兩個Node節點,執行Master節點的提示語句,使子節點加入master叢集

kubeadm join 192.168.136.135:6443 --token cuzc43.83wxhfwd4mgul4ts \
    --discovery-token-ca-cert-hash sha256:6eac1ffac64643db9b89cc131a7f731c1ddb302ca3653c931c97283999ef2962 
  • 預設的token有效期為2小時,當過期之後,該token就不能用了,這時可以使用如下的命令建立token:
kubeadm token create --print-join-command

當然,為了防止以後其他子節點加入時Token過期,我們生產一個永不過期的token 

# 生成一個永不過期的token
kubeadm token create --ttl 0 --print-join-command

執行完畢後,在Master節點檢視子節點的資訊

kubectl get nodes

ok,截止到這兒,k8s節點叢集就初步完成了。但三個節點的狀態都是NotReady ,為什麼?

 15、部署CNI網路外掛

  • kubernetes支援多種網路外掛,比如flannel、calico、canal等,任選一種即可,本次選擇flannel, 
  • 在Master節點上獲取flannel配置檔案(可能會失敗,如果失敗,請下載到本地,然後安裝):
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml