使用 kubeadm 部署
上一章中,我们用 minikube 去搭建单机集群,并且创建 Deployment、Service(在三章中讲解),本篇将介绍利用 kubeadm 部署多节点集群,并学会 安装以及使用 kubernetes 的命令行工具,快速创建集群实例,完成部署 hello world 应用的实践。
Kubeadm 是 CKAD 认证中要求掌握的部署方式,但是镜像需要国外网络才能下载,读者如果是国内服务器,可以参考 2.4 章的内容,使用国内服务器进行代理。
本章内容主要介绍如何安装 kubeadm 以及部署集群、添加节点。
需要提前在服务器安装好 Docker。
本文为作者的 Kubernetes 系列电子书的一部分,电子书已经开源,欢迎关注,电子书浏览地址:
https://k8s.whuanle.cn【适合国内访问】
https://ek8s.whuanle.cn 【gitbook】
命令行工具
在 kubernetes 中,主要有三个日常使用的工具,这些工具使用 kube 前缀命名,这三个工具如下:
kubeadm:用来初始化集群的指令,能够创建集群已经添加新的节点。可用其它部署工具替代。kubelet:在集群中的每个节点上用来启动 Pod 和容器等,每个节点必须有,相对于节点与集群的网络代理。kubectl:用来与集群通信/交互的命令行工具,与 kubernetes API-Server 通讯,是我们操作集群的客户端。
在 1.5 章中介绍过 kubelet、kubectl,kubelet 负责集群中节点间的通讯,kubectl 供用户输入命令控制集群,而且 kubeadm 则是创建集群、添加减少节点的工具。
安装命令行工具
命令行工具是每个节点都需要安装的, kubectl、kubelet 两个是必需的组件,而 kubeadm 则可以被代替。kubeadm 是 Kubenetes 官方推荐的部署工具,但由于网络等各方面原因,中文社区中也开发了一些替代项目,例如 Kubesphere(https://kubesphere.com.cn/),可在国内部署 Kubernetes,省去网络问题。
通过软件仓库安装
下面介绍如何 通过 Google 的源下载安装工具包。
更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
下载 Google Cloud 公开签名秘钥:
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
添加 Kubernetes apt 仓库:
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
注:如果是国内服务器,请忽略以上两步,使用以下命令解决:
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
执行命令检查是否正常:
kubeadm --help
不同操作系统
只是这里介绍一下 ubuntu 和 centos 不同的安装方法,已经通过前面的安装方法安装好,则不需要理会这一小节。
Ubuntu 和 Debain 等系统可以使用以下命令通过软件仓库安装:
sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2 curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
Centos、RHEL 等系统可以使用以下命令通过软件仓库安装:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet kubeadm kubectl
集群管理
创建 kubernetes 集群
Kubeadm 是一个创建管理工具,主要提供了 kubeadm init 和 kubeadm join 两个命令,作为创建 Kubernetes 集群的 “快捷途径” 的最佳实践。
Kubernetes 集群由 Master 和 Worker 两种节点组成,Master 节点负责控制集群所有的节点。
注意,本教程集群中的节点应当都是内网可互通的服务器,这些服务器之间可以通过内网相互访问。如果是服务器之间通过公网相互通讯的,操作方法请查询其它教程。
1,创建 Master
执行 hostname -i 查看此 node 的 ip。
我们初始化一个 API Server 服务,绑定地址为 192.168.0.8(按照你的ip改)。此步骤创建了一个 master 节点。
注:可以直接使用 kubeadm init,它会自动使用默认网络ip。
kubeadm init
# 或 kubeadm init --apiserver-advertise-address 192.168.0.8
# 或 kubeadm init --apiserver-advertise-address $(hostname -i)
部署失败,可以参考下面两个命令,查看失败原因。
systemctl status kubelet
journalctl -xeu kubelet
常见与 Docker 有关的错误可参考: https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker
完成后,会提示一些信息,在提示的内容中找到:
kubeadm join 192.168.0.8:6443 --token q25z3f.v5uo5bphvgxkjnmz \
--discovery-token-ca-cert-hash sha256:0496adc212112b5485d0ff12796f66b29237d066fbc1d4d2c5e45e6add501f64
保存这段信息下来备用,后面加入节点时需要使用到。
如果有提示 Alternatively, if you are the root user, you can run:则你还需要执行下面的命令。
export KUBECONFIG=/etc/kubernetes/admin.conf
[Info] 提示
admin.conf 是连接 Kubernetes 的认证文件,通过此文件才能连接到 kubernetes,kubectl 也需要这个文件;在 Linux 中,使用 KUBECONFIG 环境变量知道认证文件的所在。
Linux 中每个用户的环境变量是不同的,如果切换了用户,则也需要设置 KUBECONFIG 环境变量;如果要在别的节点上连接集群,则可以把这个文件复制过去。
后面的操作都需要 admin.conf 文件,否则会报 The connection to the server localhost:8080 was refused - did you specify the right host or port? 。
由于 export 的环境变量不能持久化,请打开 ~/.bashrc 文件,把这个命令加到文件最后面。
[Info] 提示
为了保护 /etc/kubernetes/admin.conf,避免直接指向,建议每个用户复制一次此文件到用户目录下,其命令如下:
mkdir -p $HOME/.kube
cp -f /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
2,初始化网络
这一步不是必需的,不过一般来说,部署 Kubernetes 会配置网络,否则会节点之间不能相互访问,读者可以跟着做一次,在后面的章节中我们在一探究竟。
通过远程配置文件初始化网络,需要从第三方拉取一个 yaml 文件。
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" --namespace=kube-system
# --namespace=kube-system 表示插件放到 kube-system 命名空间中运行
成功的话会提示:
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.apps/weave-net created
我们也可以手动配置,执行 kubectl version 查看版本号,找到 GitVersion:v1.21.1 ,替换 yaml 文件的地址 https://cloud.weave.works/k8s/net?k8s-version=v1.21.1,然后执行 kubectl apply -n kube-system -f net.yaml 即可。
3,加入集群
前面已经创建了 Master 节点,接下来将另一个服务器以 Worker 节点的方式加入集群中。如果读者只有一台服务器,则可以跳过这个步骤。
当节点加入 kubeadm 初始化的集群时,双方需要建立双向信任,分为发现(Worker信任Master) 和 TLS 引导(Master信任待加入Worker)两部分。目前有两种加入方式,一种是通过令牌加入,一种是通过 kubeconfig 文件加入。
格式:
kubeadm join --discovery-token abcdef.xxx {IP}:6443 --discovery-token-ca-cert-hash sha256:xxx
kubeadm join--discovery-file file.conf
在第二个节点中,使用之前备份好的命令,直接执行,加入集群,格式如下命令所示。
kubeadm join 192.168.0.8:6443 --token q25z3f.v5uo5bphvgxkjnmz \
--discovery-token-ca-cert-hash sha256:0496adc212112b5485d0ff12796f66b29237d066fbc1d4d2c5e45e6add501f64
复制粘贴时,要注意,可能会由于 \ 换行符,导致粘贴时,多了一个小数点,导致报错。

可能碰到的问题
查看 docker 版本:yum list installed | grep docker 和 docker version。
如果部署过程中出现 failed to parse kernel config: unable to load kernel module,也说明了 docker 版本太高,需要降级。
如果服务器装了 dnf,那么降级 docker 版本的命令:
dnf remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
dnf -y install dnf-plugins-core
dnf install docker-ce-18.06.3.ce-3.el7 docker-ce-cli containerd.io
不行的话就按照 https://docs.docker.com/engine/install/centos/ 降级,或者自行按照其它方法处理。
注意,docker version 会看到 client 和 server 版本,两者的版本号可能不一致。
删除节点
在生产环境中,由于节点上已经部署着服务,因此直接删除节点,可能会导致严重的故障问题。因此需要移除一个节点时,首先要在此节点上驱逐所有 Pods,Kubernetes 会自动将此节点上的 Pod 转移到其它节点上部署(第三章会讲)。
获取集群中的所有节点,找到需要驱逐的节点名称。
kubectl get nodes
驱逐此节点上所有的 Pod:
kubectl drain {node名称}
虽然驱逐了节点上所有的服务,但是节点依然在集群中,只是 Kubernetes 不会再部署 Pod 到此节点上。如果需要恢复此节点,允许继续部署 Pod,可使用:
kubectl uncordon {节点名称}
关于驱逐,后面的章节会学习到。
注:驱逐 Pod,并一定能够驱逐所有 Pod,有些 Pod 可能不会被清除。
最终删除此节点:
kubectl delete node {节点名称}
集群删除了此节点后,节点上还保留着一些数据,可以继续清除环境。
清除环境
如果步骤做错了想重来,或者移除节点需要清除环境,可以执行 kubeadm reset [flags] 命令。
注:只执行 kubeadm reset 命令无效。
[flags] 有四种类型:
preflight Run reset pre-flight checks
update-cluster-status Remove this node from the ClusterStatus object.
remove-etcd-member Remove a local etcd member.
cleanup-node Run cleanup node.
我们需要执行:
kubeadm reset cleanup-node
kubeadm reset
即可在当前服务器上清除 Kubernetes 残留的 容器或者其它数据。
使用 kubeadm 部署的更多相关文章
- kubernetes kubeadm部署高可用集群
k8s kubeadm部署高可用集群 kubeadm是官方推出的部署工具,旨在降低kubernetes使用门槛与提高集群部署的便捷性. 同时越来越多的官方文档,围绕kubernetes容器化部署为环境 ...
- kubeadm部署Kubernetes集群
Preface 通过kubeadm管理工具部署Kubernetes集群,相对离线包的二进制部署集群方式而言,更为简单与便捷.以下为个人学习总结: 两者区别在于前者部署方式使得大部分集群组件(Kube- ...
- 使用kubeadm部署Kubernetes v1.13.3
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: 1. 安装要求 在开始之前,部署Kubernetes集群 ...
- 使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像)
系列目录 kubernetes简介 Kubernetes节点架构图: kubernetes组件架构图: 准备基础环境 我们将使用kubeadm部署3个节点的 Kubernetes Cluster,整体 ...
- 附012.Kubeadm部署高可用Kubernetes
一 kubeadm介绍 1.1 概述 参考<附003.Kubeadm部署Kubernetes>. 1.2 kubeadm功能 参考<附003.Kubeadm部署Kubernetes& ...
- Kubeadm部署安装kubernetes1.12.1
1.环境准备(这里是master) CentOS 7.6 两台配置如下,自己更改主机名,加入hosts, master和node 名字不能一样 # hostname master # hostname ...
- ubuntu18.04使用kubeadm部署k8s单节点
实验目的: 体验kubeadm部署k8s服务,全流程体验! 实验环境: ubuntu18.04 联网在线部署 kubeadm 01.系统检查 节点主机名唯一,建议写入/etc/hosts 禁止swap ...
- (二)Kubernetes kubeadm部署k8s集群
kubeadm介绍 kubeadm是Kubernetes项目自带的及集群构建工具,负责执行构建一个最小化的可用集群以及将其启动等的必要基本步骤,kubeadm是Kubernetes集群全生命周期的管理 ...
- [原]使用kubeadm部署kubernetes(一)
####################### 以下为声明 ##################### 在公众号 木子李的菜田 输入关键词: k8s 有系列安装文档 此文档是之前做笔记在 ...
- kubeadm部署高可用K8S集群(v1.14.2)
1. 简介 测试环境Kubernetes 1.14.2版本高可用搭建文档,搭建方式为kubeadm 2. 服务器版本和架构信息 系统版本:CentOS Linux release 7.6.1810 ( ...
随机推荐
- 41 位 Contributor 参与,1574 个 PR,不容错过的版本更新!
6 月 25 日,在商业公司 SphereEx 正式成立一月之余的今天,我们很高兴的宣布 Apache ShardingSphere 迎来了 5.0.0-beta 版本的正式发布.经过半年多的优化和打 ...
- Oracle中常用的to_char用法详解
Oracle函数to_char转化数字型指定小数点位数的用法 to_char,函数功能,就是将数值型或者日期型转化为字符型. 比如最简单的应用: -- 1.0123=>1.0123 SELECT ...
- Java(23)常用API二
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228415.html 博客主页:https://www.cnblogs.com/testero ...
- netty系列之:netty对http2消息的封装
目录 简介 http2消息的结构 netty对http2的封装 Http2Stream Http2Frame 总结 简介 无论是什么协议,如果要真正被使用的话,需要将该协议转换成为对应的语言才好真正的 ...
- docker逃逸漏洞复现(CVE-2019-5736)
漏洞概述 2019年2月11日,runC的维护团队报告了一个新发现的漏洞,SUSE Linux GmbH高级软件工程师Aleksa Sarai公布了影响Docker, containerd, Podm ...
- Scrum Meeting 0522
零.说明 日期:2021-5-22 任务:简要汇报两日内已完成任务,计划后两日完成任务 备注:由于在Beta冲刺阶段的最后一周中团队成员需要准备必修课程计算机网络的相关考试,所以为了保证Beta功能的 ...
- window系统上实现mongodb副本集的搭建
一.问题引出 假设我们生产上的mongodb是单实例在跑,如果此时发生网络发生问题或服务器上的硬盘发生了损坏,那么这个时候我们的mongodb就使用不了.此时我们就需要我们的mongodb实现高可用, ...
- WPF进阶技巧和实战08-依赖属性与绑定03
数据提供者 在大多数的代码中,都是通过设置元素的DataContext属性或者列表控件的ItemsSource属性,从而提供顶级的数据源.当数据对象是通过另一个类构造时,可以有其他选择. 一种是作为窗 ...
- 关于linux的fork的一点学习总结
最近操作系统的实验要用到fork,于是去搜索了一下资料,很幸运地在博客中找到一篇深度好文: http://blog.csdn.net/jason314/article/details/5640969 ...
- linux 内核源代码情景分析——越界访问
页式存储管理机制通过页面目录和页面表将每个线性地址转换成物理地址,当遇到下面几种情况就会使CPU产生一次缺页中断,从而执行预定的页面异常处理程序: ① 相应的页面目录或页表项为空,也就是该线性地址与物 ...