目 錄
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架構簡介
kubernetes項目架構就是master節點和worker兩種節點組成,控制節點即Master 節點,由三個緊密協作的獨立元件組合而成,它們分别是負責 API 服務的kube-apiserver、負責排程的 kube-scheduler,以及負責容器編排的 kube-controller-manager。
叢集設計
網絡拓撲
網絡設計詳細情況請參考第1期第2章節的内容,拓撲如下圖所示:
虛拟機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)在彈出的“克隆虛拟機向導”視窗中,點選“下一步”按鈕進入“克隆源”步驟,選擇“現有快照”在下拉清單中選擇包含了Docker安裝的快照版本(如:快照1),點選“下一步”按鈕進入“克隆類型”步驟,選擇“建立完整克隆”,再點選“下一步”直到完成虛拟機(如: K8S)的建立。
主機名修改
// 以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 |
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節點虛拟機的基礎鏡像,不用再重複以上的步驟。
類似章節4.1中的方法:右鍵單擊節點Node1的虛拟機(如:CS01,必須關機狀态),選擇“管理->克隆”菜單項,不同的是這裡克隆方法建議選擇“建立連結克隆”,更節省磁盤空間,如下圖所示。
根據以上方法,建立出其它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 // 結果如下: |
配置用戶端認證
// 根據上一步執行結果中的任務提示(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 結果如下: //在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 -fhttps://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 |
3)校驗node節點狀态
// 再來檢視節點的狀态,這時都變為"Ready"了,說明安裝成功! [root@node1 ~]# kubectl get nodes |
驗證叢集
驗證叢集狀态
[root@node1 ~]# kubectl get cs // 可以看到該狀态接⼝已從版本1.19中廢棄。 |
檢視pods狀态
// K8S相關的元件都是以容器pods方式部署在命名空間kube-system中的。 [root@node1 ~]# kubectl get pods -n kube-system |
kube-proxy和kube-flannel均由4個pods組成,在每個節點各部署1個,這是通過DaemonSets這類⾼級控制器實作的。
[root@node1 ~]# kubectl get daemonsets.apps -n kube-system |
釋出應用
1)釋出⼀個nginx的webserver容器
[root@node1 ~]# kubectl create deployment demo --image=nginx:1.19.2-alpine --replicas 3 // 檢視pods的部署情況 [root@node1 ~]# kubectl get deployments.apps [root@node1 ~]# kubectl get pods |
2)将應⽤通過service暴露
[root@node1 ~]# kubectl expose deployment demo --port=80 --target-port=80 |
3)檢視service的vip
[root@node1 ~]# kubectl get services |
4)通路微服務應⽤
[root@node1 ~]# curl http://10.101.228.102 |