前言
官方文檔:Kubernetes 文檔 | Kubernetes
系統配置 CentOS 7.9(2 核 2 G)
本文為 k8s
入門指南專欄,將會使用 kubeadm 搭建單節點 k8s 集群,詳細講解環境搭建部署的細節,專欄后面章節會以實戰代碼介紹相關概念,帶您快速入門 k8s
搭建方式
k8s
集群搭建有三種方式,目前主流的搭建 k8s
集群的方式有 kubeadm、minikube,二進制包
kubeadm
- 是一個工具,用于快速搭建 kubernetes 集群,目前應該是比較方便和推薦的,簡單易用
- kubeadm 是 Kubernetes 1.4 開始新增的特性
- kubeadm init 以及 kubeadm join 這兩個命令可以快速創建 kubernetes 集群
minikube
- 一般用于本地開發、測試和學習,不能用于生產環境
- 是一個工具,minikube 快速搭建一個運行在本地的單節點的 Kubernetes
二進制包
- 在官網下載相關的組件的二進制包,上面的兩個是工具,可以快速搭建集群,也就是相當于用程序腳本幫我們裝好了集群,前兩者屬于自動部署,簡化部署操作,自動部署屏蔽了很多細節,使得對各個模塊感知很少,遇到問題很難排查,如果手動安裝,對 kubernetes 理解也會更全面。
- 目前生產環境的主流搭建方式,已在生產環境驗證,kubeadm 也可以搭建生產環境,不過 kubeadm 應該還沒有被大規模在生產環境驗證
本次我們作為演示的是 kubeadm
環境準備
官方文檔:安裝 kubeadm | Kubernetes
注:如果是使用的云服務器,下面的 swap、selinux 和防火墻都是默認關閉的,無需進行對應操作
安裝 Docker
官方文檔:Install Docker Engine on CentOS | Docker Docs
安裝腳本如下
#!/bin/bashset -e
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker
sudo docker run hello-world
配置如下
cat > /etc/docker/daemon.json << EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOFsudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
如果在國內,可以配置鏡像加速
阿里云鏡像加速地址:容器鏡像服務鏡像構建鏡像授權_鏡像托管-阿里云 (aliyun.com)
然后復制上面地址
# 更換鏡像為阿里云
vim /etc/docker/daemon.json
# 添加如下內容
{"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}systemctl restart docker
docker info
禁用 SELinux
將 SELinux 設置為 ?permissive
? 模式
# 將 SELinux 設置為 permissive 模式(相當于將其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
關閉 Swap
Kubernetes 1.8 開始要求關閉系統的 Swap。如果不關閉,默認配置下 kubelet 將無法啟動。可以通過 kubelet 的啟動參數--fail-swap-on=false
更改這個限制。我們這里簡單起見,直接關閉系統的 Swap
修改/etc/fstab
文件,注釋掉SWAP
的自動掛載,使用free -m
確認 swap 已經關閉。
swappiness
參數調整,修改/etc/sysctl.d/k8s.conf 添加下面一行:
vm.swappiness=0
執行 sysctl -p /etc/sysctl.d/k8s.conf 使修改生效
關閉防火墻
如果各個主機啟用了防火墻,需要開放 Kubernetes 各個組件所需要的端口
sudo systemctl stop firewalld
sudo systemctl disable firewalld
查看是否安裝成功
kubeadm version
kubectl version --client
kubelet --version
其他
設置允許 iptables 檢查橋接流量
cat > /etc/modules-load.d/k8s.conf << EOF
br_netfilter
EOFcat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOFsudo sysctl --system
安裝相關插件
yum -y install socat conntrack-tools
集群搭建
安裝 kubeadm
官方文檔:安裝 kubeadm | Kubernetes
kubeadm:用來初始化集群的指令。
kubelet:在集群中的每個節點上用來啟動 Pod 和容器等。
kubectl:用來與集群通信的命令行工具。
kubeadm 不能幫你安裝或者管理 kubelet 或 kubectl,所以你需要確保它們與通過 kubeadm 安裝的控制平面的版本相匹配。如果不這樣做,則存在發生版本偏差的風險,可能會導致一些預料之外的錯誤和問題。然而,控制平面與 kubelet 之間可以存在一個次要版本的偏差,但 kubelet 的版本不可以超過 API 服務器的版本。例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服務器,反之則不可以。
執行如下腳本安裝 kubeadm(國內線路)
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
yum install -y kubelet-1.20.2 kubeadm-1.20.2 kubectl-1.20.2 --disableexcludes=kubernetes
systemctl enable --now kubelet
安裝 kubectl
curl -Lo kubectl "https://storage.googleapis.com/kubernetes-release/release/v1.20.2/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/
拉取鏡像
執行 kubeadm config images pull
拉取鏡像,但是很大可能因為網絡原因連接失敗,可以使用如下阿里云命令(版本 v1.21)
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull coredns/coredns:1.7.0
在 k8s 安裝時會默認在鏡像中獲取 k8s.gcr.io 前綴的鏡像,所以我們需要將上文下載好的鏡像更改名稱
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.1 k8s.gcr.io/kube-apiserver:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.1 k8s.gcr.io/kube-proxy:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.1 k8s.gcr.io/kube-controller-manager:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.1 k8s.gcr.io/kube-scheduler:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag coredns/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0
注:后面
kubeadm init
初始集群的時候可能報錯,顯示鏡像版本不對應,自行更改上面的版本即可,重新docker pull
和docker tag
即可,群體替換版本即可(1.21.1 -> 1.20.15),我這里就是偶爾需要用 1.21.1 版本,偶爾需要用 1.20.15 版本,所以我索性給這兩個版本鏡像都拉取到本地
修改主機映射
vim /etc/hosts
初始化服務
在初始化集群之前需要先重啟下 kubelet systemctl restart kubelet
kubeadm init --apiserver-advertise-address=172.25.234.148 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.21.1
# 或
kubeadm init
解釋下命令
kubeadm init
: 這是命令的主體部分,它告訴kubeadm
初始化一個新的 Kubernetes 控制平面。--apiserver-advertise-address=192.168.44.15
: 這個選項指定 Kubernetes API Server 監聽的網絡地址。在這里,它設置為192.168.44.15
。--pod-network-cidr=10.244.0.0/16
: 這個選項指定用于 Pod 網絡的 CIDR 地址范圍。這是容器之間通信的地址范圍。在這里,它設置為10.244.0.0/16
。--kubernetes-version=v1.21.1
: 這個選項指定要安裝的 Kubernetes 版本,這里設置為v1.21.1
。
如果出現問題,需要自行查看日志然后搜索解決(因為可能的出現錯誤太多,這里沒法一一列出)
可以嘗試重新啟動 kubelet systemctl restart kubelet
,然后重置集群kubeadm reset
,然后再次嘗試初始化
注意:這里我使用的是
kubeadm init
初始化集群
下面解釋成功日志輸出,要使非 root 用戶可以運行 kubectl,請運行以下命令,它們也是 kubeadm init
輸出的一部分
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果是 root 用戶,可以運行如下
export KUBECONFIG=/etc/kubernetes/admin.conf
我們可以運行 kubectl apply -f [podnetwork].yaml
部署 Pod 網絡
然后如果多集群部署,并且多服務器之間內網是連通的話,可以使用如下命令添加工作節點
kubeadm join 172.25.234.148:6443 --token ls55pz.ed4wq51xex0ho1hh \--discovery-token-ca-cert-hash sha256:a082bb7e27b8c26625edeb8198e49967bd4dd4493b3b532c750a9f98f912f801
然后我們可以安裝 Flannel,Flannel 通過給每臺宿主機分配一個子網的方式為容器提供虛擬網絡,它基于 Linux TUN/TAP,使用 UDP 封裝 IP 包來創建 overlay 網絡,并借助 etcd 維護網絡的分配情況
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
最后驗證節點,如果為 Ready 則 master 節點已經注冊到了 k8s
kubectl get nodes
如果是 NotReady,可以執行以下語句判斷服務器狀態
kubectl get nodes -o yaml
然后查看 kubelet 日志 journalctl -f -u kubelet.service
部分日志顯示錯誤:networkPlugin cni failed to set up pod
vim /etc/yum.repos.d/kubernetes.repogpgcheck=0
repo_gpgcheck=0
# 上面兩項修改如下
gpgcheck=1
repo_gpgcheck=1# 然后執行如下
yum clean all
yum install kubernetes-cni -y
最后可以看到節點添加成功
總結
至此單節點環境部署已經結束,博主剛剛接觸學習 k8s
,希望和大家分享學習中的經驗教訓,如果文中有錯誤紕漏還望各位指出
后面專欄大概還會有一到兩個章節,以實戰 demo 代碼學習 Pod,Deployment,Service 等概念
除此之外的話,我自己也嘗試過 windows(WSL2)搭建 minikube k8s
環境,不是很理想,哪怕是對于學習目的也并不推薦。然后其實相較于 CentOS 其實官方更推薦使用 Ubuntu ,官方社區長期維護,也比較穩定
參考鏈接
- 通過 kubeadm 搭建單節點 k8s 環境 | yanyx’s blog
- 用 Kubeadm 搭建一個 k8s 1.7.5 的單節點集群
- 使用 kubeadm 搭建 kubernetes 單機 master - 阿里云開發者社區
- guangzhengli/k8s-tutorials: k8s tutorials | k8s 教程
本文由博客一文多發平臺 OpenWrite 發布!