Kubeadm快速搭建K8s集群【v1.26】

快速部署一个K8s集群------kubernetes v1.26,kubeadm方式

1. 前置知识点

1.1 生产环境可部署Kubernetes集群的两种方式

目前生产部署Kubernetes集群主要有两种方式:

kubeadm

Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。

二进制包

从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

这里采用kubeadm搭建集群。

kubeadm工具功能:

• **kubeadm init:**初始化一个Master节点

• **kubeadm join:**将工作节点加入集群

• **kubeadm upgrade:**升级K8s版本

• **kubeadm token:**管理 kubeadm join 使用的令牌

• **kubeadm reset:**清空 kubeadm init 或者 kubeadm join 对主机所做的任何更改

• **kubeadm version:**打印 kubeadm 版本

• **kubeadm alpha:**预览可用的新功能

1.2 准备环境

服务器要求:

  • 建议最小硬件配置:2核CPU、2G内存、20G硬盘
  • 本次实验环境4核CPU、8GB内存、200G硬盘(笔者使用的服务器做的ESXI虚拟化)
  • 服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点

软件环境:

软件版本
操作系统CentOS 7.9_x64
Docker23.0.4
Kubernetes1.26

服务器规划:

角色IP
k8s-master192.168.200.29
k8s-node1192.168.200.30
k8s-node2192.168.200.31

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-86_x64
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区

2. 准备环境

架构图:

kubernetes架构图

关闭防火墙:
$ systemctl stop firewalld
$ systemctl disable firewalld

关闭selinux:
$ sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
$ setenforce 0  # 临时

关闭swap:
$ swapoff -a  # 临时
$ sed -ri 's/.*swap.*/#&/' /etc/fstab  # 永久

设置主机名:
$ hostnamectl set-hostname <hostname>

在master添加hosts:
$ cat >> /etc/hosts << EOF
192.168.200.29 k8s-master
192.168.200.30 k8s-node1
192.168.200.31 k8s-node2
EOF

将桥接的IPv4流量传递到iptables的链:
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sysctl --system  # 生效

时间同步:
$ yum install ntpdate -y
$ ntpdate time.windows.com

3. 安装Docker/kubeadm/kubelet【所有节点】

3.1 安装Docker

$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce
$ systemctl enable docker && systemctl start docker

配置镜像下载加速器:

$ cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://292nm6nu.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
$ systemctl restart docker
$ docker info

3.2 安装cri-dockerd

Kubernetes v1.24移除docker-shim的支持,而Docker Engine默认又不支持CRI标准,因此二者默认无法再直接集成。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的桥梁,从而能够让Docker作为Kubernetes容器引擎。

如图所示:

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.3.1-3.el7.x86_64.rpm

指定依赖镜像地址:

vi /usr/lib/systemd/system/cri-docker.service
把原来的注释一下添加如下
#ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://

ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7

systemctl daemon-reload 
systemctl enable cri-docker && systemctl start cri-docker
没有安装cri-dockerd,在kubeadm init初始化时会出现一下错误。找不到CRI标准

failed to run Kubelet: validate service connection: CRI v1 runtime API is not implemented for endpoint

3.3 添加阿里云YUM软件源

$ cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

3.4 安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:

$ yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
$ systemctl enable kubelet

4. 部署Kubernetes Master

https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/#config-file

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#initializing-your-control-plane-node

在192.168.200.29(Master)执行。

$ kubeadm init \
  --apiserver-advertise-address=192.168.200.29 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.26.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
  --ignore-preflight-errors=all
  • –apiserver-advertise-address 集群通告地址

  • –image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址

  • –kubernetes-version K8s版本,与上面安装的一致

  • –service-cidr 集群内部虚拟网络,Pod统一访问入口

  • –pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致

  • –ignore-preflight-errors,忽略预检查错误

  • –cri-socket 指定cri-dockerd接口,如果是containerd则使用–cri-socketunix:///run/containerd/containerd.sock

    初始化完成后,最后会输出一个join命令,先记住,下面用。

如果上面kubeadm init命令有错误,执行下面命令重置kubeadm及无用的镜像

#重置Kubeadm
kubeadm reset -f

#删除docker无用的镜像容器
docker system prune -f

或者使用配置文件引导:

$ vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.26.0
imageRepository: registry.aliyuncs.com/google_containers 
networking:
  podSubnet: 10.244.0.0/16 
  serviceSubnet: 10.96.0.0/12 

$ kubeadm init --config kubeadm.conf --ignore-preflight-errors=all  

拷贝kubectl使用的连接k8s认证文件到默认路径:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果是root用户执行如下变量即可

export KUBECONFIG=/etc/kubernetes/admin.conf

查看工作节点

$ kubectl get nodes
NAME               STATUS     ROLES            AGE   VERSION
localhost.localdomain   NotReady   control-plane,master   20s   v1.26.0

注:由于网络插件还没有部署,还没有准备就绪 NotReady,先继续

5. 加入Kubernetes Node

在192.168.200.30-31(Node1和Node2)执行。

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:

$ kubeadm join 192.168.200.29:6443 --token 7gqt13.kncw9hg5085iwclx \
--discovery-token-ca-cert-hash sha256:66fbfcf18649a5841474c2dc4b9ff90c02fc05de0798ed690e1754437be35a01 --cri-socket=unix:///var/run/cri-dockerd.sock

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:

kubeadm token create --print-join-command

上面命令报错后根据报错内容进行相应修改即可,例如下面报错信息

[preflight] Running pre-flight checks
        [WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists
        [ERROR Port-10250]: Port 10250 is in use
        [ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

删除已有配置文件并重启kubelet即可

kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock

rm -f /etc/kubernetes/kubelet.conf
rm -f /etc/kubernetes/pki/ca.crt
systemctl stop kubelet

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/

6. 部署容器网络(CNI)

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network

注意:只需要部署下面其中一个,推荐Calico。

Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。

Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。

此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能。

https://docs.projectcalico.org/getting-started/kubernetes/quickstart

$ wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml

下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。

#在3579行处添加如下配置
            - name: CALICO_IPV4POOL_CIDR
              value: "10.244.0.0/16"

修改完后应用清单:

$ kubectl apply -f calico.yaml
$ kubectl get pods -n kube-system

等Calico Pod都Running,节点也会准备就绪。

注:以后所有yaml文件都只在Master节点执行。

安装目录:/etc/kubernetes/

组件配置文件目录:/etc/kubernetes/manifests/

7. 测试kubernetes集群

  • 验证Pod工作
  • 验证Pod网络通信
  • 验证DNS解析

在Kubernetes集群中创建一个pod,验证是否正常运行:

$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pod,svc

访问地址:http://NodeIP:Port

8. 部署 Dashboard

$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

$ vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001		#这里注意大小写格式
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort			 #这里注意大小写格式
...

$ kubectl apply -f recommended.yaml
$ kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-6b4884c9d5-gl8nr   1/1     Running   0          13m
kubernetes-dashboard-7f99b75bf4-89cds        1/1     Running   0          13m

##注意如果这里的nodePort写成nodeport或者存在其他书写问题,就会报如下的错
Error from server (BadRequest): error when creating "recommended.yaml": Service in version "v1" cannot be handled as a Service: strict decoding error: unknown field "spec.ports[0].nodeport"

访问地址:https://NodeIP:30001
使用输出的token登录Dashboard。

如果无法访问使用如下方式查看kubernetes-dashboard状态是否为running

先用kubectl get pods --all-namespaces -owide查看问题pod,然后用kubectl describe pod pod_name -n kube-system来查看日志,一般情况下,我们都是可以通过这个方式来获取到报错原因

创建service account并绑定默认cluster-admin管理员集群角色:

# 创建用户
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
# 获取用户Token
kubectl create token dashboard-admin -n kubernetes-dashboard

使用输出的token登录Dashboard。

查看master组件状态:

kubectl get cs


解决方法:

vi /etc/kubernetes/manifests/kube-scheduler.yaml 
将文件中的  --port=0 参数注释即可。
vi /etc/kubernetes/manifests/kube-controller-manager.yaml 

systemctl restart kubelet

安装k8s命令补全功能:

yum install -y bash-completion
source /usr/share/bash-completion/bash-completion
source <(kubectl completion bash)

9. 切换容器引擎为Containerd

containerd是一个主流的容器引擎,与Docker相兼容,相比Docker轻量很多,目前较为成熟。

参考资料:https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#containerd

1、配置先决条件
如果是由docker切containerd这步可省略。因为安装docker时自动配置了这些。

查看相应模块是否被加载。
lsmod | grep overlay
lsmod | grep br_netfilter
sysctl -a | grep net.bridge.bridge-nf-call-iptables
sysctl -a | grep net.bridge.bridge-nf-call-ip6tables
sysctl -a | grep net.ipv4.ip_forward
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

2、安装containerd

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
yum update -y && sudo yum install -y containerd.io
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

systemctl restart containerd

3、修改配置文件

  • pause镜像设置过阿里云镜像仓库地址
  • 拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址
vi /etc/containerd/config.toml
...
   [plugins."io.containerd.grpc.v1.cri"]
      sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"  
       ...
   [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
          [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
            endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]
          
systemctl restart containerd

4、配置kubelet使用containerd

vi /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8"

systemctl restart kubelet

5、验证

kubectl get node -o wide

k8s-node1  xxx  containerd://1.5.6

6、管理容器工具

containerd提供了ctr命令行工具管理容器,但功能比较简单,所以一般会用crictl工具检查和调试容器。

项目地址:https://github.com/kubernetes-sigs/cri-tools/

设置crictl连接containerd:

vi /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false

下面是docker与crictl命令对照表:

镜像相关功能DockerContainerd
显示本地镜像列表docker imagescrictl images
下载镜像docker pullcrictl pull
上传镜像docker push无,例如buildk
删除本地镜像docker rmicrictl rmi
查看镜像详情docker inspect IMAGE-IDcrictl inspecti IMAGE-ID
容器相关功能DockerContainerd
显示容器列表docker pscrictl ps
创建容器docker createcrictl create
启动容器docker startcrictl start
停止容器docker stopcrictl stop
删除容器docker rmcrictl rm
查看容器详情docker inspectcrictl inspect
附加容器docker attachcrictl attach
执行命令docker execcrictl exec
查看日志docker logscrictl logs
查看容器资源docker statscrictl stats
POD 相关功能DockerContainerd
显示 POD 列表crictl pods
查看 POD 详情crictl inspectp
运行 PODcrictl runp
停止 PODcrictl stopp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值