天天看點

Kubernetes_從零開始搭建k8s叢集(親測可用)

作者:毛奇志

一、前言

本文講述從零開始搭建k8s叢集,均使用國内鏡像,版本均統一,使用兩個虛拟機,一個主節點,一個從節點,保證k8s一次搭建成功。

注意:Kubernetes,簡稱K8s,是用8代替名字中間的8個字元“ubernete”而成的縮寫。

二、Centos最小化安裝

安裝K8S需要使用Centos7,每個機器至少2個處理器和2G,這是k8s官網是要求的。

Kubernetes_從零開始搭建k8s叢集(親測可用)

2.1 vmware最小化安裝centos7

vmware最小化安裝centos7,下載下傳好鏡像,不斷下一步,直到完成。

先到官網 https://www.centos.org/download/ 下載下傳centos.iso,如下:

Kubernetes_從零開始搭建k8s叢集(親測可用)

國内的,直接選阿裡雲鏡像就好 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 儲存即可

Kubernetes_從零開始搭建k8s叢集(親測可用)

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,如下圖:

Kubernetes_從零開始搭建k8s叢集(親測可用)

配置好虛拟網絡編輯器之後,再來看靜态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,需要手動設定一下,

Kubernetes_從零開始搭建k8s叢集(親測可用)

三、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報錯

Kubernetes_從零開始搭建k8s叢集(親測可用)

這才是正确的

Kubernetes_從零開始搭建k8s叢集(親測可用)

及時測試:

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就表示安裝成功了。

Kubernetes_從零開始搭建k8s叢集(親測可用)
從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叢集,完成了。

天天打碼,天天進步!!

繼續閱讀