写在前面
你可能知道搭建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:
dongyunqi@mongodaddy:~/k8s$ cat /etc/hostname
mongodaddy
Worker:
dongyunqi@mongomummy:~/k8s/images$ cat /etc/hostname
mongomummy
2.2:修改docker配置
dongyunqi@mongodaddy:~/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
执行完成后我们就可以查看集群的节点了,如下:
dongyunqi@mongodaddy:~/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就恢复正常了,如下:
dongyunqi@mongodaddy:~/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命令就可以了,如下:
dongyunqi@mongomummy:~/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
查看结果:
dongyunqi@mongodaddy:~/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
到这里,操作就全部完成了。
写在后面
参考文章列表: