寫在前面
你可能知道搭建k8s叢集的kind,minikube工具,但是他們都太簡單了,不能滿足生産級的要求,想要真正的部署生産級别的k8s叢集,我們還需要另外一個叢集管理工具kubeadm ,本文就一起看下如何使用該工具來搭建k8s叢集。
1:部署架構圖
節點說明:
Console,用來安裝kubectl工具,1核1G記憶體,操作k8s叢集,該機器隻是邏輯上的,如果隻是為了學習,可以直接在master node操作,真實的生産環境還是要有一個Console的
Master:Master Node,2核4G記憶體,如果資源充足也可以再多給些
Worker:Worker Node,1核1G記憶體,如果資源充足也可以再多給些
另外Flannel是叢集内部使用的網絡插件 ,用來建構内部的私有網絡。Docker Registry是Docker注冊中心,這個無需多說。
再看下我本地的環境:
Console:直接使用Master Node
Master:2核4G 192.168.64.131 Ubuntu 11.3.0
Worker:1核1G 192.168.64.132 Ubuntu 11.3.0
2:準備工作
以下操作如無特别說明均是在Master和Worker都要做。
2.1:修改主機名
k8s會通過主機名來識别節點,是以不可重複,如下我的修改結果:
Mastre:
[email protected]:~/k8s$ cat /etc/hostname
mongodaddy
Worker:
dongy[email protected]:~/k8s/images$ cat /etc/hostname
mongomummy
2.2:修改docker配置
[email protected]:~/k8s$ cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://8csof3cn.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
其中
"exec-opts": ["native.cgroupdriver=systemd"]
修改cgroup比較重要,不過你可以直接複制我的,畢竟我也是直接複制别人的。
2.3:修改iptables
因為k8s需要建構自己的網絡系統,為了能夠讓其轉發網絡流量,是以需要做此修改,如下:
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
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF
sudo sysctl --system
2.4:關閉swap
該操作的目的是,避免記憶體操作可能發生的IO,提升k8s性能,如下:
sudo swapoff -a && sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
到這裡,為了讓配置生效,我們最好重新開機下系統。
2.5:安裝kubeadm
如下:
sudo apt install -y apt-transport-https ca-certificates curl
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt update
sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00
kubeadm version
kubectl version --client
最後執行如下指令,避免版本意外更新:
sudo apt-mark hold kubeadm kubelet kubectl
3:正式安裝
3.1:下載下傳kubeletes元件鏡像
為了加快下載下傳的速度,我們可以提前從minikube中擷取需要的鏡像,然後docker load到本地,如下檢視需要的鏡像:
kubeadm config images list --kubernetes-version v1.23.3
k8s.gcr.io/kube-apiserver:v1.23.3
k8s.gcr.io/kube-controller-manager:v1.23.3
k8s.gcr.io/kube-scheduler:v1.23.3
k8s.gcr.io/kube-proxy:v1.23.3
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6
然後我們就可以從minikube的虛拟主機中将鏡像通過
docker save
,生成鏡像tar如
docker save dongsir2018/test-push-dockerhub:0.1 -o /home/dongyunqi/push.tar
,然後通過
minikube cp
,如
minikube cp minikube:/home/docker/etcd.tar /home/dongyunqi/k8s/allimages/etcd.tar
拷貝到主控端,最後通過
docker load -i
,如
docker load -i pause.tar
加載鏡像,參考下圖:
如果你覺得麻煩也可以,也可以從以下位址下載下傳:
coredns , pause , kube-scheduler , kube-proxy , kube-controller-manager , kube-apiserver , etcd 。
3.2:Master節點操作
使用
kubeadm init
建立k8s叢集:
sudo kubeadm init \
--pod-network-cidr=10.10.0.0/16 \
--apiserver-advertise-address=你的master IP位址 \
--kubernetes-version=v1.23.3
安裝成功後會有如下輸出:
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
目的是将kubetcl的配置檔案替換為k8s的版本,直接執行上述指令即可。另外
kubeadm join
提示資訊要儲存好,後續Worker加入叢集的時候會用到,可能如下:
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.64.131:6443 --token whzch5.wkwijvkqo5xgyswm \
--discovery-token-ca-cert-hash sha256:b51aed32be23df09e5afe6fe1f6c2033ded3b246339a4c599837f3857c1173dc
執行完成後我們就可以檢視叢集的節點了,如下:
[email protected]:~/k8s$ kubectl get node
NAME STATUS ROLES AGE VERSION
mongodaddy NotReady control-plane,master 16h v1.23.3
可以看到此時隻有一個主機名為
mongodaddy
的節點,也就是我們的Master節點,Status是
NotReady
,這是因為目前k8s的網絡環境沒有建立完成,需要安裝網絡插件,來讓k8s的網絡恢複正常,這裡使用Flannel,首先我們需要Flannel的yaml,可以從這裡 或者是這裡 下載下傳,但是注意如下
net-conf.json
部分内容
net-conf.json: |
{
"Network": "10.10.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
中的Network一定要和上面執行kubeadm init設定的
--pod-network-cidr
一緻,因為都是k8s叢集中的網絡位址。然後執行
kubectl apply -f kube-flannel.yml
,稍等一會再執行
kubectl get node
Master Node就恢複正常了,如下:
[email protected]:~/k8s$ kubectl get node
NAME STATUS ROLES AGE VERSION
mongodaddy Ready control-plane,master 16h v1.23.3
此時我們的k8s叢集就建立成功了,隻不過master node還是光杆司令。
3.3:Worker節點操作
隻需要執行join指令就可以了,如下:
[email protected]:~/k8s/images$ sudo kubeadm join 192.168.64.131:6443 --token whzch5.wkwijvkqo5xgyswm \
> --discovery-token-ca-cert-hash sha256:b51aed32be23df09e5afe6fe1f6c2033ded3b246339a4c599837f3857c1173dc
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W0109 11:35:48.242996 55928 utils.go:69] The recommended value for "resolvConf" in "KubeletConfiguration" is: /run/systemd/resolve/resolv.conf; the provided value is: /run/systemd/resolve/resolv.conf
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
然後到
Master Node
檢視結果:
[email protected]:~/k8s$ kubectl get node
NAME STATUS ROLES AGE VERSION
mongodaddy Ready control-plane,master 16h v1.23.3
mongomummy Ready <none> 145m v1.23.3
到這裡,操作就全部完成了。
寫在後面
參考文章清單: