前言

本文介绍如何在ubuntu上部署k8s集群,大致可以分为如下几个步骤:

  • 修改ubuntu配置
  • 安装docker
  • 安装kubeadmkubectl以及kubelet
  • 初始化master节点
  • slave节点加入网络


因为k8s分为管理节点工作节点,所以我们将要 在master上部署管理节点,在slave01上部署工作节点

本文的 docker、k8s 软件安装具体版本。

首先,k8s 要求我们的 ubuntu 进行一些符合它要求的配置。很简单,包括以下两步:关闭 Swap 内存 以及 配置免密登录,这一步两台主机都需要进行配置。

关闭 swap 内存

这个swap其实可以类比成 windows 上的虚拟内存,它可以让服务器在内存吃满的情况下可以保持低效运行,而不是直接卡死。但是 k8s 的较新版本都要求关闭swap。所以咱们直接动手,修改**/etc/fstab**文件:

vi /etc/fstab

你应该可以看到如下内容,把第二条用#注释掉就好了,注意第一条别注释了,不然重启之后系统有可能会报file system read-only错误。

UUID=0ecd04d2-a439-4333-aa3d-1b74209bd82a /               ext4    errors=remount-ro 0       1
#/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0

然后输入reboot重启即可,重启后使用top命令查看任务管理器,如果看到如下KiB Swap后均为 0 就说明关闭成功了。

配置免密登录

k8s 要求 管理节点可以直接免密登录工作节点 的原因是:在集群搭建完成后,管理节点的 kubelet 需要登陆工作节点进行操作。具体操作看一下这个传送门里面的文章传送门(ssh免密登陆)

二. 安装 docker

docker 是 k8s 的基础,在安装完成之后也需要修改一些配置来适配 k8s ,所以本章分为 docker 的安装docker 的配置 两部分。如果你已经安装并使用了一段时间的 docker 了话,建议使用docker -v查看已安装的 docker 版本,并在 k8s 官网上查询适合该版本的 k8s 进行安装。这一步两台主机都需要进行安装

docker 的安装

docker 在 ubuntu 的安装上真是再简单不过了,执行如下命令即可,在安装之前请记得把镜像源切换到国内。

apt install docker.io

等安装完成之后使用docker -v来验证 docker是否可用。
docker 的配置
安装完成之后需要进行一些配置,包括 切换docker下载源为国内镜像站 以及 修改cgroups

这个cgroups是啥呢,你可以把它理解成一个进程隔离工具,docker就是用它来实现容器的隔离的。docker 默认使用的是cgroupfs,而 k8s 也用到了一个进程隔离工具systemd,如果使用两个隔离组的话可能会引起异常,所以我们要把 docker 的也改成systemd。

这两者都是在/etc/docker/daemon.json里修改的,所以我们一起配置了就好了,首先执行下述命令编辑daemon.json

vi /etc/docker/daemon.json

打开后输入以下内容:

{"registry-mirrors": ["https://dockerhub.azk8s.cn","https://reg-mirror.qiniu.com","https://quay-mirror.qiniu.com"],"exec-opts": [ "native.cgroupdriver=systemd" ]
}

然后:wq保存后重启 docker:

systemctl daemon-reload
systemctl restart docker

然后就可以通过docker info | grep Cgroup来查看修改后的 docker cgroup 状态,发现变为systemd即为修改成功。

三. 安装 k8s

安装完了 docker 就可以下载 k8s 的三个主要组件kubelet、kubeadm以及kubectl了。这一步两台主机都需要进行安装。先来简单介绍一下这三者:

kubelet: k8s 的核心服务
kubeadm: 这个是用于快速安装 k8s 的一个集成工具,我们在masterslave01上的 k8s 部署都将使用它来完成。
kubectl: k8s 的命令行工具,部署完成之后后续的操作都要用它来执行
其实这三个的下载很简单,直接用apt-get就好了,但是因为某些原因,它们的下载地址不存在了。所以我们需要用国内的镜像站来下载,也很简单,依次执行下面五条命令即可:

# 使得 apt 支持 ssl 传输
apt-get update && apt-get install -y apt-transport-https
# 下载 gpg 密钥
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 添加 k8s 镜像源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
# 更新源列表
apt-get update
# 下载 kubectl,kubeadm以及 kubelet
apt-get install -y kubelet kubeadm kubectl

直接在/etc/apt/sources.list里添加https://mirrors.aliyun.com/kubernetes/apt/是不行的,因为这个阿里镜像站使用的ssl进行传输的,所以要先安装apt-transport-https并下载镜像站的密钥才可以进行下载。
注:
如果安装完kubelet kubeadm kubectl后,节点报版本问题的错误,可以安装指定版本的kubelet kubeadm kubectl解决问题。
下载“1.15.1-00”版本,(我在安装时就是用了如下方式进行安装)。

apt-get install -y kubelet=1.15.1-00 kubeadm=1.15.1-00 kubectl=1.15.1-00

四. 安装 master 节点

下载完成后就要迎来重头戏了,初始化master节点,这一章节只需要在管理节点上配置即可,大致可以分为如下几步:

  • 初始化master节点
  • 部署flannel网络
  • 配置kubectl工具

初始化 master 节点

使用kubeadminit命令就可以轻松的完成初始化,不过需要携带几个参数,如下。先不要直接复制执行,将赋值给–apiserver-advertise-address参数的 ip 地址修改为自己的master主机地址,然后再执行。

kubeadm init  \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version=v1.15.1 \
--pod-network-cidr=10.244.0.0/16

这里介绍一下一些常用参数的含义:

  • - -apiserver-advertise-address: k8s 中的主要服务apiserver的部署地址,填自己的管理节点 ip
  • - -image-repository: 拉取的 docker 镜像源,因为初始化的时候kubeadm会去拉 k8s 的很多组件来进行部署,所以需要指定国内镜像源,下不然会拉取不到镜像。
  • - -pod-network-cidr: 这个是 k8s 采用的节点网络,因为我们将要使用flannel作为 k8s 的网络,所以这里填10.244.0.0/16就好
  • - -kubernetes-version: 这个是用来指定你要部署的 k8s 版本的,一般不用填,不过如果初始化过程中出现了因为版本不对导致的安装错误的话,可以用这个参数手动指定。
  • - -ignore-preflight-errors: 忽略初始化时遇到的错误,比如说我想忽略 cpu 数量不够 2 核引起的错误,就可以用–ignore-preflight-errors=CpuNum。错误名称在初始化错误时会给出来。
    注:
    ①init时,也可以不带–apiserver-advertise-address,K8S会自动指定自己系统的主机ip,如果需要指定公网IP则必须携带此参数。
    ②- -pod-network-cidr参数一定要带,否则master的kube-flannel-ds会出现错误CrashLoopBackOff。
    ③- -kubernetes-version,如果之前安装kubelet kubeadm kubectl时候指定了版本,init master时可以不带此参数也是会初始化成功的,k8s自动的选择版本进行初始化。

当你看到如下字样是,就说明初始化成功了,请把最后那行以kubeadm join开头的命令复制下来,之后安装工作节点时要用到的,如果你不慎遗失了该命令,可以在master节点上使用kubeadm token create --print-join-command命令来重新生成一条。

Your Kubernetes master has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou 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/You can now join any number of machines by running the following on each node
as root:kubeadm join 172.17.195.122:6443 --token eokszg.2a3i5608kfuwdza6 \--discovery-token-ca-cert-hash sha256:f155433a005a2063c4292cdbb516dfafec4baeba177be8302940bfef9faa4cc3

注:
#生成的join没有保存或者忘记,输入kubeadm token create --print-join-command重新生成一条。

kubeadm token create --print-join-command
kubeadm join 172.17.195.122:6443 --token fq73k4.1boyv4wa3swhmm03     --discovery-token-ca-cert-hash sha256:ad8f43188e599f0e07334df58836e177b93aa6e998bfc6f8798811181cfd5743

如果在初始化过程中出现了任何Error导致初始化终止了,使用

kubeadm reset重置之后再重新进行初始化。 配置 kubectl 工具

这一步就比较简单了,直接执行如下命令即可:

mkdir -p /root/.kube && \
cp /etc/kubernetes/admin.conf /root/.kube/config

执行完成后并不会刷新出什么信息,可以通过下面两条命令测试 kubectl是否可用:

# 查看已加入的节点
kubectl get nodes
# 查看集群状态
kubectl get cs

部署 flannel 网络

flannel是什么?它是一个专门为 k8s 设置的网络规划服务,可以让集群中的不同节点主机创建的 docker 容器都具有全集群唯一的虚拟IP地址。想要部署flannel的话直接执行下述命令即可:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

输出如下内容即为安装完成:

clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created

至此,k8s 管理节点部署完成。

五. slave 节点

将 slave 节点加入网络
首先需要重复步骤 1 ~ 3 来安装 docker 、k8s 以及修改服务器配置,之后执行从步骤 4 中保存的命令即可完成加入,注意,这条命令每个人的都不一样,不要直接复制执行:

kubeadm join 172.17.195.122:6443 --token fq73k4.1boyv4wa3swhmm03     --discovery-token-ca-cert-hash sha256:ad8f43188e599f0e07334df58836e177b93aa6e998bfc6f8798811181cfd5743

待控制台中输出以下内容后即为加入成功:

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 master to see this node join the cluster.

随后登录master查看已加入节点状态,可以看到slave01已加入,并且状态均为就绪。至此,k8s 搭建完成:

root@master:~# kubectl get nodes
NAME      STATUS   ROLES    AGE    VERSION
master    Ready    master   3d1h   v1.15.1
slave01   Ready    <none>   2d5h   v1.15.1

大注特注(遇到错误怎么办,部署失败怎么办):

①K8S部署一遍可能不会成功,会遇到好多好多的问题,我们可以通过自己的一些手段才排查。

查看nodes状态,各node是否ready

kubectl get nodes

查看pods状态,各pod是否ready

kubectl get pods --all-namespaces

如果有不ready的node或者pod,查看kuberctl.services日志进行分析

journalctl -f -u kubelet.service

查看指定pod的日志,xxx是pod名称,可以通过kubectl get pods获得pod的name

kubectl describe pod   xxx

查看deployment

kubectl get deployment

日志具体有什么错误,通过百度搜索错误来排除错误。
②如果日志没有错误,出现连接超时或者连接拒绝等问题,又或者kuberctl.services日志里根本没有错误。
考虑是不是端口未开放
lsof -i:xxx ,如果返回信息则代表端口开放
同时,阿里云后台的端口限制也需要解除,只打开服务器的端口是不够的。
③如果节点无法加入k8s集群(提示验证失败,tomeout=10),考虑各虚拟机的时间是否校准

timedatectl #查看各个机器的时间是否统一

如果不统一,则点击这个传送门查看校准时间方法
④注意k8s是否和虚拟机内核相匹配,有内核版本冲突之类的问题。
此处举一个例子,kubelet cgroup driver: “cgroupfs” is different from docker cgroup driver: “systemd”。

tips:

给大家一些当时我用到的排错网站。
传送门,里面综合一些K8S的问题,相信对大家部署和学习k8s会有一些帮助。

错误 “cni0” already has an IP address different from xxxx解决办法

kubernetes更换IP地址重新初始化master节点

通过上网搜索日志的错误提示,可以解决掉绝大部分的问题,大家一起努力,对K8S有更深入的体会和认识。

阿里云部署K8s及一些排错体会相关推荐

  1. 阿里云部署k8s集群

    ​ 阿里云部署k8s集群 前言 1.k8集群架构 Kubernetes Cluster = N Master Node + N Worker Node:N主节点+N工作节点: N>=1 2.机器 ...

  2. 2021最新阿里云部署k8s集群(篇1 购买服务器)

    实验kubernetes版本: v1.22.1

  3. 容器化技术与微服务结合---SpringCloud框架与阿里云serverless k8s的结合(六)

    目录 系列 写在前面 Serverless K8S 概念 创建集群 微服务搭建 项目地址 环境区分以及dockerFile注意 阿里云日志接入 创建阿里云日志project 配置 测试 Kuberne ...

  4. 腾讯云部署K8s集群

    腾讯云部署K8s集群 文章目录 腾讯云部署K8s集群 0. 导读(重要!!!一定要读) 1. 环境准备 版本 服务器配置 2. 安装步骤 所有主机操作 1. 提前准备 2. 安装docker 3. 安 ...

  5. Linux虚拟机或阿里云部署本地Javaweb项目

    Linux系统部署本地项目 服务器 Linux 阿里云.华为云.腾讯云 安装虚拟机,虚拟机就是在你的电脑中安装一台虚拟的计算机,内存.CPU.硬盘,Linux 安装到虚拟机中. CentOS7,企业级 ...

  6. 阿里云部署Docker(5)----管理和公布您的镜像

    出到这节,我在百度搜索了一下"阿里云部署Docker",突然发现怎么会有人跟我写的一样呢?哦,原来是其它博客系统的爬虫来抓取,然后也不会写转载自什么什么的.所以,我最终明确为什么那 ...

  7. pythonmysql部署_详解centos7+django+python3+mysql+阿里云部署项目全流程

    (PS:本文假设你已经在本地联调好django和客户端,只是需要将django部署到外网) 购买阿里云服务器 到[阿里云官网],选择轻量应用服务器, 步骤如图所示: 地域随便选择哪一个,镜像的话,对比 ...

  8. 阿里云 部署SpringBoot和Vue项目 亲测可用(第一次部署经验贴)

    阿里云 部署SpringBoot和Vue项目 亲测可用!第一次部署经验贴! 前言:与伙伴一起写了一个项目,但是由于老师要我们部署到服务器上,而我从未有部署过,查看了csdn很多博客,试了好多篇,才成功 ...

  9. Win10环境下基于Hexo的静态博客环境搭建,及其阿里云部署

    引言 1.为什么要搭建自己的个人博客 工作和学习过程中,我们经常遇到一些这样或那样的问题,此时我们可能会在网上找到相应的解决方法.但是过了一段时间之后,当我们再次碰到类似的问题时,早已忘记以前是怎么解 ...

最新文章

  1. Android studio 自动导入(全部)包 import
  2. Can’t connect to local MySQL server through socket的解决方法
  3. Selenium2Library关键字(1)
  4. sql server 关联left join条件on和where条件的区别
  5. NIPS 2018 论文解读集锦(11月28日更新)
  6. qt如何做到实时显示数据_Python 如何实时绘制数据
  7. matlab 一维 平滑,一维加噪信号的平滑处理(3)
  8. 详解数据科学与数理统计的基本概念
  9. 队列:先入先出的数据结构讲解
  10. bash linux .ee,Linux下Bash shell学习笔记.md
  11. 创建一个简单的WCF程序2——手动开启/关闭WCF服务与动态调用WCF地址
  12. FMRI数据分析与处理
  13. python 高等数学实验,高等数学以及Python 实现
  14. js 日期函数 将 js new Date() 转化为年月日时分秒
  15. grasp设计模式应用场景_设计模式 GRASP GoF
  16. 头条号运营技巧,百万爆文运营经验分享
  17. Java反编译器JD
  18. 进程、线程等操作系统基础知识
  19. Arduino与Proteus仿真实例-OLED显示屏(SSD1306)I2C驱动仿真
  20. 软件开发常用工具汇总百度云网盘

热门文章

  1. jquery寻找父子兄弟节点
  2. html a text decoration,你未必知道的CSS小知识:text-decoration属性变成了属性简写
  3. 【创意二维码】二维码挽救了传统的纸质报纸,这是怎么回事儿?
  4. position和float属性详解
  5. m1芯片 php,苹果M1 版 MacBook软件兼容实测:VS Code不能用 PHPStorm可运行
  6. 8421码到5421码的转换_如何实现用283加法器实现8421码到5421码的转换
  7. 为什么cfg文件打开是乱码
  8. 【游戏引擎开发必问】 渲染管线的剖析
  9. 基因xii_在Hack Week XII上运行创意
  10. 小米路由器3HD内网穿透成功