【雲原生 | 從零開始學 Kubernetes】二、使用 kubeadm 搭建 K8S 叢集

語言: CN / TW / HK

安裝要求

  • 兩臺或者多臺機器,為 centos7

  • 2GB 及以上記憶體,2 個 CPU 及以上,硬碟 30G

  • 叢集中所有機器之間網路互通

  • 可以訪問外網

  • 禁止 swap 分割槽

kubeadm 是官方社群推出的一個用於快速部署 kubernetes 叢集的工具。

準備環境

初始化

首先,我們要在三臺機子上做一些操作。關閉防火牆,selinux,swap,設定主機名,ip 解析,時間同步。

# 關閉防火牆systemctl stop firewalldsystemctl disable firewalld
# 關閉selinux# 永久關閉sed -i 's/enforcing/disabled/' /etc/selinux/config # 臨時關閉setenforce 0
# 關閉swap# 臨時swapoff -a # 永久關閉sed -ri 's/.*swap.*/#&/' /etc/fstab
# 根據規劃設定主機名【master節點上操作】hostnamectl set-hostname k8smaster# 根據規劃設定主機名【node1節點操作】hostnamectl set-hostname k8snode1# 根據規劃設定主機名【node2節點操作】hostnamectl set-hostname k8snode2
# 在master新增hostsvim /etc/hosts192.168.11.139 k8smaster192.168.11.140 k8snode1192.168.11.141 k8snode2

# 將橋接的IPv4流量傳遞到iptables的鏈vim /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1
# 生效sysctl --system
# 時間同步yum install ntpdate -yntpdate time.windows.com

複製程式碼

安裝 Docker/kubeadm/kubelet

首先配置一下 Docker 的阿里 yum 源

vim /etc/yum.repos.d/docker.repo[docker-ce-edge]name=Docker CE Edge - \$basearchbaseurl=http://mirrors.aliyun.com/docker-ce/linux/centos/7/\$basearch/edgeenabled=1gpgcheck=1gpgkey=http://mirrors.aliyun.com/docker-ce/linux/centos/gpg

複製程式碼

然後 yum 方式安裝 docker

# yum安裝yum -y install docker-ce
# 檢視docker版本docker --version
# 啟動dockersystemctl enable dockersystemctl start docker

複製程式碼

配置 docker 的映象源

vim /etc/docker/daemon.json{  "registry-mirrors": ["http://b9pmyelo.mirror.aliyuncs.com"]}

複製程式碼

然後重啟 docker

新增 kubernetes 軟體源 三臺機子

然後我們還需要配置一下 yum 的 k8s 軟體源

<code data-type="codeline">vim /etc/yum.repos.d/kubernetes.repo</code><code data-type="codeline">[kubernetes]</code><code data-type="codeline">name=Kubernetes</code><code data-type="codeline">baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64</code><code data-type="codeline">enabled=1</code><code data-type="codeline">gpgcheck=0</code><code data-type="codeline">repo_gpgcheck=0</code><code data-type="codeline">gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg</code>

複製程式碼

安裝 kubeadm,kubelet 和 kubectl

由於版本更新頻繁,這裡指定版本號部署

# 安裝kubelet、kubeadm、kubectl,同時指定版本yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0# 設定開機啟動  systemctl enable kubelet

複製程式碼

部署 Kubernetes Master

在 192.168.177.139 執行,也就是 master 節點

kubeadm init \  --apiserver-advertise-address=192.168.11.139 \    # 當前主機ip--image-repository registry.aliyuncs.com/google_containers \    # 映象      --kubernetes-version v1.18.0 \    # 版本--service-cidr=10.96.0.0/12  \    # 這個引數後的IP地址直接就套用10.96.0.0/12 ,以後安裝時也套用即可,不要更改--pod-network-cidr=10.244.0.0/16  #k8s內部的pod節點之間網路可以使用的IP段,不能和service-cidr寫一樣,如果不知道怎麼配,就先用這個10.244.0.0/16

複製程式碼

由於預設拉取映象地址 k8s.gcr.io 國內無法訪問,這裡指定阿里雲映象倉庫地址,我們 docker images 命令即可檢視已經拉取的映象。

當我們出現下面的情況時,表示 kubernetes 的映象已經安裝成功 然後用裡面提示的命令

使用 kubectl 工具

mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config

複製程式碼

執行完成後,我們使用下面命令,檢視我們正在執行的節點

kubectl get nodes

複製程式碼

能夠看到,目前有一個 master 節點已經運行了,但是還處於未準備狀態

下面我們還需要在 Node 節點執行其它的命令,將 node1 和 node2 加入到我們的 master 節點上

加入 Kubernetes Node

下面我們需要到 node1 和 node2 伺服器,執行下面的程式碼向叢集新增新節點

執行在 kubeadm init 輸出的 kubeadm join 命令:

注意,以下的命令是在 master 初始化完成後,每個人的都不一樣!!!需要複製自己生成的

kubeadm join 192.168.11.139:6443 --token oheovn.apns356uiesu58pa \    --discovery-token-ca-cert-hash sha256:fff629d1ea3a0f082a23a94965adbcc30159b3b9fc50743300f7d75b9653a4be

複製程式碼

預設 token 有效期為 24 小時,當過期之後,該 token 就不可用了。這時就需要重新建立 token,操作如下:

kubeadm token create --print-join-command

複製程式碼

當我們把兩個節點都加入進來後,我們就可以去 Master 節點 執行下面命令檢視情況

kubectl get node

複製程式碼

部署 CNI 網路外掛 master

上面的狀態還是 NotReady,下面我們需要網路外掛,來進行聯網訪問

# 下載網路外掛配置wget http://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

複製程式碼

預設映象地址無法訪問,sed 命令修改為 docker hub 映象倉庫。

# 新增kubectl apply -f http://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 檢視狀態 【kube-system是k8s中的最小單元】kubectl get pods -n kube-system

複製程式碼

執行完成後,我們檢視狀態可以發現,已經變成了 Ready 狀態了

如果上述操作完成後,還存在某個節點處於 NotReady 狀態,可以在 Master 將該節點刪除

# master節點將該節點刪除
#20210223 yan 查閱資料新增###kubectl drain k8snode1 --delete-local-data --force --ignore-daemonsets
kubectl delete node k8snode1 # 然後到k8snode1節點進行重置kubeadm reset# 重置完後在加入kubeadm join 192.168.11.139:6443 --token oheovn.apns356uiesu58pa \ --discovery-token-ca-cert-hash sha256:fff629d1ea3a0f082a23a94965adbcc30159b3b9fc50743300f7d75b9653a4be

複製程式碼

測試 kubernetes 叢集

我們都知道 K8S 是容器化技術,它可以聯網去下載映象,用容器的方式進行啟動

在 Kubernetes 叢集中建立一個 pod,驗證是否正常執行:

# 下載nginx 【會聯網拉取nginx映象】kubectl create deployment nginx --image=nginx# 檢視狀態kubectl get pod

複製程式碼

如果我們出現 Running 狀態的時候,表示已經成功運行了

下面我們就需要將埠暴露出去,讓其它外界能夠訪問

# 暴露埠kubectl expose deployment nginx --port=80 --type=NodePort# 檢視一下對外的埠kubectl get pod,svc

複製程式碼

能夠看到,我們已經成功暴露了 80 埠 到 31865 了

我們到我們的宿主機瀏覽器上,訪問如下地址

http://192.168.177.130:30529/

複製程式碼

發現我們的 nginx 已經成功啟動了

到這裡為止,我們就搭建了一個單 master 的 k8s 叢集

寫在最後

創作不易,如果覺得內容對你有幫助,麻煩給個三連關注支援一下我!如果有錯誤,請在評論區指出,我會及時更改!

目前正在更新的系列:從零開始學 k8s

感謝各位的觀看,文章摻雜個人理解,如有錯誤請聯絡我指出~