【K8s 精选】CKA - 使用 Kubeadm 安装基本集群

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【K8s 精选】CKA - 使用 Kubeadm 安装基本集群相关的知识,希望对你有一定的参考价值。

参考技术A kubernetes 基本组件有

● 使用命令 ip link 或 ifconfig -a 来获取网络接口的 MAC 地址
● 使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验

显式加载模块 modprobe br_netfilter,可执行 sudo modprobe br_netfilter ,Linux 节点上的 iptables 能够正确地查看桥接流量,确保在 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1

控制平面节点:

工作节点:

如下图所示,Kubeadm 在完整 Kubernetes 堆栈中的位置。

基于 Debian 的发行版安装 kubelet、kubeadm 和 kubectl

将单个控制平面 kubeadm 集群升级成高可用, 可以指定 --control-plane-endpoint "xxx:6443" 为所有控制平面节点设置共享端点,其中端点 xxx 可以是负载均衡器的 DNS 名称或 IP 地址。

安装网络插件,可以参考 网络插件 、 kubelet 命令

我的K8s之路-实践多次的kubeadm部署源生k8s


kubernetes做为PAAS云的落地平台已经不是新闻了,从2016年开始国内很多云厂纷纷开始做二次研发,一些IT集团根据自己的业务需求,自研适合自身业务的容器编排平台,包括很多大客户的技术提供商,也在为客户的业务应用做平台开发,可巧笔者当初就曾用ansible写过k8s的自动部署脚本,这算是第一次接触k8s。

后来国内考CKA认证的技术人员越来越多,到我考的时候已经有5000多号人了,现在应该更多,CKA认证基本已经成为从业人员的标配。尽管google也好,rancher也罢,包括很多云厂商都有各自的部署工具,但CKA考试还是要从开源版本学起,kubeadm是源生的部署工具,特别考试有一道8分的题,就是在裸机上用kubeadm部署k8s集群。即便不考认证,如果你要从事容器云的相关工作,个人认为也应该从开源版本学起。

再到后来有幸成为红旗教育学院的k8s讲师,想将部署操作k8s的内容做下梳理,故撰成此文。此为第一回,先说部署,后续再慢慢加其它内容。


其实说到源生的K8s部署,刚开始应该先从源码安装开始,这个我也做过几回,优点是能快速熟悉kubernetes架构和组件构成和组件与组件之前的耦合关系。不过从易用性和可用性角度出发,无论是测试还是上生产,我想基本都不会考虑, 费时费力还一堆坑,这个还是留待大伙学习,或我哪天心情特别差的时候再说哈。所以第一回先从kubeadm部署k8s集群开始。

小提示:kubernetes为啥又叫k8s,是因为k与s之间有8个字母,国人的简便称谓。。。。。

好,现在开始部署,首先要准备最起码三台设备,虚拟机也好,物理机也罢,这个随便,建议配置如下:

机器配置:2核CPU,8G内存,40G系统盘
系统:Ubuntu 16.04.6 LTS
机器数量:3台 (master node01 node02)

当然了,你要说内存4G行不行,也可以,一个测试不必要在这方面那么严谨,至于为啥要用Ubuntu,这是CNCF社区的建议版本,其实用centos也一样。能把集群跑起来就算得~

接下来开始基础环境配置(3台都要执行)
(其实这部分属于Linux基础配置,如果对Linux不熟请先自行补课,当然在评论区问我也可以哈)

(1) ### 修改配置静态hostname

hostnamectl set-hostname master1(node01,node02)

(2)### hosts表:

172.16.100.206 master
172.16.100.205 node01
172.16.100.204 node02

(3)### 关闭firewalld

ufw disable

(4)### 关闭SELinux
ubuntu默认关闭SELinux

(5)### 关闭swap
临时关闭:swapoff -a
永久关闭:注释掉/etc/fstab下的swap一行
如果使用swap会影响性能,一般建议关闭,当然你非要用也不是没有办法。

(6)### 更新apt包索引

apt-get update

这个是ubuntu比较方便的地方,随时更新随时新~~

(7)### 安装软件包

apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

这一步的作用是允许apt通过HTTPS使用存储库

(8)### 安装add-apt-repository工具

apt-get -y install software-properties-common

(9)### 添加Docker的官方GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

(10)### 添加稳定的存储库

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

上两步的是为了安装docker做准备

(11)### 查看Docker版本

apt-cache madison docker-ce

现在已经到19版本了,不过我测试还是用的18.09.9

(12)### 安装docker-ce=5:18.09.9~3-0~ubuntu-bionic

apt-get -y install docker-ce=5:18.09.9~3-0~ubuntu-xenial docker-ce-cli=5:18.09.9~3-0~ubuntu-xenial containerd.io

执行docker info进行验证

(13)### 解决swap报错
执行docker info命令在最后一层会出现:

WARNING: No swap limit support(操作系统下docker内存限制的警告)

执行命令,vim /etc/default/grub 添加或编辑GRUB_CMDLINE_LINUX行以添加这键值:

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1 net.ifnames=0 vga=792 console=tty0 console=ttyS0,115200n8 noibrs"

更新grub并重启机器

update-grub
reboot

(14)### 解决防火墙转发策略问题
docker 在 1.13 版本之后,将系统iptables 中 FORWARD 链的默认策略设置为 DROP,并为连接到 docker0 网桥的容器添加了ACCEPT规则,
临时解决办法:

iptables -P FORWARD ACCEPT

永久解决办法:

vim /lib/systemd/system/docker.service.
在[Service]下添加:ExecStartPost=/sbin/iptables -P FORWARD ACCEPT

(15)### 设置daemon.json

cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

主要是配置docker的日志和拉取镜像源,registry-mirrorsr使用国内阿里云的源,这很重要,因为如果不配置,默认的源要能***才能搞。
读取配置并重启服务

systemctl daemon-reload && systemctl restart docker.service

(16)### 安装kubeadm、kubelet、kubectl

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

还是一样,kubernetes的源需要***,所以依然用阿里的源,其实搞了k8s才知道阿里云做了很多贡献。
默认安装最高版

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

本锁定版本

sudo apt-mark hold kubelet kubeadm kubectl

(17)###免密访问(master节点)

ssh-keygen -t rsa
ssh-copy-id k8s-master
ssh-copy-id k8s-node01
ssh-copy-id k8s-node02

到此,基础环境配置完成,接下来开始正式部署。


情况是这样的,测试环境只有一个master,所以是single control-plane的集群,在在master节点执行

(1)### 初始化control-plane节点
生成配置文件

kubeadm config print init-defaults > init-defaults.yaml

kubeadm工具提供部署k8s的默认配置,可以输出为yaml文件,但需要修改。
文件中的镜像源imageRepository为

k8s.gcr.io

安装时默认会从这个源下载镜像,如果不***无法下载,故可事先将其改为:

registry.cn-hangzhou.aliyuncs.com/google_containers

在networking下修改clusterName(集群名称),修改apiservice地址

localAPIEndpoint:
advertiseAddress: 172.16.100.206
clusterName: cluster01

(2)### 执行初始化操作

kubeadm init --config=init-defaults.yaml

或者

kubeadm init
--kubernetes-version=v1.18.0
--apiserver-advertise-address=172.16.100.206

部署现在k8s的最新版1.18.0,执行初始化操作时会先下载镜像,也可以先下载再部署。
列出需下载镜像列表

kubeadm config images list

拉取镜像到本地

kubeadm config images pull

(3)###初始化完成后马上需要做的
执行完初始化后,会有提示如何添加worker节点,与集群管理员帐户配置。
集群管理员帐户配置:

root用户
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /root/.bashrc
source /root/.bashrc
非root用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

注意,将添加worker节点命令保存,例如:

kubeadm join 172.16.100.206:6443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:a84eff9fe6cb5b9b01326b8790f86d73d59b99d124cdc8d8eb8d0208aeaeb905

(4)###检查集群
检查组件状态是否正常

kubectl get componentstatuses

查看集群系统信息

kubectl cluster-info

检查支撑集群运行所有组件

kubectl -n kube-system get all

这些都是集群初始化完成后的基本操做,至此初始化集群完成,接下来开始配置集群。


初始化完成且,需要对集群做配置才可以投入使用

(1)###自动补全
为什么先做它,是因为懒的原因,这步操作可以将kubectl命令,所有参数用tab健补全,就像Linux一样:)

首先,取消bash-completion注释

vim /etc/bash.bashrc
enable bash completion in interactive shells
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
source /etc/bash.bashrc

第二步是查看completion帮助

kubectl completion -h

可获取自动补全的命令

source <(kubectl completion bash)

如果执行一遍只是当前可用,再登陆就不行了。
将kubectl自动补全添加到配置文件中,可以在以后的shell中自动加载

echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

(2)###配置网络

kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml

注,在集群部署结束后,kube-system命名空间内集群运行所需的所有控制器与POD,其中coredns是未running状态,需要安装网络插件才能running,此步要在添加节点前执行。

(3)###添加work节点
登陆两台work节点,分别执行集群初始化完成时保存的内容,例如:

kubeadm join 172.16.100.206:6443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:a84eff9fe6cb5b9b01326b8790f86d73d59b99d124cdc8d8eb8d0208aeaeb905

如果没保存,可以用命令生成再执行
创建token

kubeadm token create

查看token

kubeadm token list

获取discovery-token-ca-cert-hash值

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed ‘s/^.* //‘

检查集群节点

kubectl get node

如果出现三台节点都是ready状态,即表示成功,如下所示:

NAME STATUS ROLES AGE VERSION
k8s-master Ready master 23h v1.18.2
k8s-node01 Ready <none> 23h v1.18.2
k8s-node02 Ready <none> 23h v1.18.2

###重新初始化
如果部署遇到问题或报错,需要重新初始化

kubeadm reset

注,master与work节点都要执行

至此,k8s集群部署完成,很多人都说谁也无法保证kubeadm能一次部署成功。基本上照着做的话成功率还是很高的,如果能出现节点状态都ready的话,就可以用了。

不过这里我只写了操作,说实话想着没啥,可写起来这么老多,还牵扯很多k8s组件的运行原理和概念没说,大伙要是看着还行,可以留言讨论,请期待下回,谢谢。

以上是关于【K8s 精选】CKA - 使用 Kubeadm 安装基本集群的主要内容,如果未能解决你的问题,请参考以下文章

【K8s 精选】CKA - 如何配置和使用 CoreDNS

【K8s 精选】CKA - ClusterIP、NodePort、LoadBalancer 的使用

我的K8s之路-实践多次的kubeadm部署源生k8s

关于 Kubernetes使用kubeadm重置集群的一些笔记

关于 Kubernetes使用kubeadm重置集群的一些笔记

kubeadm搭建高可用K8s集群