一、前言
本文講述從零開始搭建k8s叢集,均使用國内鏡像,版本均統一,使用兩個虛拟機,一個主節點,一個從節點,保證k8s一次搭建成功。
注意:Kubernetes,簡稱K8s,是用8代替名字中間的8個字元“ubernete”而成的縮寫。
二、Centos最小化安裝
安裝K8S需要使用Centos7,每個機器至少2個處理器和2G,這是k8s官網是要求的。
2.1 vmware最小化安裝centos7
vmware最小化安裝centos7,下載下傳好鏡像,不斷下一步,直到完成。
先到官網 https://www.centos.org/download/ 下載下傳centos.iso,如下:
國内的,直接選阿裡雲鏡像就好 http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/
具體安裝可以參見 https://www.cnblogs.com/liuhui-xzz/p/10155511.html
其實沒這麼麻煩,隻需要配置磁盤這個必選就好了,其他都不用配置,不斷下一步,最好就安裝好了。
2.2 配置靜态IP
建立好的虛拟機 ping www.baidu.com 失敗,需要配置好靜态ip,才能連同外網。
輸入 vi /etc/sysconfig/network-scripts/ifcfg-ens33 然後按照如下圖編輯,最後 service network restart 儲存即可
BOOTPROTO=static ONBOOT=yes DNS1=114.114.114.114 這三個是寫死的,那麼其他三個ip 子網路遮罩 網關是如何确定的呢?這個和本機的ip無關,隻和vmware的虛拟網絡編輯器有關。
vware的虛拟網絡編輯器,需要配置子網路遮罩、子網ip、網關ip
首先是子網路遮罩,一般都是C類,配置為 255.255.255.0 ,沒什麼好說的,然後是子網ip,這個子網ip要受到子網路遮罩的限制,隻有前面三個位元組,最後一個位元組為0,一般是 xxx.xxx.xxx.0,這裡子網IP配置為192.168.100.0,然後再是網關(就是虛拟網絡編輯器的ip),網關ip又受到子網ip的限制,前面三個位元組需要和子網ip一樣,表示是這個子網段内的ip,這裡配置為192.168.100.2,其他可以配置為該子網内任意一個 192.168.100.1 - 192.168.100.127,如下圖:
配置好虛拟網絡編輯器之後,再來看靜态ip的三個字段,NETMASK=255.255.255.0 沒問題,c類都是這樣配置,然後是網關ip GATEWAY,這裡必須和虛拟網絡編輯器的那個網關ip一緻就是192.168.100.2,是以配置GATEWAY=192.168.100.2,然後就是自己的IPADDR了,要保證兩點,在子網段内 且 不和網關ip及該子網段内其他ip沖突,在子網段内就是 192.168.100 開頭,不和網關ip及該子網段内其他ip沖突,就是最後一個不能為 2 或者其他用過的,是以一個是 150 一個是151,即 192.168.100.150 和 192.168.100.151 。
配置靜态ip之後,就可以用xshell連接配接并操作了,不用再使用vmware敲指令,也有yum指令,缺少什麼都可以随時下載下傳,比如最小安裝沒有wget指令,可以yum -y install wget。
因為我們的兩個虛拟機需要作為K8S的兩個節點,每個虛拟機處理數量一定要大于等于2,每個虛拟機記憶體數量一定要大于等于2G,vmware預設是每個虛拟機處理器數量是1,記憶體是1G,需要手動設定一下,
三、K8S叢集搭建
從3.1到3.6,所有機器都執行
3.7和3.8隻在主節點上執行
3.9的kube join隻在從節點上執行(測試kubectl get nodes在主節點上執行,因為從節點沒有.kube/,無法通過kubectl操作k8s叢集)
3.10叢集建立pod測試,在主節點上執行,因為從節點沒有.kube/,無法通過kubectl操作k8s叢集
3.1 更新yum
3台機器都需要執行
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
3.2 安裝Docker
在每一台機器上都安裝好Docker,版本為18.09.0
01 安裝必要的依賴
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
02 設定docker倉庫
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
然後設定一下阿裡雲鏡像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://orptaaqe.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
03 安裝docker
yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io
04 啟動docker
sudo systemctl start docker && sudo systemctl enable docker
05 檢查docker是否安裝并啟動好了
ps -ef|grep docker
3.3 修改hosts檔案
01 機器192.168.100.150執行兩句
sudo hostnamectl set-hostname m
vi /etc/hosts
192.168.100.150 m
192.168.100.151 w1
02 機器192.168.100.151執行兩句
sudo hostnamectl set-hostname w1
vi /etc/hosts
192.168.100.150 m
192.168.100.151 w1
03 每天機器上都要測試
ping m
ping w1
每個步驟配置完成之後,都要局部測試,這樣才不會出問題
3.4 系統基礎前提配置
每個機器上都要執行(機器192.168.100.150 和 機器192.168.100.151),如下:
# (1)關閉防火牆
systemctl stop firewalld && systemctl disable firewalld
# (2)關閉selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# (3)關閉swap 且 寫入到 /etc/fstab 檔案中,保證重新開機機器也生效
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
# (4)配置iptables的ACCEPT規則
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# (5)設定系統參數
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
3.5 安裝 kubeadm, kubelet and kubectl
每個機器上都要執行(機器192.168.100.150 和 機器192.168.100.151),如下:
(1)配置yum源
cat <<EOF > /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
EOF
(2)安裝kubeadm&kubelet&kubectl
yum install -y kubectl-1.14.0-0
yum install -y kubelet-1.14.0-0
yum install -y kubeadm-1.14.0-0
這三個東西一定要保證版本統一,一定要安裝這個安裝順序來完成
因為kubeadm依賴kubelet,如果先安裝kubeadm,則kubelet的1.23版本就會被安裝上去,然後再執行 yum install -y kubelet-1.14.0-0 會安裝不上去,然後版本不統一,主節點初始化init報錯
這才是正确的
及時測試:
kubectl version
kubelet --version
kubeadm version
版本必須都是 1.4.0,如果版本錯了要删除
yum -y remove kubelet
yum -y remove kubectl
yum -y remove kubeadm
(3) docker和k8s設定同一個cgroup
# 編輯docker的daemon.json檔案,每個節點都要執行
vi /etc/docker/daemon.json
"exec-opts": ["native.cgroupdriver=systemd"],
systemctl restart docker
# kubelet,這邊如果發現輸出directory not exist,也說明是沒問題的,大家繼續往下進行即可
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl enable kubelet && systemctl start kubelet
3.6 配置國内鏡像
(1) 建立kubeadm.sh腳本,用于拉取鏡像/打tag/删除原有鏡像
#!/bin/bash
set -e
KUBE_VERSION=v1.14.0
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.10
CORE_DNS_VERSION=1.3.1
GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})
for imageName in ${images[@]} ; do
docker pull $ALIYUN_URL/$imageName
docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName
docker rmi $ALIYUN_URL/$imageName
done
(2) 運作腳本和檢視鏡像
# 運作腳本
sh ./kubeadm.sh
# 檢視鏡像
docker images
至此,上面的3.1到3.6是每個節點都要執行的,就是機器 192.168.100.150 和 192.168.100.151 都要同時執行的,在Xshell裡面,通過
3.7 kube init初始化master
到此為止,兩個機器 192.168.100.150 和 192.168.100.151 還需要沒有主次之分,還沒有說哪個是k8s的主節點,現在 3.7 這個步驟隻需要在 192.168.100.150 節點執行,讓這個機器成為k8s主節點。
(2)初始化master節點
kubeadm init --kubernetes-version=1.14.0 \
--apiserver-advertise-address=192.168.100.150 --pod-network-cidr=10.244.0.0/16
在 192.168.100.150 機器上執行,然後這個 --apiserver-advertise-address=192.168.100.150 這樣寫
會得到一句
kubeadm join 192.168.100.150:6443 --token 7oahxf.bk0rywevgu0xjouy
–discovery-token-ca-cert-hash sha256:4f84a48cc41343848d0b2f807c38937bc96d3d43e821f06b0c143a5282a38204
一定要複制粘貼出來,下一個步驟在 192.168.100.151 機器上執行這句。
初始化完成執行後,繼續隻在 主節點 上執行,這三句,如下:
mkdir -p $HOME/.kube
cd .kube/
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
注意:我們所說的隻有主節點才能通過 kubectl 指令操作k8s叢集是因為,隻有主節點上才完成這三步操作,才有 .kube 目錄,如果從節點上也完成了這三句,也有 .kube 目錄,也是可以通過 kubectl 指令操作k8s叢集的。
(4) 測試:驗證pod和健康檢查(這兩句也是隻在master節點上執行)
# 驗證pod
kubectl get pods -n kube-system
# 健康檢查(不要懷疑,就是healthz)
curl -k https://localhost:6443/healthz
3.8 部署calico網絡插件
k8s中,網絡插件是為了k8s叢集内部通信,是以必須安裝一個網絡插件,有很多選擇,這裡選擇calico,同樣在master節點上操作
# 在k8s中安裝calico(這條指令很快的)
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml
# 确認一下calico是否安裝成功 -w可以實時變化(看到calico都好了表示網絡插件好了)
kubectl get pods --all-namespaces -w
測試驗證是否安裝成功,這裡的calico兩個顯示Running就表示安裝成功了。
從3.1到3.6,所有機器都執行,3.7和3.8隻在主節點上執行,接下來的3.9的kube join隻在從節點上執行(測試kubectl get nodes在主節點上執行,因為從節點沒有.kube/,無法通過kubectl操作k8s叢集)
3.9 kube join
(1) 在從節點上執行kube join指令,如下
kubeadm join 192.168.100.150:6443 --token 7oahxf.bk0rywevgu0xjouy \
--discovery-token-ca-cert-hash sha256:4f84a48cc41343848d0b2f807c38937bc96d3d43e821f06b0c143a5282a38204
記得儲存初始化master節點的最後列印資訊,注意這邊大家要自己的,下面我的隻是一個參考
(2)在master節點上檢查叢集資訊(node的正常狀态是ready,pod的正常狀态是running)
kubectl get nodes
當每個節點都是Ready,表示完成。
3.10 建立Pod測試整個叢集
(1)定義pod.yml檔案,比如pod_nginx_rs.yaml
cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
labels:
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
name: nginx
labels:
tier: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
EOF
(2)根據pod_nginx_rs.yml檔案建立pod
kubectl apply -f pod_nginx_rs.yaml
(3)檢視pod
kubectl get pods
kubectl get pods -o wide
kubectl describe pod nginx
(4)感受通過rs将pod擴容
kubectl scale rs nginx --replicas=5
kubectl get pods -o wide
(5)删除pod
kubectl delete -f pod_nginx_rs.yaml
四、尾聲
從零開始搭建k8s叢集,完成了。
天天打碼,天天進步!!