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"]

image-20230311002227416


  • 配置驱动器

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

image-20230311002710927


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 

显示如下说明安装成功:

image-20230311010459650


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执行成功的最后一句找到,然后执行

image-20230311011049949

$ 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部署配置也会涉及,所以必须一致

image-20230311011811266

# 第一种解决办法:修改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!完成。

posted @ 2023-03-11 01:42  浪漫主义程序员  阅读(1793)  评论(0编辑  收藏  举报