使用kubeadm极速搭建Kubernetes集群

    xiaoxiao2025-04-16  24

    前言

    最近在学习Kubernetes的使用,但其集群搭建颇为复杂,虽然网上有许多搭建的教程,但不是版本久远,相关资源找不到了,便是及其的复杂,对基本的基础设施环境也是一笔带过,在跟随步骤的时候总是出现写莫名其妙的问题。在参考了网上众多教程和自己的实践之后,整理了自己的一套方案,适用于学习使用。 Kubernetes部署方案至少三种,使用minikube搭建单机的集群,这个方法可以很快的体验Kubernetes,但在学习某些内容的时候会由于只有一个节点会进行不下去,此是该部署链接使用minikube部署Kubernetes;第二种方法便是使用kubeadm部署多个节点的集群,步骤适中,坑也比较多;第三种便是使用二进制文件来部署,步骤非常复杂,适用于生产环境。作为学习为目的的话,前两种方案较为适合。本文是使用第二种方案进行集群搭建的(脚本在create_envs里),这样可以有多个节点。

    基本环境

    使用VirtualBox创建一个Ubuntu 18.04 Server的虚拟机,网络采用桥接的方式,至少配置2 CPU和2G Memory(这个是Kubernetes对硬件的对低要求),按下面环境部署步骤准备好后在进行虚拟机克隆3个(按需),修改主机名即可。需要注意的是,克隆虚拟机的时候要勾选重新分配网络的选项,之后还需要修改hostname,方法如下:

    sudo hostnamectl set-hostname <your-hostname> sed -i "s/preserve_hostname: false/preserve_hostname: true/g" /etc/cloud/cloud.cfg

    重新登录下hostname就会是变成刚才改的了

    环境部署

    shell script: create_envs/k8s_env.sh & create_envs/docker_operations.sh

    替换系统的软件源 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse # 预发布软件源,不建议启用 # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse # deb-src [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu bionic stable # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse 安装相关的依赖包 sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates \ curl software-properties-common 安装docker-ce 18.06版本 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" sudo apt-get install docker-ce # 添加了软件库后运行命令sudo apt-cache policy docker-ce 看下最新版本是多少,不是18.06就指定版本安装 cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://<your-mirrors-address>"] } EOF # 此步骤主要用于镜像加速,没有也可 systemctl restart docker 安装kubeadm,kubectl,kubelet工具,版本为v1.14.2 curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - sudo add-apt-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" sudo apt-get update echo 'installing kube*' K8S_VERSION='1.14.2-00 500' # 同上,可以先查看下当前最新版本是啥,适当修改 sudo apt-get install -y kubelet=$K8S_VERSION kubeadm=$K8S_VERSION kubectl=$K8S_VERSION 拉取后续需要使用的镜像文件 K8S_VERSION=v1.14.1 ETCD_VERSION=3.3.10 DASHBOARD_VERSION=V1.10.1 FLANNEL_VERSION=V0.10.0-amd64 DNS_VERSION=1.3.1 PAUSE_VERSION=3.1 # basic components sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver-amd64:$K8S_VERSION sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager-amd64:$K8S_VERSION sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler-amd64:$K8S_VERSION sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy-amd64:$K8S_VERSION sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd-amd64:$ETCD_VERSION sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:$PAUSE_VERSION sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$DNS_VERSION # network components sudo docker pull quay.io/coreos/flannel:$FLANNEL_VERSION # 修改tag,不然kubeadm在使用镜像的时候会以为木有就去下载(gcr.io这个域名科学上网也不行...) sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver-amd64:$K8S_VERSION k8s.gcr.io/kube-apiserver:$K8S_VERSION sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager-amd64:$K8S_VERSION k8s.gcr.io/kube-controller-manager:$K8S_VERSION sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler-amd64:$K8S_VERSION k8s.gcr.io/kube-scheduler:$K8S_VERSION sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy-amd64:$K8S_VERSION k8s.gcr.io/kube-proxy:$K8S_VERSION sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd-amd64:$ETCD_VERSION k8s.gcr.io/etcd:$ETCD_VERSION sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:$PAUSE_VERSION k8s.gcr.io/pause:$PAUSE_VERSION sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$DNS_VERSION k8s.gcr.io/coredns:$DNS_VERSION 耐心等待镜像下载完全,就可以去克隆虚拟机了

    以上使用的shell脚本均分享在github的create_env文件夹里,在k8s_env.sh和docker_operations.sh文件里,可以直接执行使用,具体说明见README.md

    Kubernetes 集群搭建

    假设现在已经有4台(2台及以上都OK)满足上述要求的虚拟机,其IP如下

    主机名IPk8s-node01192.168.0.103k8s-node02192.168.0.104k8s-node03192.168.0.105k8s-node04192.168.0.106

    计划将k8s-node01作为集群的master,其余作为节点 在master节点上执行下列命令

    # 如果之前有部署过,需要将.kube文件夹清理掉,里面会记录kubectl工具和apiserver一些信息 sudo rm -rf ~/.kube # 关闭swap sudo swapoff -a # 注意,由于我们镜像下载kubernetes的version是1.14.1的,所以在这里启动的时候也要填写1.14.1,即要和之前下载的镜像版本一致。 sudo kubeadm init --kubernetes-version=1.14.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=$(hostname -I | awk '{print $1}') # 创建.kube 文件夹(在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 # 添加flannel网络插件 sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.11.0/Documentation/kube-flannel.yml

    在剩余的三个node虚拟机上,执行如下命令

    # 关闭swap sudo swapoff -a # 在master节点执行kubeadm init命令成功后,复制日志中kubeadm join的命令即可,以下仅作于示例 sudo kubeadm join 192.168.0.104:6443 \ --token 315z7z.u6xbqnnqzkwbon01 \ --discovery-token-ca-cert-hash sha256:27124d08cb64619055d9f56547c3e6cd0218f4c420a9a7c863dd7e082b9c1216

    在master节点上,添加kubectlTAB键的提示和给kubectl取别名,并检查集群状态

    barnett@k8s-node01:~$ kubectl completion bash | sed "s/kubectl/k/g" >> ~/.bashrc barnett@k8s-node01:~$ source ~/.bashrc barnett@k8s-node01:~$ k get node NAME STATUS ROLES AGE VERSION k8s-node01 Ready master 2d23h v1.14.2 k8s-node02 Ready <none> 2d23h v1.14.2 k8s-node03 Ready <none> 32h v1.14.2 k8s-node04 Ready <none> 32h v1.14.2

    所有的节点都准备好,即Kubernetes集群就搭建完成,可以愉快地学习了~

    在上面提到的github中,包含了Kubernetes的dashboard和metrics-server的配置文件,已做过修改,即可食用~

    kubectl create -f ./dashboard/ -f ./metrics-server/

    创建完成后,在浏览器中访问https://192.168.0.104:30001/即可,所需要的token运行命令./dashboard/dashboard_token.sh即可获取(token后面的那一大串字符):

    barnett@k8s-node01:~/kubernetes$ ./dashborad/dashboard_token.sh Name: dashboard-admin-token-4w9hm Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name: dashboard-admin kubernetes.io/service-account.uid: a173be6d-7d70-11e9-a41a-080027c41ee4 Type: kubernetes.io/service-account-token Data ==== namespace: 11 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tNHc5aG0iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTE3M2JlNmQtN2Q3MC0xMWU5LWE0MWEtMDgwMDI3YzQxZWU0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.FrSOQQalyMyGMOXVUz8pJRQ-XlvYtrLi1LYLzHVkGpfp_ECOn2AWUkfPRY0rzu8XdsK3W86DUu-0w5exl2FvaEiw69JIHFHUlxS5xfIS33r9Bjv-K6Zb8iCcnwRqKHtj8LJ2OVWTWbE8_WwvtRri-EghLcODSrUKBnRa1fPPhs-6se-ytI_sTlXRRyI7ztOLJpTgEyY0whXirlKQIo6vzAaFxlNNejJLaUN7RkP1h1y9x30c8bV4MXk0KSreY48PvyT17NuszB88fTxKodtgdstCGD94XGrkOyOvufAjZ00uVpj5N2TpV6Sqj3nn_IPwTccPONSPHEufUjEX-AeMAw ca.crt: 1025 bytes

    最新回复(0)