天天看點

2.分布式存儲 (kubernetes之kubeadm安裝)

目 錄​

​​1 Kubernetes架構簡介 1​​​

​​2 叢集設計 2​​​

​​2.1 網絡拓撲 2​​​

​​2.2 節點規劃 2​​​

​​3 安裝準備 3​​​

​​3.1 基礎安裝 3​​​

​​3.2 主機名修改 4​​​

​​3.3 修改IP位址 4​​​

​​3.4 配置hosts靜态解析 4​​​

​​3.5 修改cgroup driver類型 4​​​

​​3.6 配置k8s的yum源 5​​​

​​3.7 修改k8s的核心參數 5​​​

​​4 kubeadm部署工具安裝 5​​​

​​4.1 檢視可用版本 5​​​

​​4.2 安裝和配置 6​​​

​​4.3 關閉SWAP分區 6​​​

​​4.4 指令行補齊 6​​​

​​5 建立其它node節點 7​​​

​​6 Kubernetes叢集初始化 8​​​

​​6.1 了解初始化參數 8​​​

​​6.2 執行初始化指令 8​​​

​​6.3 配置用戶端認證 9​​​

​​6.4 添加node節點 9​​​

​​6.5 安裝網絡插件 9​​​

​​7 驗證叢集 10​​​

​​7.1 驗證叢集狀态 10​​​

​​7.2 檢視pods狀态 11​​​

​​8 釋出應用 11​​​

分布式存儲-第2期

(kubernetes之kubeadm安裝)​

元工:2022.07.05​

背景:最近大家對容器技術的讨論越來越多,興趣也越來越濃,容器的應用場景也非常之多,其中在分布式系統應用領域更突顯它的優勢和魅力,本文是工作之餘所做相關實驗的整理,供大家一起學習和分享。​

目标:在僅有的一台工作電腦上搭建全能型虛拟化容器平台,并在其上運作目前主流的分布式存儲系統(如:Ceph、Minio、GlusterFS等)作為應用場景進行全方位體驗和學習。​

亮點:kubernetes的社群版本更新特别快,每隔3~6個月就會有新版本,本文力求通過一個通用且可指定版本的方法來安裝部署K8S叢集;最後會按本文所述從頭至尾重新做了一遍,以確定本文内容百分百的正确性和百分百的完整性。​

價值:減少學習的硬體成本、減少學習目标前面的障礙、化天塹為通途;不僅是學習容器技術的入門寶典,也為學習分布式存儲系統的同學提供了實驗環境準備的方法。​

使用要求:對Linux、VMware workstaion有一定的熟悉,祝您使用愉快!​

Kubernetes架構簡介​

2.分布式存儲 (kubernetes之kubeadm安裝)

kubernetes項目架構就是master節點和worker兩種節點組成,控制節點即Master 節點,由三個緊密協作的獨立元件組合而成,它們分别是負責 API 服務的kube-apiserver、負責排程的 kube-scheduler,以及負責容器編排的 kube-controller-manager。​

叢集設計​

網絡拓撲​

網絡設計詳細情況請參考第1期第2章節的内容,拓撲如下圖所示:​

2.分布式存儲 (kubernetes之kubeadm安裝)
虛拟機VM網絡拓撲​

節點規劃​

虛拟機​ 節點名稱​ IP位址​ 角色​ 服務元件​
K8S​ node1​ 192.168.66.11​ Master​

kube-apiserver​

kube-scheduler​

kube-controller-manager​

etcd、kubelet、kube-proxy,kubeadm,​

flannel,docker​

K8S02​ node2​ 192.168.66.12​ worker​ kubelet,kube-proxy,flannel,docker​
K8S03​ node3​ 192.168.66.13​ worker​ kubelet,kube-proxy,flannel,docker​
K8S04​ node4​ 192.168.66.14​ worker​ kubelet,kube-proxy,flannel,docker​

安裝準備​

基礎安裝​

基礎安裝包括虛拟機的作業系統和容器引擎的安裝:1)CentOS系統安裝:請參考第1期第3章節的内容;2)Docker安裝:請參考第1期第4章節的内容。或者,如果你完成第1期第4章節的實驗内容後并做了快照,則可直接基于該快照克隆一個新虛拟機,方法如下:​

1)右鍵單擊虛拟機(如:Docker),依次選擇菜單項“管理->克隆”,如下圖所示:​

2.分布式存儲 (kubernetes之kubeadm安裝)

2)在彈出的“克隆虛拟機向導”視窗中,點選“下一步”按鈕進入“克隆源”步驟,選擇“現有快照”在下拉清單中選擇包含了Docker安裝的快照版本(如:快照1),點選“下一步”按鈕進入“克隆類型”步驟,選擇“建立完整克隆”,再點選“下一步”直到完成虛拟機(如: K8S)的建立。​

2.分布式存儲 (kubernetes之kubeadm安裝)
2.分布式存儲 (kubernetes之kubeadm安裝)

主機名修改​

// 以node1為例:​

[root@K8S ~]# hostnamectl set-hostname node1 && bash​

修改IP位址​

// 以node1為例:​

[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33​

...​

IPADDR="192.168.66.11"​

...​

// 重新開機網絡服務​

[root@node1 ~]# systemctl restart network​

配置hosts靜态解析​

// 每個節點都要配置​

[root@node1 ~]# vim /etc/hosts​

192.168.66.11 node1​

192.168.66.12 node2​

192.168.66.13 node3​

192.168.66.14 node4​

修改cgroup driver類型​

// 在daemon.json中,cgroupdriver的類型為“systemd”​

[root@node1 ~]# vim /etc/docker/daemon.json ​

{​

"registry-mirrors": ["https://6wu5f3fc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"],​

"exec-opts": ["native.cgroupdriver=systemd"]​

}​

// 重新開機docker使之生效​

[root@node1 ~]# systemctl restart docker​

// 驗證結果​

[root@node1 ~]# docker info​

Server Version: 20.10.16​

Storage Driver: overlay2​

Backing Filesystem: xfs​

Supports d_type: true​

Native Overlay Diff: true​

userxattr: false​

Logging Driver: json-file​

Cgroup Driver: systemd​

Cgroup Version: 1​

配置k8s的yum源​

[root@node1 ~]# 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=0​

repo_gpgcheck=0​

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg ​

​​ https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg​​​

EOF​

修改k8s的核心參數​

// 加載 br_netfilter 子產品​

[root@node1 ~]# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf​

br_netfilter​

EOF​

//開啟ip_forward轉發參數​

[root@node1 ~]# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf​

net.bridge.bridge-nf-call-ip6tables = 1​

net.bridge.bridge-nf-call-iptables = 1​

net.ipv4.ip_forward = 1​

EOF​

// 手動加載所有的配置檔案​

[root@node1 ~]# sysctl --system​

kubeadm部署工具安裝​

檢視可用版本​

[root@node1 ~]# yum list --showduplicates | grep kubeadm​
2.分布式存儲 (kubernetes之kubeadm安裝)

kubeadm需要和接下來要安裝的K8S的版本一緻,至于目前為什麼選擇1.23.X版本在第1期中已經解釋,當時版本還是1.23.6,不到一個月就更新到了1.23.8版本,同時1.24.X大版本也更新到了1.24.2,如果不指定版本,預設安裝的最新版本就是它,再次也說明了指定版本安裝方法的意義。​

安裝和配置​

// 安裝最新的成熟穩定版本,即v1.23.8​

[root@node1 ~]# yum install -y kubeadm-1.23.8 kubectl-1.23.8 kubelet-1.23.8​

// 設定開機啟動​

[root@node1 ~]# systemctl enable kubelet​

// 檢視kubeadm版本​

[root@node1 ~]# kubeadm version​

// 檢視kubelet的狀态,因目前還沒初始化,即使執行"systemctl restart kubelet"也無效​

[root@node1 ~]# systemctl status kubelet​

關閉SWAP分區​

// 永久關閉:注釋掉"/etc/fstab"的最後一行​

[root@node1 ~]# vim /etc/fstab​

/dev/mapper/centos-root / xfs defaults 0 0​

UUID=00974e16-e0a5-4510-87ee-3379af272347 /boot xfs defaults 0 0​

#/dev/mapper/centos-swap swap swap defaults 0 0​

// 臨時關閉:将/etc/fstab檔案中所有設定為swap的裝置關閉​

[root@node1 ~]# swapoff -a​

// 檢視記憶體使用情況​

[root@node1 ~]# free -m​

指令行補齊​

[root@node1 ~]# yum install bash-completion -y​

[root@node1 ~]# source /usr/share/bash-completion/bash_completion​

[root@node1 ~]# kubectl completion bash >/etc/profile.d/kubectl.sh​

[root@node1 ~]# source /etc/profile.d/kubectl.sh​

[root@node1 ~]# echo "source /etc/profile.d/kubectl.sh" >>.bashrc​

建立其它node節點​

因僅需在Master節點(即node1)上執行Kubeadm init初始化,建議此時此處做個快照備份,也可以作為其它node節點虛拟機的基礎鏡像,不用再重複以上的步驟。​

2.分布式存儲 (kubernetes之kubeadm安裝)

類似章節4.1中的方法:右鍵單擊節點Node1的虛拟機(如:CS01,必須關機狀态),選擇“管理->克隆”菜單項,不同的是這裡克隆方法建議選擇“建立連結克隆”,更節省磁盤空間,如下圖所示。​

2.分布式存儲 (kubernetes之kubeadm安裝)

根據以上方法,建立出其它3個node節點的虛拟機(如:CS02、CS03、CS03),并依照章節3.2、3.3的方法修改它們的主機名(如:node2,node3,node4)和IP位址。​

通過Ping 指令檢查節點之間的網絡是否連接配接OK,如下:​

[root@node1 ~]# ping node2​

[root@node1 ~]# ping node3​

[root@node1 ~]# ping node4​

Kubernetes叢集初始化​

了解初始化參數​

[root@node1 ~]# kubeadm init --help​

// 常⻅參數:​

--kubernetes-version kubernetes的版本,預設是最新版本​

--apiserver-advertise-address apiserver的位址,預設會選擇通路外⽹的位址

--apiserver-bind-port apiserver通路端⼝,預設為6443

--image-repository registry.aliyuncs.com/google_containers 國内⽆法通路gcr.io倉庫,指定阿⾥雲倉庫,⽆須翻牆【可選】

--pod-network-cidr 指定pod段通路的位址段,根據⽹絡插件的不同(可以根據需要修改)​

執行初始化指令​

[root@node1 ~]# kubeadm init --kubernetes-versinotallow="v1.23.8" --apiserver-advertise-address 192.168.66.11 --apiserver-bind-port 6443 --pod-network-cidr 172.16.0.0/16 --image-repository registry.aliyuncs.com/google_containers​

// 結果如下:​

2.分布式存儲 (kubernetes之kubeadm安裝)

配置用戶端認證​

// 根據上一步執行結果中的任務提示(1)進行操作​

[root@node1 ~]#​

mkdir -p $HOME/.kube​

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config​

sudo chown $(id -u):$(id -g) $HOME/.kube/config​

// 驗證結果:這時隻有⼀個節點​

[root@node1 ~]# kubectl get nodes​

NAME STATUS ROLES AGE VERSION​

node1 NotReady control-plane,master 16m v1.23.8​

添加node節點​

// 根據章節6.2執行結果中的任務提示(3),依次在node2~node4上執行下面操作,将自身作為worker node加入到K8S叢集(以node2為例):​

[root@node2 ~]# kubeadm join 192.168.66.11:6443 --token w1mzlm.9iru5wptr4s7e6i6 \​

--discovery-token-ca-cert-hash sha256:60abb7c3b8ade5cb2032265ac8e5801219d9a1ac8b218544fdb47490da80b203​

結果如下:​

2.分布式存儲 (kubernetes之kubeadm安裝)

//在node-1上檢視node的情況:都加入成功,但狀态是NotReady,原因是還沒安裝網絡插件。​

[root@node1 ~]# kubectl get nodes​

NAME STATUS ROLES AGE VERSION​

node1 NotReady control-plane,master 16m v1.23.8​

node2 NotReady <none> 74s v1.23.8​

node3 NotReady <none> 67s v1.23.8​

node4 NotReady <none> 60s v1.23.8​

安裝網絡插件​

依據章節6.2執行結果中的任務提示(2),通路下面網站​​https://kubernetes.io/docs/concepts/cluster-administration/addons/​​,選擇你想要安裝的網絡插件,本文選擇flannel網絡插件進行介紹,并且不采用其預設的IP網段位址。​

For Kubernetes v1.17+​

Make sure a flanneld binary exists at /opt/bin/flanneld on each node​

kubectl apply -f​​https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml​​​

If you use custom podCIDR (not 10.244.0.0/16) you first need to download the above manifest and modify the network to match your one.​

下載下傳kube-flannel.yml後,修改Network為172.16.0.0/16(預設10.244.0.0/16),儲存在指令執行的目前目錄。​

1)安裝flannel插件​

// 僅需在Master節點上執行​

[root@node1 ~]# kubectl apply -f kube-flannel.yml​

2)部署需要拉取鏡像,需要點時間,通過下面方法檢視flannel部署的情況​

// 如下:在kube-system命名空間中部署了4個flannel、4個Proxy等等​

[root@node1 ~]# kubectl get pods -n kube-system​

2.分布式存儲 (kubernetes之kubeadm安裝)

3)校驗node節點狀态​

// 再來檢視節點的狀态,這時都變為"Ready"了,說明安裝成功!​

[root@node1 ~]# kubectl get nodes​

2.分布式存儲 (kubernetes之kubeadm安裝)

驗證叢集​

驗證叢集狀态​

[root@node1 ~]# kubectl get cs​
2.分布式存儲 (kubernetes之kubeadm安裝)
// 可以看到該狀态接⼝已從版本1.19中廢棄。​

檢視pods狀态​

// K8S相關的元件都是以容器pods方式部署在命名空間kube-system中的。​

[root@node1 ~]# kubectl get pods -n kube-system​

2.分布式存儲 (kubernetes之kubeadm安裝)

kube-proxy和kube-flannel均由4個pods組成,在每個節點各部署1個,這是通過DaemonSets這類⾼級控制器實作的。​

[root@node1 ~]# kubectl get daemonsets.apps -n kube-system​
2.分布式存儲 (kubernetes之kubeadm安裝)

釋出應用​

1)釋出⼀個nginx的webserver容器​

[root@node1 ~]# kubectl create deployment demo --image=nginx:1.19.2-alpine --replicas 3​
2.分布式存儲 (kubernetes之kubeadm安裝)

// 檢視pods的部署情況​

[root@node1 ~]# kubectl get deployments.apps​

2.分布式存儲 (kubernetes之kubeadm安裝)
[root@node1 ~]# kubectl get pods​
2.分布式存儲 (kubernetes之kubeadm安裝)

2)将應⽤通過service暴露​

[root@node1 ~]# kubectl expose deployment demo --port=80 --target-port=80​
2.分布式存儲 (kubernetes之kubeadm安裝)

3)檢視service的vip​

[root@node1 ~]# kubectl get services​
2.分布式存儲 (kubernetes之kubeadm安裝)

4)通路微服務應⽤​

[root@node1 ~]# curl http://10.101.228.102​
2.分布式存儲 (kubernetes之kubeadm安裝)