k8s v1.26.2 安装部署
k8s部署安装
主要转载自https://www.bmabk.com/index.php/post/42728.html 对部分地方略有调整
在今年5月3日的时候Kubernetes (以下简称k8s)官方已经发布了1.24版本,此版本带来了 46 项增强,在这 46 项增强功能中,13 项正在升级到稳定版,14 项是不断改进的现有功能,13 项是全新的,6 项是已弃用的功能。其中,最大的变动是删除了Dockershim,这意味着Dockershim作为k8s对接 Docker到CRI接口上的一个垫片时代已经结束了,对我们讲是一个新的开始,我们可以拥抱更多容器运行时的支持,例如比较优秀的containerd、CRI-O等,今天我们来排一下基于containerd部署的k8s集群。
1 基础环境搭建
在生产环境中,k8s的基础环境搭建是必不可少的步骤,若是基础环境搭建的不好,后期可能会存在各种各样的隐患,所以基础环境搭建尤为重要。
k8s-master centos 7.9(内核5.4) 10.0.0.100
k8s-node1 centos 7.9(内核5.4) 10.0.0.101
k8s-node2 centos 7.9(内核5.4) 10.0.0.102
docker 23.0.1
kubeadm v1.26.2
kubectl v1.26.2
kubelet v1.26.2
2 基础环境配置
这里各主机的网络已经按照上面的清单配置完成
#### 2.1 主机名和hosts设置
#在10.0.0.100上执行如下:
$ hostnamectl set-hostname k8s-master && bash
#在10.0.0.101上执行如下:
$ hostnamectl set-hostname k8s-node1 && bash
#在10.0.0.102上执行如下:
$ hostnamectl set-hostname k8s-node2 && bash
#修改每台机器的/etc/hosts文件,增加如下三行:
$ vim /etc/hosts
10.0.0.100 k8s-master
10.0.0.101 k8s-node1
10.0.0.102 k8s-node2
# 每台机器执行以下命令,看hosts是否生效:
$ ping k8s-master
$ ping k8s-node1
$ ping k8s-node2
2.2 关闭防火墙、selinux、关闭交换分区
##关闭防火墙
$ systemctl stop firewalld
##禁止防火墙开机启动
$ systemctl disable firewalld
##永久关闭selinux 注:重启机器后,selinux配置才能永久生效
$ sed -i 's/enforcing/disabled/' /etc/selinux/config
##临时关闭selinux 执行getenforce 显示Disabled说明selinux已经关闭
$ setenforce 0
##永久关闭交换分区swap 注:重启机器后,才能永久生效
$ sed -ri 's/.*swap.*/#&/' /etc/fstab
##临时关闭交换分区swap
$ swapoff -a
2.3 修改内核参数
##加载br_netfilter模块
$ modprobe br_netfilter
#验证模块是否加载成功
$ lsmod | grep br_netfilter
##修改内核参数
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
$ vm.swappiness = 0 # 禁止使用swap空间,只有当系统OOM时才允许使用它
##生效
$ sysctl --system 或 sysctl -p /etc/sysctl.d/k8s.conf
- net.bridge.bridge-nf-call-iptables:开启桥设备内核监控(ipv4)
- net.ipv4.ip_forward:开启路由转发
- net.bridge.bridge-nf-call-ip6tables:开启桥设备内核监控(ipv6)
以上3项为必须参数,其他参数可根据需要添加。
3 安装Containerd(二进制)、runc,配置crictl客户端
【注】在k8s1.24弃用Docker之后,可以不需要安装Docker,这里改为安装Containerd(踩了坑的。。。)
3.1 下载二进制包
$ wget https://github.com/containerd/containerd/releases/download/v1.6.8/cri-containerd-1.6.8-linux-amd64.tar.gz
$ tar zxvf cri-containerd-1.6.8-linux-amd64.tar.gz
$ ls -l
drwxr-xr-x 4 root root 51 4月 26 07:52 etc
drwxr-xr-x 4 root root 35 4月 26 07:51 opt
drwxr-xr-x 3 root root 19 4月 26 07:50 usr
etc目录:主要为containerd服务管理配置文件及cni虚拟网卡配置文件;
opt目录:主要为gce环境中使用containerd配置文件及cni插件;
usr目录:主要为containerd运行时的二进制文件,包含runc;
3.2 拷贝二进制可执行文件到$PATH
中
$ ls usr/local/bin/
containerd containerd-shim containerd-shim-runc-v1 containerd-shim-runc-v2 containerd-stress crictl critest ctd-decoder ctr
$ cp usr/local/bin/* /usr/local/bin/
containerd 的安装包中一共有五个文件,通过上面的命令它们被安装到了 /usr/local/bin 目录中:
containerd:即容器的运行时,以 gRPC 协议的形式提供满足 OCI 标准的 API
containerd-release:containerd项目的发行版发布工具
containerd-stress:containerd压力测试工具
containerd-shim:这是每一个容器的运行时载体,我们在 docker 宿主机上看到的 shim 也正是代表着一个个通过调用 containerd 启动的 docker 容器。
ctr:它是一个简单的 CLI 接口,用作 containerd 本身的一些调试用途,投入生产使用时还是应该配合docker 或者 cri-containerd 部署。
3.3 创建初始配置文件
$ mkdir -p /etc/containerd/
$ containerd config default > /etc/containerd/config.toml #创建默认的配置文件
3.4 创建初始配置文件
$ mkdir -p /etc/containerd/
$ containerd config default > /etc/containerd/config.toml #创建默认的配置文件
3.5 修改配置
- 替换镜像源
由于国内环境原因我们需要将 sandbox_image 镜像源设置为阿里云的google_containers镜像源。
$ sed -i "s#k8s.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
#等同于:
$ vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"
- 配置镜像加速(在文件的中下位置,也可以不配,好像不影响)
$ vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://cekcu3pt.mirror.aliyuncs.com"]
- 配置驱动器
Containerd 和 Kubernetes 默认使用旧版驱动程序来管理 cgroups,但建议在基于 systemd 的主机上使用该驱动程序,以符合 cgroup 的“单编写器”规则。
$ sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
#等同于
$ vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
3.6 创建服务管理配置文件
拷贝服务管理配置文件到/usr/lib/systemd/system/目录
$ grep -v ^# etc/systemd/system/containerd.service
$ mv etc/systemd/system/containerd.service /usr/lib/systemd/system/containerd.service
3.7 启动 containerd 服务
$ systemctl daemon-reload
$ systemctl enable --now containerd.service
$ systemctl status containerd.service
$ containerd --version #查看版本
containerd github.com/containerd/containerd v1.6.3 f830866066ed06e71bad64871bccfd34daf6309c
3.8 安装runc(二进制)
由于二进制包中提供的runC默认需要系统中安装seccomp支持,需要单独安装,且不同版本runC对seccomp版本要求不一致,所以建议单独下载runC 二进制包进行安装,里面包含了seccomp模块支持。
下载地址:https://github.com/opencontainers/runc/releases
Runc是真正运行容器的工具
$ chmod +x runc.amd64
$ mv runc.amd64 /usr/bin/runc
$ runc -version #出现以下说明安装没有问题
runc version 1.1.4
commit: v1.1.4-0-g5fd4c4d1
spec: 1.0.2-dev
go: go1.17.10
libseccomp: 2.5.4
##出现以下说明依赖确实或者版本不支持
runc: symbol lookup error: runc: undefined symbol: seccomp_notify_respond
【报错原因】缺少依赖包libseccomp(2.4
以上版本)安全计算模式。解决办法:
$ wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm
$ rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm
$ rpm -qa | grep libseccomp
libseccomp-2.5.1-1.el8.x86_64
$ runc -version
runc version 1.1.2
commit: v1.1.2-0-ga916309f
spec: 1.0.2-dev
go: go1.17.11
libseccomp: 2.5.1
3.9 配置crictl客户端
$ mv etc/crictl.yaml /etc/
$ cat /etc/crictl.yaml
image-endpoint: unix:///var/run/containerd/containerd.sock
4 安装kubeadm、kubectl、kubelet
4.1 安装各组件工具,并启动kubelet
$ yum install -y kubelet-1.26.2 kubeadm-1.26.2 kubectl-1.24.4
$ systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
#上面可以看到kubelet状态不是running状态,这个是正常的,不用管,等k8s组件起来这个kubelet就正常了。
Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
kubelet: 安装在集群所有节点上,用于启动Pod的
kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
4.2 设置Table键补全
让命令可用自动table键进行补全,对新手无法记住命令提供很好的支持,所在主机进行该操作方可使用table补全。
- Kubectl命令补全:
$ kubectl completion bash > /etc/bash_completion.d/kubelet
- Kubeadm命令补全:
$ kubeadm completion bash > /etc/bash_completion.d/kubeadm
5 初始化master节点(仅主节点执行初始化)
5.1 检测安装环境
检测主机环境是否达到集群的要求,可根据结果提示进行逐一排除故障
$ kubeadm init --dry-run
5.2 镜像下载/导入
1)列出需要使用的镜像列表
$ kubeadm config images list
2)拉取镜像
$ kubeadm config images pull
--image-repository registry.aliyuncs.com/google_containers
--kubernetes-version v1.24.4
–image-repository: 从哪个地方下载镜像(默认”k8s.gcr.io”,但k8s.gcr.io国内无法访问);
–kubernetes-version: 指定kubernetes集群的镜像版本;
5.3 创建配置文件
创建默认的配置文件
$ kubeadm config print init-defaults > kubeadm-init.yaml
修改配置文件
$ cat kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.0.0.100 #修改为控制节点IP(VIP)
bindPort: 6443
nodeRegistration:
criSocket: /run/containerd/containerd.sock #使用containerd为容器运行时
imagePullPolicy: IfNotPresent
name: k8s-master #修改为控制节点主机名
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers #修改为阿里镜像地址
kind: ClusterConfiguration
kubernetesVersion: 1.26.2 #版本
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 #指定Pod网段
serviceSubnet: 10.96.0.0/12 #指定Service网段
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
5.4 初始化
$ kubeadm init --config kubeadm-init.yaml
显示如下说明安装成功:
5.5 环境配置
根据初始化成功后的提示对集群进行基础的配置。
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ export KUBECONFIG=/etc/kubernetes/admin.conf
$ echo "KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc && source ~/.bashrc
# 查看当前节点
$ kubectl get nodes
5.6 添加子节点
在上面kubeadm init
执行成功的最后一句找到,然后执行
$ kubeadm join 10.0.0.100:6443 --token lrdbnr.lxxxxxxxxf --discovery-token-ca-cert-hash sha256:c43602c5689ffee13ef8904f7bfxxxxxxxxxxxxxxxxxxxxxxxxxxx
注:该token 有效期为24小时。参数 –control-plane 就是加入控制节点,不带该参数就是加入工作节点。
如果token过期的话,也可以用如下命令生成:
$ kubeadm token create --print-join-command
5.7 集群重置(可选)
初始化master有问题,可将集群重置,再次初始化master
$ kubeadm reset
6 网络插件(Flannel,仅master安装)
本来是打算和大佬的笔记一样,安装Calico的,但是试了几次都失败,折磨,后面发现Flannel安装真简单,我真是头铁。。。。
6.1 安装Flannel
根据k8s官网教程https://kubernetes.feisky.xyz/extension/network/flannel ,一句命令就搞定
![image-20230311011630775](/Users/ergwang/Library/Application Support/typora-user-images/image-20230311011630775.png)
但是有个问题,因为我们前面设置了pod网段,这里配置Flannel部署配置也会涉及,所以必须一致
# 第一种解决办法:修改Flannel的配置,在apply
$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
$ vim kube-flannel.yml # 将默认的10.244.0.0/16修改为自己的配置
$ kubectl apply -f kube-flannel.yml
# 第二种解决办法:修改当前k8s的配置
$ kube-controller-manager --allocate-node-cidrs=true --cluster-cidr=10.244.0.0/16
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
6.2 查看flannel部署结果
kubectl -n kube-system get pods -o wide
# 看到kube-flannel-xx 所有服务全部RUNNING就好了
6.3 查看各个node的状态
kubectl get nodes
# 这时候每个node都是Ready状态了
OVER!完成。