15

Ubuntu通过kubeadm快速搭建k8s集群

 3 years ago
source link: https://blog.51cto.com/bijava/5470095
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文是在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

安装并启动ssh服务后,便可以使用ssh工具远程连接了,不用再忍受虚拟机超级难用的命令行窗口了,起飞吧!

设置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

直接在/etc/apt/sources.list里添加https://mirrors.aliyun.com/kubernetes/apt/是不行的,因为这个阿里镜像站使用的ssl进行传输的,所以要先安装apt-transport-https并下载镜像站的密钥才可以进行下载

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)

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK