【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 - ClusterIP、NodePort、LoadBalancer 的使用
关于 Kubernetes使用kubeadm重置集群的一些笔记