阿里云部署K8s及一些排错体会
前言
本文介绍如何在ubuntu上部署k8s集群,大致可以分为如下几个步骤:
- 修改ubuntu配置
- 安装docker
- 安装kubeadm、kubectl以及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 的一个集成工具,我们在master和slave01上的 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 节点
使用kubeadm的init命令就可以轻松的完成初始化,不过需要携带几个参数,如下。先不要直接复制执行,将赋值给–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及一些排错体会相关推荐
- 阿里云部署k8s集群
阿里云部署k8s集群 前言 1.k8集群架构 Kubernetes Cluster = N Master Node + N Worker Node:N主节点+N工作节点: N>=1 2.机器 ...
- 2021最新阿里云部署k8s集群(篇1 购买服务器)
实验kubernetes版本: v1.22.1
- 容器化技术与微服务结合---SpringCloud框架与阿里云serverless k8s的结合(六)
目录 系列 写在前面 Serverless K8S 概念 创建集群 微服务搭建 项目地址 环境区分以及dockerFile注意 阿里云日志接入 创建阿里云日志project 配置 测试 Kuberne ...
- 腾讯云部署K8s集群
腾讯云部署K8s集群 文章目录 腾讯云部署K8s集群 0. 导读(重要!!!一定要读) 1. 环境准备 版本 服务器配置 2. 安装步骤 所有主机操作 1. 提前准备 2. 安装docker 3. 安 ...
- Linux虚拟机或阿里云部署本地Javaweb项目
Linux系统部署本地项目 服务器 Linux 阿里云.华为云.腾讯云 安装虚拟机,虚拟机就是在你的电脑中安装一台虚拟的计算机,内存.CPU.硬盘,Linux 安装到虚拟机中. CentOS7,企业级 ...
- 阿里云部署Docker(5)----管理和公布您的镜像
出到这节,我在百度搜索了一下"阿里云部署Docker",突然发现怎么会有人跟我写的一样呢?哦,原来是其它博客系统的爬虫来抓取,然后也不会写转载自什么什么的.所以,我最终明确为什么那 ...
- pythonmysql部署_详解centos7+django+python3+mysql+阿里云部署项目全流程
(PS:本文假设你已经在本地联调好django和客户端,只是需要将django部署到外网) 购买阿里云服务器 到[阿里云官网],选择轻量应用服务器, 步骤如图所示: 地域随便选择哪一个,镜像的话,对比 ...
- 阿里云 部署SpringBoot和Vue项目 亲测可用(第一次部署经验贴)
阿里云 部署SpringBoot和Vue项目 亲测可用!第一次部署经验贴! 前言:与伙伴一起写了一个项目,但是由于老师要我们部署到服务器上,而我从未有部署过,查看了csdn很多博客,试了好多篇,才成功 ...
- Win10环境下基于Hexo的静态博客环境搭建,及其阿里云部署
引言 1.为什么要搭建自己的个人博客 工作和学习过程中,我们经常遇到一些这样或那样的问题,此时我们可能会在网上找到相应的解决方法.但是过了一段时间之后,当我们再次碰到类似的问题时,早已忘记以前是怎么解 ...
最新文章
- Android studio 自动导入(全部)包 import
- Can’t connect to local MySQL server through socket的解决方法
- Selenium2Library关键字(1)
- sql server 关联left join条件on和where条件的区别
- NIPS 2018 论文解读集锦(11月28日更新)
- qt如何做到实时显示数据_Python 如何实时绘制数据
- matlab 一维 平滑,一维加噪信号的平滑处理(3)
- 详解数据科学与数理统计的基本概念
- 队列:先入先出的数据结构讲解
- bash linux .ee,Linux下Bash shell学习笔记.md
- 创建一个简单的WCF程序2——手动开启/关闭WCF服务与动态调用WCF地址
- FMRI数据分析与处理
- python 高等数学实验,高等数学以及Python 实现
- js 日期函数 将 js new Date() 转化为年月日时分秒
- grasp设计模式应用场景_设计模式 GRASP GoF
- 头条号运营技巧,百万爆文运营经验分享
- Java反编译器JD
- 进程、线程等操作系统基础知识
- Arduino与Proteus仿真实例-OLED显示屏(SSD1306)I2C驱动仿真
- 软件开发常用工具汇总百度云网盘
热门文章
- jquery寻找父子兄弟节点
- html a text decoration,你未必知道的CSS小知识:text-decoration属性变成了属性简写
- 【创意二维码】二维码挽救了传统的纸质报纸,这是怎么回事儿?
- position和float属性详解
- m1芯片 php,苹果M1 版 MacBook软件兼容实测:VS Code不能用 PHPStorm可运行
- 8421码到5421码的转换_如何实现用283加法器实现8421码到5421码的转换
- 为什么cfg文件打开是乱码
- 【游戏引擎开发必问】 渲染管线的剖析
- 基因xii_在Hack Week XII上运行创意
- 小米路由器3HD内网穿透成功