天天看点

k8s之基于kubeadm搭建k8s集群

写在前面

你可能知道搭建k8s集群的kind,minikube工具,但是他们都太简单了,不能满足生产级的要求,想要真正的部署生产级别的k8s集群,我们还需要另外一个集群管理工具kubeadm ,本文就一起看下如何使用该工具来搭建k8s集群。

k8s之基于kubeadm搭建k8s集群

1:部署架构图

k8s之基于kubeadm搭建k8s集群

节点说明:

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
           
k8s之基于kubeadm搭建k8s集群

最后执行如下命令,避免版本意外升级:

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

加载镜像,参考下图:

k8s之基于kubeadm搭建k8s集群

如果你觉得麻烦也可以,也可以从以下地址下载:

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
           

到这里,操作就全部完成了。

写在后面

参考文章列表:

继续阅读