Ubuntu通过kubeadm快速搭建k8s集群

Posted 司马老牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu通过kubeadm快速搭建k8s集群相关的知识,希望对你有一定的参考价值。

前言

本文是在Ubuntu 18.04 LTS系统上通过kubeadm快速搭建k8s集群,系统使用虚拟机安装,首先安装一台虚拟机(master节点),然后进行环境初始化配置,配置完成后直接克隆出两台工作节点。

环境准备

k8s集群角色 服务IP 主机名
控制节点 192.168.229.200 k8s-master200
工作节点 192.168.229.205 k8s-node205
工作节点 192.168.229.206 k8s-node206

服务器规划好以后,下面开始对环境进行初始化配置,在克隆虚拟机这一节之前所有操作都是在控制节点(192.168.229.200)上进行的,因为环境的配置都是一样的,现在一个服务器上配置完后直接克隆,可以方便快速完成集群的搭建。

配置静态IP

网络配置

cd /etc/netplan
#修改yaml文件,名称前缀也可能是其他数字
sudo vi 00-network-manager-all.yaml

配置内容如下,主要修改IP地址和网关地址,需要注意网卡的名称是否跟自己网卡的名称一致

#配置如下
network:
  version: 2
  renderer: NetworkManager
  ethernets:
     ens33:                                             #网卡名称通过ifconfig查看
       dhcp4: no                                        #dhcp4关闭
       dhcp6: no                                        #dhcp6关闭
       addresses: [192.168.229.200/24]                  #设置IP掩码
       gateway4: 192.168.229.2                          #设置网关
       nameservers:
         addresses: [114.114.114.114]                   #设置dns

修改生效

sudo netplan apply
ifconfig

安装ssh服务

#查看是否启动ssh服务
ps -ef|grep ssh
#如果没有安装则安装
sudo apt-get install openssh-server
#查看ssh服务状态
systemctl status sshd

设置hostname

修改/etc/hostname文件,设置当前服务器的hostname

sudo hostnamectl set-hostname k8s-master200 && bash

添加hosts

修改/etc/hosts,添加各个服务器的host

192.168.229.200 k8s-master200
192.168.229.205 k8s-node205
192.168.229.206 k8s-node206

配置时间同步

#查询上海时区
timedatectl list-timezones|grep Shanghai
#设置上海时区
sudo timedatectl set-timezone Asia/Shanghai
#安装ntpdate
sudo apt-get install ntpdate
#跟网络时间同步
sudo ntpdate cn.pool.ntp.org
#添加计划自动同步时间-1分钟同步一次
sudo vi /etc/crontab
* */1 * * *     root    ntpdate -s cn.pool.ntp.org

#重启计划服务
sudo service cron restart

修改系统镜像源

Ubuntu国内镜像源有很多,下面列举几个常用的,大家根据实际情况自己选择。

阿里镜像源

#  阿里镜像源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

中科大镜像源

#  中科大镜像源
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

清华镜像源

# 清华镜像源
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 https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

修改镜像源

#备份原镜像
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
#复制上面一个镜像进来即可
sudo vi /etc/apt/sources.list
#更新系统源
sudo apt-get upgrade
#更新软件包
sudo apt-get update

安装docker

安装最新版本

# 安装所需依赖
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# 安装 GPG 证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 新增软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 再次更新软件源
sudo apt-get -y update
# 安装docker最新版
sudo apt-get -y install docker-ce

安装指定版本

如果不想安装最新版本,需要安装指定版本,可以先查看docker有哪些版本,然后指定版本号进行安装,操作如下:

#查看docker版本
sudo apt-cache madison docker-ce
#列出如下版本信息
docker-ce | 5:20.10.6~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 5:20.10.5~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 5:20.10.4~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 5:20.10.3~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 5:20.10.2~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 5:20.10.1~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 5:20.10.0~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
...............................
#指定版本安装
sudo apt-get install -y docker-ce=5:19.03.9~3-0~ubuntu-bionic

查看docker信息

sudo docker version
sudo docker info

修改docker配置

 
    "registry-mirrors": ["https://替换为自己的阿里云.mirror.aliyuncs.com"],
    "insecure-registries": ["192.168.229.100:5000"],
    "exec-opts": ["native.cgroupdriver=systemd"] 
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

docker权限问题

Ubuntu系统中,由于都是通过普通用户进行操作,需要权限的操作都需要加上sudo很不方便,可以通过如下方式设置

#检查是否有docker group
sudo groupadd docker
#将当前用户加到 docker group 中
sudo usermod -aG docker $USER
#最后运行如下命令,如果还不能使用,就需要注销下当前用户再重新登录或者直接重启
newgrp docker

安装k8s准备

关闭交换分区

#临时关闭
sudo swapoff -a
#永久关闭-注释掉最后一行的swap
sudo vi /etc/fstab

安装依赖

sudo apt-get install -y apt-transport-https

安装gpg证书

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

添加k8s源

sudo vi /etc/apt/sources.list
#在最后一行新增如下源
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main

更新源

sudo apt-get update 

安装kubeadm

安装最新版本

#安装最新版本
sudo apt-get install -y kubelet kubeadm kubectl

安装指定版本

#查看有哪些版本
sudo apt-cache madison kubeadm
#安装指定版本
sudo apt-get install -y kubelet=1.20.6-00 kubeadm=1.20.6-00 kubectl=1.20.6-00

查看安装信息

kubeadm version

启动kubelet

sudo systemctl start kubelet
sudo systemctl enable kubelet
systemctl status kubelet

配置预检查

在安装之前需要注意,kubeadm init 命令在执行具体的安装过程之前,会做一系列的系统预检查,以确保主机环境符合安装要求,如果检查失败,就直接终止,不在进行init操作。因此我们可以通过kubeadm init phase preflight命令执行预检查操作,确保系统就绪后再进行init操作,如果检查结果提示我的CPU和内存小于最低要求,我们就可以根据提示进行修改,预检查命令如下:

kubeadm init phase preflight

准备k8s镜像

kubeadm config images list

当前版本k8s需要的镜像如下所示:

k8s.gcr.io/kube-apiserver:v1.20.15
k8s.gcr.io/kube-controller-manager:v1.20.15
k8s.gcr.io/kube-scheduler:v1.20.15
k8s.gcr.io/kube-proxy:v1.20.15
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0

编写pullk8s.sh脚本,用来从国内镜像仓库下载所需的k8s镜像,然后再tag成k8s.gcr.io的镜像,脚本内容如下:

for i in `kubeadm config images list`;  
do
    imageName=$i#k8s.gcr.io/
    #echo $imageName
    docker pull registry.aliyuncs.com/google_containers/$imageName
    docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    docker rmi registry.aliyuncs.com/google_containers/$imageName
done;

拉取镜像

sudo chmod +x pullk8s.sh
./pullk8s.sh

克隆虚拟机

分别克隆虚拟机k8s-node205k8s-node206,然后设置静态IP以及hostname,IP设置参加第一节,这里不再赘述

#修改k8s-node205的hostname
sudo hostnamectl set-hostname k8s-node205 && bash
#修改k8s-node206的hostname
sudo hostnamectl set-hostname k8s-node206 && bash

配置免密登录

#在master200执行
ssh-keygen    #一路回车,不输入密码
ssh-copy-id k8s-node205
ssh-copy-id k8s-node206

#在k8s-node205执行
ssh-keygen    #一路回车,不输入密码
ssh-copy-id k8s-master200
ssh-copy-id k8s-node206

#在k8s-node206执行
ssh-keygen    #一路回车,不输入密码
ssh-copy-id k8s-master200
ssh-copy-id k8s-node205

初始化k8s集群

初始化集群

在master节点k8s-master200初始化k8s集群,操作如下

sudo kubeadm init --kubernetes-version v1.20.6 --apiserver-advertise-address=192.168.229.200 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.10.0.0/16 --image-repository registry.aliyuncs.com/google_containers --ignore-preflight-errors=SystemVerification
参数 说明
--apiserver-advertise-address k8s中服务apiserver的部署地址,如果不填写,默认是本机
--image-repository 拉取的 docker 镜像源,因为初始化的时候kubeadm会去拉 k8s 的很多组件来进行部署,所以需要指定国内镜像源,下不然会拉取不到镜像
--pod-network-cidr k8s采用的节点网络,因为我们将要使用flannel作为 k8s 的网络
--kubernetes-version 这个是用来指定你要部署的 k8s 版本的,一般不用填,不过如果初始化过程中出现了因为版本不对导致的安装错误的话,可以用这个参数手动指定

初始化成功

Your Kubernetes control-plane has initialized successfully!

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.229.200:6443 --token qg3mup.6b4g8m28fdp1dumh \\
    --discovery-token-ca-cert-hash sha256:181822ecb09b96ef5a6ee32fcebf4bcd2ed6e603a6a324c2bcdc8c44adae318c 

配置kubectl

在master节点k8s-master200配置kubectl,操作如下

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#查看集群状态
kubectl get nodes

集群节点状态如下,此时集群状态还是 NotReady 状态,因为没有安装网络插件

NAME            STATUS     ROLES                  AGE     VERSION
k8s-master200   NotReady   control-plane,master   3m27s   v1.20.6

添加node节点

分别在k8s-node205k8s-node206两个节点执行如下命令,加入k8s集群

sudo kubeadm join 192.168.229.200:6443 --token qg3mup.6b4g8m28fdp1dumh \\
    --discovery-token-ca-cert-hash sha256:181822ecb09b96ef5a6ee32fcebf4bcd2ed6e603a6a324c2bcdc8c44adae318c

命令执行成功后显示如下结果,说明加入成功

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节点k8s-master200查看集群状态进行验证

k8s-master200   NotReady   control-plane,master   13m   v1.20.6
k8s-node205     NotReady   <none>                 11s   v1.20.6
k8s-node206     NotReady   <none>                 18s   v1.20.6

node节点重新加入

如果node节点加入失败,重新在加入,出现如下问题时,可以在node节点使用sudo kubeadm reset命令重置环境

error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists
        [ERROR Port-10250]: Port 10250 is in use
        [ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

安装网络插件

下载Calico的yaml文件,下载地址:https://docs.projectcalico.org/manifests/calico.yaml,下载完成后上传到master节点,在master节点k8s-master200安装Calico

sudo kubectl apply -f calico.yaml

查看Calico和coredns的pod的状态,running状态时,说明网络插件安装完成

kubectl get pod -n kube-system

再次查看集群状态,发现节点状态已经是Ready状态了

k8s-master200   Ready   control-plane,master   19m   v1.20.6
k8s-node205     Ready   <none>                 6m   v1.20.6
k8s-node206     Ready   <none>                 6m   v1.20.6

安装metrics-server组件

metrics-server是一个集群范围内的资源数据集和工具,同样的metrics-server也只是显示数据,并不提供数据存储服务,主要关注的是资源度量API的实现,比如CPU、文件描述符、内存、请求延时等指标,metric-server收集数据给k8s集群内使用,如kubectl,hpa,scheduler等。

#查看集群组件状态
kubectl get cs

#没安装metrics-server前显示如下
NAME                 STATUS      MESSAGE                                                                                       ERROR
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused   
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused   
etcd-0               Healthy     "health":"true" 

部署metrics-server服务

把离线镜像压缩包上传到k8s的各个节点,在每个节点按如下方法手动解压

docker load -i metrics-server-amd64-0-3-6.tar.gz 
docker load -i addon.tar.gz

/etc/kubernetes/manifests里面修改一下apiserver的配置,注意:这个是 k8s 在 1.17 的新特性,如果是 1.16 版本的可以不用添加,1.17 以后要添加。这个参数的作用是 Aggregation 允许在不修改 Kubernetes 核心代码的同时扩展 Kubernetes API。

sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml 

#增加如下内容:- --enable-bootstrap-token-auth=true下面
- --enable-aggregator-routing=true
sudo kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml 
kubectl get pods -n kube-system

#把 CrashLoopBackOff 状态的 kube-apiserver 删除 
kubectl delete pods kube-apiserver -n kube-system 
kubectl apply -f metrics.yaml

#测试 kubectl top 命令
kubectl top pods -n kube-system
kubectl top nodes

配置监听端口

默认在 1.19 之后 10252 和 10251 都是绑定在 127.0.0.1 的,如果想要通过 prometheus 监控,会采集不到数据,所以可以把端口绑定到物理机。

分别修改如下两个yaml文件中的内容:

  • --bind-address=127.0.0.1 变成--bind-address=192.168.229.200
  • httpGet字段下的 hosts 由 127.0.0.1 变成 192.168.229.200
  • --port=0 删除
sudo vi /etc/kubernetes/manifests/kube-scheduler.yaml
sudo vi /etc/kubernetes/manifests/kube-controller-manager.yaml

重启kubelet

修改之后在 k8s 各个节点重启下 kubelet

sudo systemctl restart kubelet
#再次查看集群组件状态
kubectl get cs

#显示如下结果
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-0               Healthy   "health":"true" 

命令补全

sudo apt-get install -y bash-completion
locate bash_completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)

以上是关于Ubuntu通过kubeadm快速搭建k8s集群的主要内容,如果未能解决你的问题,请参考以下文章

4.使用kubeadm方式搭建K8S集群

kubernetes— 记一次用kubeadm搭建kubernetes v1.9.0集群

使用kubeadm搭建生产级别k8s集群

使用kubeadm搭建k8s高可用集群

使用kubeadm搭建k8s高可用集群

k8s-搭建部署