前言
大家好,我是秋意零。
前面一篇中,我們介紹了 kubeadm 的工作流程。那么今天我們就實(shí)際操作一下,探索如何快速、高效地從 0 開始搭建一個(gè)完整的 Kubernetes 集群,讓你輕松駕馭容器化技術(shù)的力量!!?? 簡(jiǎn)介
- ?? 個(gè)人主頁: 秋意零
- ?? 個(gè)人介紹:在校期間參與眾多云計(jì)算相關(guān)比賽,如:?? “省賽”、“國賽”,并斬獲多項(xiàng)獎(jiǎng)項(xiàng)榮譽(yù)證書
- ?? 目前狀況:24 屆畢業(yè)生,拿到一家私有云(IAAS)公司 offer,暑假開始實(shí)習(xí)
- ?? 賬號(hào):各個(gè)平臺(tái), 秋意零 賬號(hào)創(chuàng)作者、 云社區(qū) 創(chuàng)建者
- ?? 歡迎大家:歡迎大家一起學(xué)習(xí)云計(jì)算,走向年薪 30 萬
系列文章目錄
【云原生|探索 Kubernetes-1】容器的本質(zhì)是進(jìn)程
【云原生|探索 Kubernetes-2】容器 Linux Cgroups 限制
【云原生|探索 Kubernetes 系列 3】深入理解容器進(jìn)程的文件系統(tǒng)
【云原生|探索 Kubernetes 系列 4】現(xiàn)代云原生時(shí)代的引擎
【云原生|探索 Kubernetes 系列 5】簡(jiǎn)化 Kubernetes 的部署,深入解析其工作流程
正文開始:
- 快速上船,馬上開始掌舵了(Kubernetes),距離開船還有 3s,2s,1s…
如果不太關(guān)注如何手動(dòng)部署 Kubernetes 集群的朋友,可以跳過或者使用 MiniKube 、Kind、國內(nèi)版的 MiniKube本地啟動(dòng)簡(jiǎn)單的 Kubernetes 集群進(jìn)行后面的學(xué)習(xí)即可。這里簡(jiǎn)單介紹一下 MiniKube 啟動(dòng)集群( MiniKube 官方文檔),詳解介紹 kubeadm 啟動(dòng)集群。
上一篇中留下一個(gè)問題,大家都清楚了嗎?
kubeadm 方式部署集群,不能應(yīng)用在生產(chǎn)環(huán)境當(dāng)中,原因是沒有生產(chǎn)級(jí)別可用的:類似于高可用、授權(quán)、多租戶、災(zāi)難備份等功能,所以只要支持高可用等生產(chǎn)級(jí)別就行,我們探討的 kubeadm 部署集群方式,不支持。
大家可以去了解一下 kubeadm 創(chuàng)建高可用性集群,后續(xù)也會(huì)講到,期待一下吧。
一、MiniKube 啟動(dòng)集群
MiniKube 官方文檔:https://minikube.sigs.k8s.io/docs/start/
1.安裝 Docker
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加軟件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安裝Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 開啟Docker服務(wù)
sudo service docker start
systemctl enable docker
2.啟動(dòng)集群
minikube start --force
minikube kubectl -- get po -A
alias kubectl="minikube kubectl --"
kubectl get po -A
查看組件(Pod)是否運(yùn)行:
二、kubeadm 部署準(zhǔn)備工作
本地我們一般是使用 VMware Workstation 虛擬機(jī)軟件。安裝虛擬機(jī)點(diǎn)這里。
- Linux 主機(jī),3.10 及以上的內(nèi)核版本(如:CentOS 7)
- 至少 2 GB RAM(內(nèi)存)
- 至少 2 個(gè) CPU 核心
- 集群所有機(jī)器的網(wǎng)絡(luò)相互連接
- 節(jié)點(diǎn)之中不可以有重復(fù)的主機(jī)名、MAC 地址或 product_uuid
- 禁用 swap 交換分區(qū)。為了保證 kubelet 正常工作,必須禁用交換分區(qū)。(永久關(guān)閉)
更多詳細(xì)信息
1.我準(zhǔn)備的機(jī)器配置如下:
- 4 GB RAM
- 2 個(gè) CPU 核心
- 100 GB磁盤(至少保證 20 GB)
- 內(nèi)網(wǎng)互通、外網(wǎng)單通(NAT)
2.實(shí)踐的目標(biāo):
我們部署的 Kubernetes 版本是 v1.23.1 基于 Docker,如果想使用 containerd 點(diǎn)這里:kubernetes-v1.25.3 基于containerd 容器運(yùn)行時(shí)。
- 基礎(chǔ)環(huán)境配置,如:關(guān)閉防火墻、selinux、swap 等;
- 安裝 Docker ;
- 安裝 kubeadm、kubelet、kubectl ;
- kubeadm 初始化 Kubernetes 集群(Master、Node 節(jié)點(diǎn));
- 部署 flannel 網(wǎng)絡(luò)插件;
- 部署 Dashboard 可視化插件。
四、基礎(chǔ)環(huán)境配置
注意:Master 和 Node 節(jié)點(diǎn)都操作。
# 修改主機(jī)名
hostnamectl set-hostname master
hostnamectl set-hostname worker
# 主機(jī)映射
cat >> /etc/hosts << EOF
192.168.200.15 master
192.168.200.16 worker
EOF
# 關(guān)閉 firewalld
systemctl stop firewalld
systemctl disable firewalld
#臨時(shí)關(guān)閉 selinux
setenforce 0
#永久關(guān)閉 selinux
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
# 關(guān)閉swap分區(qū)
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
#配置 yum
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
#時(shí)間同步
yum install ntpdate -y
ntpdate ntp1.aliyun.com
轉(zhuǎn)發(fā) IPv4 并讓 iptables 看到橋接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 設(shè)置所需的 sysctl 參數(shù),參數(shù)在重新啟動(dòng)后保持不變
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 應(yīng)用 sysctl 參數(shù)而不重新啟動(dòng)
sudo sysctl --system
#確認(rèn) br_netfilter 和 overlay 模塊被加載
lsmod | grep br_netfilter
lsmod | grep overlay
#系統(tǒng)變量在sysctl 配置中被設(shè)置為 1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
五、安裝 Docker
注意:Master 和 Node 節(jié)點(diǎn)都操作。
阿里巴巴開源鏡像站
# step 1: 安裝必要的一些系統(tǒng)工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加軟件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安裝Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 開啟Docker服務(wù)
sudo service docker start
systemctl enable docker
#配置 docker 加速地址和 Cgroup
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://uwtwp6l0.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl restart docker
六、安裝 kubeadm、kubelet、kubectl
注意:Master 和 Node 節(jié)點(diǎn)都操作。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 安裝 kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1,這樣我們 Kubernetes 集群版本也對(duì)應(yīng)會(huì)安裝 v1.23.1 版本
yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1
systemctl enable kubelet && systemctl start kubelet
# 為了實(shí)現(xiàn) docker 使用的 cgroupdriver 與 kubelet 使用的 Cgroup 的一致性
cat > /etc/sysconfig/kubelet << EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
七、kubeadm 初始化 Kubernetes 集群
1.Master 節(jié)點(diǎn)操作
-
注意:安裝 Kubernetes 時(shí),我們對(duì)應(yīng)組件鏡像,如果沒有科學(xué)上網(wǎng)是拉取不下來的,這里使用
--image-repository=registry.aliyuncs.com/google_containers
參數(shù)替換從默認(rèn)鏡像倉庫拉取,改為 aliyun 鏡像倉庫。
# 查看 k8s 組件鏡像
kubeadm config images list
# 下載 k8s 組件鏡像
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.23.1
# 創(chuàng)建 k8s 集群(初始化)
kubeadm init --kubernetes-version=v1.23.1 --pod-network-cidr=10.244.0.0/16 --image-repository=registry.aliyuncs.com/google_containers
- 復(fù)制證書到
.kube
目錄下,kubectl 默認(rèn)會(huì)使用這個(gè)目錄下的授權(quán)信息訪問 Kubernetes 集群;如果不這樣做的話,我們每次都需要通過export KUBECONFIG
環(huán)境變量告訴 kubectl 這個(gè)安全配置文件的位置。
# 復(fù)制證書到 .kube 目錄下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.Node 節(jié)點(diǎn)操作
- Master 節(jié)點(diǎn)執(zhí)行,生成 bootstrap-token,非安全模式連接 Master 節(jié)點(diǎn)。
$ kubeadm token create --print-join-command
kubeadm join 192.168.200.15:6443 --token ylls57.b0gfk6o9zq5wslgc --discovery-token-ca-cert-hash sha256:c16a38026f66381f5911f1fdbe44220069b969b83174486e5b602c11646b0a51
- Node 節(jié)點(diǎn)執(zhí)行,上訴生成的 bootstrap-token,連接 Master 節(jié)點(diǎn),加入集群。
kubeadm join 192.168.200.15:6443 --token ylls57.b0gfk6o9zq5wslgc --discovery-token-ca-cert-hash sha256:c16a38026f66381f5911f1fdbe44220069b969b83174486e5b602c11646b0a51
3.部署網(wǎng)絡(luò)插件
注意:Master 節(jié)點(diǎn)操作
通過 kubectl get
命令查看集群節(jié)點(diǎn)狀態(tài)和 所以 Pod 狀態(tài),如圖:可以看到 Node 節(jié)點(diǎn) STATUS NotReady (未就緒)而 Pod coredns 的狀態(tài)是 Pending ,這是為什么呢?
- 在調(diào)試 Kubernetes 集群時(shí),最重要的手段就是用
kubectl describe
命令來查看這個(gè)節(jié)點(diǎn)對(duì)象的詳細(xì)信息、狀態(tài)和事件(Event):
NotReady 和 Pending 的原因在于:我們尚未部署任何網(wǎng)絡(luò)插件。
部署網(wǎng)絡(luò)插件,以 flannel 為例:
yum install -y wget
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
部署完成后,我們?cè)诖尾榭?Node 和 coredns Pod 的狀態(tài):
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
localhost.localdomain Ready <none> 12m v1.23.1
master Ready control-plane,master 80m v1.23.1
[root@master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-7dchq 1/1 Running 0 4m
kube-flannel kube-flannel-ds-w7kh9 1/1 Running 0 4m
kube-system coredns-6d8c4cb4d-9tkz5 1/1 Running 0 82m
kube-system coredns-6d8c4cb4d-q4jcx 1/1 Running 0 64m
kube-system etcd-master 1/1 Running 0 82m
kube-system kube-apiserver-master 1/1 Running 0 82m
kube-system kube-controller-manager-master 1/1 Running 0 82m
kube-system kube-proxy-4vpws 1/1 Running 0 82m
kube-system kube-proxy-ss7xr 1/1 Running 0 14m
kube-system kube-scheduler-master 1/1 Running 0 82m
Kubernetes 支持容器網(wǎng)絡(luò)插件,使用的是一個(gè)名叫 CNI 的通用接口,它也是當(dāng)前容器網(wǎng)絡(luò)的事實(shí)標(biāo)準(zhǔn),市面上的所有容器網(wǎng)絡(luò)開源項(xiàng)目都可以通過 CNI 接入 Kubernetes,比如 Flannel、Calico、Canal、Romana 等等
八、部署 Dashboard 可視化插件
下載 Dashboard 的 YAML 文件
官方 GitHub下載地址:https://github.com/kubernetes/dashboard/releases
# 下載 dashboard 的 recommended.yaml
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
下載后 vi 或 vim,編輯 recommended.yaml 在 Service 服務(wù)名為:kubernetes-dashboard
的指定位置,添加 NodePort
方式訪問 Dashbaord ,如圖:
部署 dashboard,這里需要等待 2 分鐘左右,拉取鏡像時(shí)間,可以使用 kubectl get pod -A
查看 dashbaord 的 Pod 是否運(yùn)行了。
kubectl apply -f recommended.yaml
獲取 token 值,這個(gè) token 值登錄 dashboard 時(shí)需要使用:
kubectl describe secret -n kubernetes-dashboard $(kubectl get secret -n kubernetes-dashboard | grep kubernetes-dashboard-token | awk '{print $1}')
瀏覽器訪問
注意:這里默認(rèn)使用的是 https 協(xié)議,不是 http 協(xié)議。
查看 dashbaord 的 service 服務(wù)提供的端口,這里為:31080。所以,瀏覽器輸入:https://192.168.200.15:31080
(格式:https://宿主機(jī)ip:31080)
[root@master test]# kubectl get service -A | grep kubernetes-dashboard
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.99.233.125 <none> 8000/TCP 43m
kubernetes-dashboard kubernetes-dashboard NodePort 10.98.222.55 <none> 443:31080/TCP 43m
- 訪問時(shí)出現(xiàn)下列錯(cuò)誤
解決方法是:保持焦點(diǎn)在頁面內(nèi),鼠標(biāo)在頁面空白處點(diǎn)擊(不選中任何按鈕),直接輸入“thisisunsafe”,輸完后按回車鍵,就可以正常訪問網(wǎng)頁。
這里要注意的是,輸入的時(shí)候頁面時(shí)不會(huì)有任何反應(yīng)的,也不會(huì)顯示輸入的字符,是正?,F(xiàn)象。輸入完畢后點(diǎn)回車即可。
- 輸入前面獲取的 token 值,登錄即可。
進(jìn)入 Dashbaord 最終界面:
九、部署存儲(chǔ)插件
為了實(shí)現(xiàn)容器持久化存儲(chǔ),我們這里部署 Rook 項(xiàng)目。
- Rook 項(xiàng)目是一個(gè)基于 Ceph 的 Kubernetes 存儲(chǔ)插件。Rook 將分布式存儲(chǔ)系統(tǒng)轉(zhuǎn)變?yōu)樽晕夜芾?、自我擴(kuò)展、自我修復(fù)的存儲(chǔ)服務(wù)。它自動(dòng)執(zhí)行存儲(chǔ)管理員的任務(wù):部署、引導(dǎo)、配置、供應(yīng)、擴(kuò)展、升級(jí)、遷移、災(zāi)難恢復(fù)、監(jiān)控和資源管理。
容器的持久化存儲(chǔ),就是用來保存容器存儲(chǔ)狀態(tài)的手段。存儲(chǔ)插件為容器提供遠(yuǎn)程數(shù)據(jù)卷,使得容器里面的數(shù)據(jù),被保存在遠(yuǎn)程存儲(chǔ)服務(wù)器的磁盤中,或者以分布式的方式保存在多個(gè)節(jié)點(diǎn)上,而與當(dāng)前宿主機(jī)的存儲(chǔ)沒有任何綁定關(guān)系。
這樣無論你在哪個(gè)宿主機(jī)上啟動(dòng)新的容器,都可以請(qǐng)求掛載指定的持久化存儲(chǔ)卷,從而訪問到數(shù)據(jù)卷里保存的內(nèi)容。
部署 ROOK
ROOK 官網(wǎng):https://rook.io/
官網(wǎng)下載地址:https://github.com/rook/rook/releases
# 如果 git 不下來,就使用上述提供的官網(wǎng)下載地址,下載 tar 包,后上傳解壓。
git clone --single-branch --branch v1.11.6 https://github.com/rook/rook.git
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
[root@master examples]# kubectl -n rook-ceph get pod
NAME READY STATUS RESTARTS AGE
rook-ceph-operator-585f6875d-4fqx2 1/1 Running 0 8m52s
[root@master examples]# kubectl get -f operator.yaml
NAME DATA AGE
configmap/rook-ceph-operator-config 31 9m6s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/rook-ceph-operator 1/1 1 1 9m6s
現(xiàn)在 Rook operator 正在運(yùn)行,我們可以創(chuàng)建 Ceph 集群。
kubectl create -f cluster.yaml
總結(jié)
今天介紹了,使用 kubeadm 部署 Kubernetes 集群,可以發(fā)現(xiàn)其實(shí)并不復(fù)雜。
重點(diǎn)簡(jiǎn)述了 kubeadm 初始化集群部分。
Rook 是很有前途的項(xiàng)目,合理的使用了很多,如: Operator、CRD 等重要的擴(kuò)展特性。大家可以先去了解一下這個(gè)項(xiàng)目。
最后,今天我們從 0 到 1 搭建 kubernetes 集群就算是介紹完了。
如有不對(duì)的地方,歡迎各位大佬指正。文章來源:http://www.zghlxwxcb.cn/news/detail-466949.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-466949.html
到了這里,關(guān)于【云原生|探索 Kubernetes 系列 6】從 0 到 1,輕松搭建完整的 Kubernetes 集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!