前言
YY:國(guó)慶的時(shí)候趁著阿里云和騰訊云的輕量級(jí)服務(wù)器做促銷一不小心剁了個(gè)手????,2 Cores,4G RAM 還是闊以的兄裂,既然買了,那不能不用呀??,之前一直想著搭建個(gè) k8s 集群玩玩晰奖,本地開發(fā)機(jī)雖然起了個(gè) k8s(拿 Docker Desktop 起的谈撒,不 dei 勁),但就一個(gè) Node匾南,不爽啃匿,對(duì) k8s 的體驗(yàn)不到位??,1024蛆楞,是時(shí)候用起來(lái)了溯乒,折騰一下,順便讓最近浮躁的心冷靜一下豹爹。
這次拿官方的 Kubeadm 耍一下橙数,以阿里云的輕量級(jí)應(yīng)用服務(wù)器為 Control 節(jié)點(diǎn),騰訊云的輕量級(jí)應(yīng)用服務(wù)器為 Worker 節(jié)點(diǎn)帅戒,說干就干灯帮。
Check 一下文檔要求 - 準(zhǔn)備工作
Kubenetes 官方文檔給出了 Kubeadm 起 k8s 集群的幾點(diǎn)要求,在這里微微檢查下兩臺(tái)輕量級(jí)云服務(wù)器:
- A compatible Linux host. The Kubernetes project provides generic instructions for Linux distributions based on Debian and Red Hat, and those distributions without a package manager.[我們用的 Ubuntu 20.04逻住,那肯定符合 Debian 系的].
- 2 GB or more of RAM per machine (any less will leave little room for your apps).[4G, 我們很 OK, 但感覺后面會(huì)拉跨].
- 2 CPUs or more. [正好一臺(tái) 2個(gè) CPU, nice].
- Full network connectivity between all machines in the cluster (public or private network is fine).[兩臺(tái)輕量級(jí)應(yīng)用服務(wù)器都有公網(wǎng) IP钟哥,那必須互通啊].
- Unique hostname, MAC address, and product_uuid for every node.[這里得微微 check 一下兩臺(tái)服務(wù)器,
cat /sys/class/net/eth0/address
看下 MAC 地址瞎访,sudo cat /sys/class/dmi/id/product_uuid
看下 product_uuid,hostname
看下主機(jī)名腻贰,emmm, correct!] - Certain ports are open on your machines. [這里得到阿里云輕量級(jí)服務(wù)器 & 騰訊云的輕量級(jí)應(yīng)用服務(wù)器的防火墻開放下相關(guān) TCP 端口]扒秸。
阿里云輕量級(jí)應(yīng)用服務(wù)器開啟 Control(控制平面)節(jié)點(diǎn)的 TCP 端口播演,這里要對(duì)照下文檔給出的需要開放的端口:
騰訊云輕量級(jí)應(yīng)用服務(wù)器開啟 Worker(工作)節(jié)點(diǎn)的 TCP 端口:
- Swap disabled. You MUST disable swap in order for the kubelet to work properly. [為了讓 kubelet 起來(lái),要把 Swap 分區(qū)關(guān)閉伴奥,使用
free -mh
看下 Swap 是否在使用写烤,swapoff -a
關(guān)閉 Swap 分區(qū)].
參考:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
為什么需要關(guān)閉 Swap 分區(qū),有 dalao 做了分析:http://www.reibang.com/p/6f3268ce642f
- Letting iptables see bridged traffic.
這里照著文檔拾徙,一波操作下兩臺(tái)服務(wù)器:
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
lsmod | grep br_netfilter
- Container Runtime Interface(CRI). [這里需要安裝下 Pod 運(yùn)行需要的容器運(yùn)行時(shí)洲炊,我們選擇 Docker].
apt-get update
apt-get install -y apt-transport-https \
software-properties-common \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io
安裝完畢還需要將 Docker 的 cgroup driver 替換為 systemd,確保與 Kubeneters 使用的一致尼啡。
cat>>/etc/docker/daemon.json<<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker
安裝 kubeadm, kubelet, kubectl
上面檢查工作如果很順利的話暂衡,接下來(lái)就可以準(zhǔn)備 kubeadm, kubelet, kubectl 安裝了,不過我們還得給 apt 添加 Kubenetest 軟件源崖瞭,官方文檔中使用的如軟件源是 Google 域名下的狂巢,國(guó)內(nèi)云服務(wù)器訪問會(huì)有問題(懂得都懂了??),這里使用國(guó)內(nèi)得源书聚,這里兩臺(tái)服務(wù)器都操作一下:
# 1唧领、添加 GPG Key
sudo curl -fsSL http://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
# 2代态、添加 k8s 軟件源
sudo add-apt-repository "deb http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main"
3、update 一下
apt-get update
上面執(zhí)行沒有問題的話疹吃,就可以開始安裝 kubelet kubeadm kubectl了:
sudo apt-get install -y kubelet kubeadm kubectl
# 查看安裝的版本, apt install apt-show-versions
apt-show-versions kubectl kubelet kubeadm
# 讓 kubelet 開機(jī)啟動(dòng)
sudo systemctl start kubelet
sudo systemctl enable kubelet
- kubeadm: 引導(dǎo)啟動(dòng) Kubernate 集群的命令行工具。
- kubelet: 在群集中的所有計(jì)算機(jī)上運(yùn)行的組件, 并用來(lái)執(zhí)行如啟動(dòng) Pods 和 Containers 等操作西雀。
- kubectl: 用于操作運(yùn)行中的集群的命令行工具萨驶。
初始化集群
為了能夠讓集群初始化更快,我們可以先預(yù)拉取集群初始化依賴的鏡像艇肴,emmm腔呜,官方文檔給出的又是 Google 的網(wǎng)址,這里我們基于 GitHub -> AliyunContainerService/k8s-for-docker-desktop 項(xiàng)目做鏡像的快速拉取再悼。確保相關(guān)鏡像版本與 kubelet 保持一致(這里是 v1.22.2), kubeadm config images list --kubernetes-version v1.22.2
可查看需要哪些鏡像核畴。
git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git && cd k8s-for-docker-desktop
rm -f images.properties
# 調(diào)整鏡像版本
cat>>images.properties<<EOF
k8s.gcr.io/pause:3.5=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5
k8s.gcr.io/kube-controller-manager:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.22.2
k8s.gcr.io/kube-scheduler:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.22.2
k8s.gcr.io/kube-proxy:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.22.2
k8s.gcr.io/kube-apiserver:v1.22.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.22.2
k8s.gcr.io/etcd:3.5.0-0=registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.0-0
k8s.gcr.io/coredns/coredns:v1.8.4=registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.4
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1=registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.1
EOF
# 拉取鏡像
./load_images.sh
初始化控制平面節(jié)點(diǎn)(Control Plane Node(s))
控制(Control)節(jié)點(diǎn) {阿里云輕量級(jí)應(yīng)用服務(wù)器} 的鏡像預(yù)拉取完畢后,可執(zhí)行如下命令進(jìn)行初始化操作:
# api server IPv4 地址使用公網(wǎng) IP
kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--kubernetes-version v1.22.2
# --apiserver-advertise-address 120.79.73.159
為當(dāng)前 root 用戶生成 kubeconfig:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安裝 CNI(Container Network Interface) -> Flannel
curl --insecure -sfL https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml | kubectl apply -f -
查看節(jié)點(diǎn)狀況冲九,emmm谤草,Ready 沒毛病
root@iZwz92a65mqaa8zwy83dpnZ:~/k8s-for-docker-desktop# kubectl get nodes
NAME STATUS ROLES AGE VERSION
izwz92a65mqaa8zwy8 Ready control-plane,master 4m6s v1.22.2
添加工作節(jié)點(diǎn)(Worker Node(s))
接下來(lái)我們將 Worker 節(jié)點(diǎn)加入到集群中,由于我們?cè)诔跏蓟刂破矫嫠诘闹鞴?jié)點(diǎn)時(shí)并沒有指定公網(wǎng) IP莺奸,所以這里先做個(gè) IP 轉(zhuǎn)發(fā)丑孩,讓 Worker 節(jié)點(diǎn)能夠和控制平面節(jié)點(diǎn)間進(jìn)行通信。
iptables -t nat -A OUTPUT -d <初始化控制平面節(jié)點(diǎn)得到的 IP> -j DNAT --to-destination <阿里云輕量級(jí)服務(wù)器公網(wǎng) IP>
然后我們將 Worker 節(jié)點(diǎn) join 進(jìn)集群中:
kubeadm join <初始化控制平面節(jié)點(diǎn)得到的 IP>:6443 --token 4zicbp.d1wertghxdgcgz6y --discovery-token-ca-cert-hash sha256:1912dbf415da652f97b9fa728cb85dd338e17b24ee338ec48b073c8fa8sdfgth
順利的話??灭贷,那么結(jié)果如下:
然后到控制節(jié)點(diǎn)看下集群節(jié)點(diǎn)狀態(tài)温学,順利的話結(jié)果如下??:
root@iZwz92a65mqdpnZ:~/k8s-for-docker-desktop# kubectl get nodes
NAME STATUS ROLES AGE VERSION
izwz92a65mqaa8zwy83dpnz Ready control-plane,master 48m v1.22.2
vm-8-4-ubuntu Ready <none> 8m9s v1.22.2
參考
本文由博客群發(fā)一文多發(fā)等運(yùn)營(yíng)工具平臺(tái) OpenWrite 發(fā)布