【雲原生 | 從零開始學 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

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