艱難的K8s環境準備及叢集安裝--kuberneters
阿新 • • 發佈:2022-05-23
十年河東,十年河西,莫欺少年窮
學無止境,精益求精
- 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