Centos7 部署K8S集群实战

一、K8S简介

Kubernetes中文官网:Kubernetes

GitHub:github.com/kubernetes/kubernetes

Kubernetes简称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,起源于Google 集群管理工具Borg。

Kubernetes集群组件逻辑图

在这里插入图片描述k8s集群属于Master-Slave主从架构,Master节点负责集群管理和资源调度,用于运行控制平面组件(Control Plane Components),Slave节点就是工作负载节点,一般称为Node节点,也叫Worker节点,主要负责运行Pod,一个Pod里可以同时运行多个容器,而容器一般封装的就是基于Dokcer打包的应用,Pod英文叫豌豆荚,每个容器就像是一颗豌豆,简单来说Pod就是一组容器。

Master节点组件及功能

组件名称功能用途
kube-apiserver负责处理接受请求。
etcd高可用键值存储,用于k8s集群的后台数据库。
kube-scheduler负责选择Worker节点运行新创建的Pod,需要考虑的因素包括资源需求,软硬件及策略约束,亲和性和反亲和性规范、数据位置等。
kube-controller-manager负责运行不同类型的控制器进程,每个控制器都是一个单独进程,常见的控制器有节点控制器(Node Controller)、任务控制器(Job Controller)、端点分片控制器(EndpointSlice controller)、服务账号控制器(ServiceAccount controller)等。
cloud-controller-manager用于嵌入特定的云平台的控制器。

Slave节点组件及功能

组件名称功能用途
kubelet负责管理Node节点上容器的健康运行,通过接收一组PodSpecs来实现,每个Node节点上都会运行一个kubelet,不会管理不是由 Kubernetes 创建的容器。
kube-proxy负责Node节点上的网络代理,用于维护网络规则,这些规则允许从集群内部或外部与Pod进行网络通信,每个Node节点上都会运行一个kube-proxy,k8s的Service就是利用该组件实现的。
Container Runtime负责管理容器的执行和生命周期。支持多种类型的容器运行时环境,比如containerd、 CRI-O及CRI自定义实现,k8s使用容器运行时接口(CRI)和用户选择的容器运行时交互。

kubeadm工具

使用Kubeadm工具可以快速搭建一个k8s集群,主要包括初始化控制平面节点和加入Worker节点,提供的主要功能如下:

  • kubeadm init:初始化一个Master节点
  • kubeadm join:将Worker节点加入集群
  • kubeadm upgrade:升级K8s版本
  • kubeadm token:管理 kubeadm join 使用的令牌
  • kubeadm reset:清空 kubeadm init 或者 kubeadm join 对主机所做的任何更改
  • kubeadm version:打印 kubeadm 版本
  • kubeadm alpha:预览可用的新功能

二、准备工作

软硬件要求

  • Linux操作系统,Ubuntu 或 CentOS
  • 每台节点至少2G
  • Master节点至少2C
  • 集群节点网络互通

集群规划

操作系统CentOS Linux 7(Linux 3.10.0-693.el7.x86_64)
Dockerv26.1.4
k8sv1.20.9
kubeadmv1.20

节点配置

主机角色IPCPU内存磁盘
mogumaster196.168.200.1324C10Gi30G
node002node1196.168.200.1294C10Gi30G
node003node2196.168.200.1304C10Gi30G

环境配置

配置主机名

分别修改3台主机名称

hostnamectl set-hostname mogu/node002/node003
more /etc/hostname  
修改hosts配置

配置修改所有节点的IP和域名映射

vim /etc/hosts
192.168.200.132 mogu
192.168.200.129 node002
192.168.200.130 node003
关闭Swap分区

kubelet要求必须禁用交换分区,所以kubeadm初始化时回检测swap是否关闭,如果没有关闭会报错,如果不想关闭安装时kubelet命令需要添加–fail-swap-on=false,关闭Swap分区必须在所有节点上执行如下命令:

# 临时关闭,重启恢复
swapoff -a
# 永久关闭,注释swap行
vim /etc/fstab
# /dev/mapper/centos-swap swap                    swap    defaults        0 0
禁用SELinux

所有节点执行如下命令:

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux

然后重启,验证 Swap 是否禁用

reboot
free -h  #输出中的 Swap 部分应该显示为 0B
关闭防火墙

所有节点执行如下命令:

systemctl disable firewalld
systemctl stop firewalld
修改内核参数
modprobe br_netfilter
echo "modprobe br_netfilter" >> /etc/profile
tee /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 重新加载配置
sysctl -p /etc/sysctl.d/k8s.conf
配置集群时钟同步

Centos7默认使用Chrony工具而非NTP进行时间同步,修改硬件时钟为UTC,时区为本地时区,所有节点执行如下修改:

# 硬件时钟设置为UTC
timedatectl set-local-rtc 0
# 设置本地时区,显示本地时间
timedatectl set-timezone Asia/Shanghai
# 手动加载RTC设置
hwclock --systohc
# 验证
timedatectl
配置k8s的Yum源

国外yum源因为网络问题下载比较慢,此处修改为国内aliyun,用于安装k8s各个组件。
设置静态IP方法参考此文档:《CentOS 设置静态 IP 配置》
Centos 7 配置国内yum源参考此文档:《Centos 7 配置国内yum源》

 cat /etc/yum.repos.d/CentOS-Base.repo
#追加以下内容
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
常用包安装
yum install vim bash-completion net-tools gcc -y

三、安装Docker

k8s运行需要容器运行环境,每个节点都需要安装Docker。
Docker安装部署参考此文档:《Docker安装部署及常用命令》

四、安装K8S集群

安装三大组件-kubeadm、kubelet、kubectl
  • kubeadm:用来初始化k8s集群的指令。
  • kubelet:在集群的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与k8s集群通信的命令行工具,查看、创建、更新和删除各种资源。

所有节点都执行以下命令:

# 所有节点都安装
yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9
# 所有节点设置开机启动
systemctl enable kubelet
初始化k8s集群
  • apiserver-advertise-address:apiserver监听地址
  • control-plane-endpoint:控制平面的IP地址或DNS名称
  • image-repository:镜像仓库,此处为国内阿里云镜像仓库加速下载
  • service-cidr:为Service分配的IP地址段
  • pod-network-cidr:为pod分配的IP地址段

只在master节点运行此命令:

将192.168.200.132地址修改为你的master节点地址。

kubeadm init \
--apiserver-advertise-address=192.168.200.132 \
--image-repository  registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=172.20.0.0/16
安装成功界面

在这里插入图片描述
记住以上输出的kubeadm join命令,等下需要用该命令将节点加入集群。

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.200.132:6443 --token 5w7ahu.dy5kcaknlve8aubb \
    --discovery-token-ca-cert-hash sha256:4d0b9177579a64c52215bddc7a059a5ca891668c7ac9e13dc5ae679227abd11a

初始化需要下载多个镜像,可能时间比较久,最终安装的镜像如下
在这里插入图片描述
配置k8s访问用户,在master节点执行以下命令:

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
加入节点

所有从节点Node节点执行如下命令:
此命令来自于刚才安装成功后的控制台输出。

kubeadm join 192.168.200.132:6443 --token 5w7ahu.dy5kcaknlve8aubb \
    --discovery-token-ca-cert-hash sha256:4d0b9177579a64c52215bddc7a059a5ca891668c7ac9e13dc5ae679227abd11a

如果不小心忘记了上述join命令,可以在Master 节点上执行以下命令重新生成 Token:

kubeadm token create --print-join-command
修改角色

master节点执行以下命令标记worker节点,需要将node002/node003按照salve主机名称进行修改

kubectl label node node002 node-role.kubernetes.io/worker=worker
kubectl label node node003 node-role.kubernetes.io/worker=worker

master节点执行查看节点信息

kubectl get nodes
NAME      STATUS     ROLES                  AGE     VERSION
mogu      NotReady   control-plane,master   3h36m   v1.20.9
node002   NotReady   worker                 166m    v1.20.9
node003   NotReady   worker                 166m    v1.20.9
安装Calico网络插件

Calico是一套开源的纯三层的虚拟化网络解决方案,是目前K8s主流的网络方案。
它把每个节点都作为一个虚拟路由器,把Pod当做路由器上一个终端设备为其分配一个IP地址,通过BGP协议生成路由规则,实现不同节点上的Pod网络互通。

Calico系统示意图
在这里插入图片描述
所有节点都需执行以下命令:

  • 下载calico.yaml并保存到本地
mkdir -p /root/calico
cd /root/calico
curl https://docs.projectcalico.org/v3.15/manifests/calico.yaml -O
  • 修改配置calico.yaml中的CALICO_IPV4POOL_CIDR地址,value值为初始化开始时指定的–pod-network-cidr参数值,注意格式对齐
- name: CALICO_IPV4POOL_CIDR
value: "172.20.0.0/16"
  • 验证是否成功
kubectl apply -f calico.yaml
kubectl get pod -A | grep calico
  • 如果启动不成功可能是镜像没下载下来,可执行以下命令进行手动pull(亦或科学上网进行下载),然后重新观察pod状态。
#查看需要下载的calico镜像
grep image calico.yaml
          image: calico/cni:v3.15.5
          image: calico/pod2daemon-flexvol:v3.15.5
          image: calico/node:v3.15.5
          image: calico/kube-controllers:v3.15.5
#拉取对应镜像                    
docker pull calico/cni:v3.15.5
docker pull calico/pod2daemon-flexvol:v3.15.5
docker pull calico/node:v3.15.5
docker pull calico/kube-controllers:v3.15.5

五、测试K8S集群

创建nginx pod

默认会在默认命名空间default中创建一个名称为mynignx的deployment,同时会创建一个名称以myniginx为前缀,叫mynginx-5b686ccd46-kzcv7的Pod。
kubectl create deployment mynginx --image=nginx

# 查看
kubectl get pod,svc

#NAME                           READY   STATUS    RESTARTS   AGE
#pod/mynginx-5b686ccd46-kzcv7   1/1     Running   0          107s
#
#NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
#service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   47h
对外暴露访问

基于第一步创建的deployment再创建一个名叫mynginx的Service,资源类型由–type=ClusterIP修改为–type=NodePort,会在每个Node节点上监听30161端口,用于接收集群外部访问。
kubectl expose deployment mynginx --port=80 --type=NodePort

# 查看
kubectl get pod,svc

#NAME                           READY   STATUS    RESTARTS   AGE
#pod/mynginx-5b686ccd46-kzcv7   1/1     Running   0          3m39s

#NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
#service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        47h
#service/mynginx      NodePort    10.100.242.53   <none>        80:30933/TCP   13s
访问nginx

浏览器输入<任意一个节点IP>:,都可以访问nginx首页表示测试成功。
在这里插入图片描述

六、安装Dashboard

k8s官方提供了一个简单的Dashboard,主要提供工作负载,服务,配置和存储,集群等管理功能。
Dashboard是可视化插件,它可以给用户提供一个可视化的 Web 界面来查看当前集群的各种信息。
用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。

Github:github.com/kubernetes/dashboard

下载recommended.yaml

官方部署dashboard的服务没使用nodeport,将yaml文件下载到本地,在service里添加nodeport。

curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

编辑文件内容,修改type和nodePort(也可以不声明,会自动生成随机端口号)

vim recommended.yaml

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30000
  selector:
    k8s-app: kubernetes-dashboard

在这里插入图片描述

应用recommended.yaml文件配置
kubectl create -f recommended.yaml

查看kubernetes-dashboard的service状态

kubectl get svc -n kubernetes-dashboard

在这里插入图片描述
在浏览器输入我们的这台机器的ip+端口,进入登录页面
在这里插入图片描述
注意使用https://访问,如果浏览器弹出高级按钮,点击展开高级按钮显示报错,仍然无法访问dashboard上面的页面,那么需要配置一下谷歌浏览器:

--test-type --ignore-certificate-errors

在这里插入图片描述

创建访问账号
vim dashboard-token.yaml

内容如下:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
 
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

配置应用

kubectl apply -f dashboard-token.yaml

获取token

kubectl get secret -n kubernetes-dashboard
NAME                               TYPE                                  DATA   AGE
admin-user-token-tmzgr             kubernetes.io/service-account-token   3      19s
default-token-8sh9t                kubernetes.io/service-account-token   3      37m
kubernetes-dashboard-certs         Opaque                                0      37m
kubernetes-dashboard-csrf          Opaque                                1      37m
kubernetes-dashboard-key-holder    Opaque                                2      37m
kubernetes-dashboard-token-dqfst   kubernetes.io/service-account-token   3      37m

查看名为admin-user-token-tmzgr的secret

kubectl describe secret admin-user-token-tmzgr -n kubernetes-dashboard
Name:         admin-user-token-tmzgr
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: 5ef603d5-2d51-4feb-baf3-bbe408bbb9bc

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IkVZSVNYSXZXWmlTZVQ3ZEQta25sRHZ5Z0xvbEZTOUk4VkduSXdwYXhaYm8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXRtemdyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI1ZWY2MDNkNS0yZDUxLTRmZWItYmFmMy1iYmU0MDhiYmI5YmMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.qf226Ri5-PEH-NTiHjFreC1pRL34MdekMnLVp3mN33aKvifYevF7T6wTyJ-n5UyFYSJN-7FCFYPrWa9A4niGPGAUpdoPvoyEoDpHBruSj9hpSiKsfl2sRm8oXwydbSxJlAKsAB9t42peDQgw-5vghiLcdeApnBuPsFxJtG_9DDBNksp5JpFvnNTtmxbzh0A3sE8BnzaoQHGAFMGMEJyL0FRFGxxOxr_A_XkY6ZHjBt5cUnQ7A6yrHjGcE68eo4Rgxaz3iKhZlHI4W8_1WNv4tpNLBordw1Pj7Ww6fv7JAePLowleN9YfYfX6ctrn93SFzmZs2ytJYpBU-ZTDdnEnaQ
登录界面

输入上面的token,进入dashboard首页
在这里插入图片描述

七、部署过程可能出现的报错

主节点初始化报错

[root@localhost yum.repos.d]# kubeadm init
–apiserver-advertise-address=192.168.200.132
–control-plane-endpoint=cluster-endpoint
–image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
–kubernetes-version v1.20.9
–service-cidr=10.96.0.0/12
–pod-network-cidr=172.20.0.0/16
[init] Using Kubernetes version: v1.20.9
[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”. Please follow the guide at https://kubernetes.io/docs/setup/cri/
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 26.1.4. Latest validated version: 19.03
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR Swap]: running with swap on is not supported. Please disable swap
[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
在这里插入图片描述

处理方法
Docker 的 cgroup 驱动是 cgroupfs,而 Kubernetes 推荐使用 systemd。

Kubernetes 推荐使用 systemd 作为容器运行时的 cgroup 驱动,而你的系统当前使用的是 cgroupfs。你可以通过以下步骤将 Docker 配置为使用 systemd 作为 cgroup 驱动。

步骤 1:编辑 Docker 配置文件
打开 /etc/docker/daemon.json 文件,如果不存在,则创建它:

sudo vi /etc/docker/daemon.json

将以下内容添加到该文件中:

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

步骤 2:重启 Docker 服务
修改配置后,重新启动 Docker 服务:

sudo systemctl restart docker

步骤 3:验证 cgroup 驱动
运行以下命令来验证 Docker 是否已成功切换为 systemd 驱动:

docker info | grep -i cgroup

你应该看到类似下面的输出:

Cgroup Driver: systemd
从节点join报错

在这里插入图片描述
处理办法:
编辑 /etc/sysctl.conf 文件,将 net.ipv4.ip_forward=1 这一行添加或取消注释:

sudo vi /etc/sysctl.conf

找到以下行:

#net.ipv4.ip_forward = 1

取消注释并修改为:

net.ipv4.ip_forward = 1

然后执行以下命令使修改生效:

sudo sysctl -p
主节点或从节点执行kubectl get nodes报错
[root@centos02 kubernetes]# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?

解决办法
步骤1:查看各节点是否有"/etc/kubernetes/admin.conf"文件。如果没有则从主节点复制到本机环境

scp /etc/kubernetes/admin.conf root@192.168.200.129:/etc/kubernetes/

步骤2:配置环境变量并刷新

vim /etc/profile
export KUBECONFIG=/etc/kubernetes/admin.conf
#保存退出并执行以下代码使用环境变量生效
source /etc/profile
执行kubectl get cs 发现controller-manager和scheduler有报错

在这里插入图片描述
解决办法

出现这种情况是kube-controller-manager.yaml和kube-scheduler.yaml设置的默认端口是0,在文件中注释掉就可以了。(每台master节点都要执行操作)

步骤1:修改kube-scheduler.yaml文件

 vim  /etc/kubernetes/manifests/kube-scheduler.yaml

注释掉端口号
在这里插入图片描述
步骤2:修改kube-controller-manager.yaml文件

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

注释掉端口号
在这里插入图片描述
步骤3:重启 master 的 kubele

systemctl restart kubelet.service

再次查看状态

kubectl get cs

在这里插入图片描述

Calico部署过程报错

报错1:calico-node-zxr7x 0/1 CrashLoopBackOff 1 8s 192.168.200.129 node002

[root@node002 ~]# kubectl get pods -n kube-system -o wide NAME
READY STATUS RESTARTS AGE IP NODE
NOMINATED NODE READINESS GATES
calico-kube-controllers-bc4f7c685-hn7d6 0/1 ContainerCreating
0 55m node002
calico-node-5s2hq 0/1 Running
0 25h 192.168.200.130 node003
calico-node-t96xv 0/1 Running
1 25h 192.168.200.132 mogu
calico-node-zxr7x 0/1 CrashLoopBackOff
1 8s 192.168.200.129 node002
coredns-54d67798b7-k5ps7 1/1 Running
1 29h 172.20.80.68 mogu
coredns-54d67798b7-mkqtc 1/1 Running
1 29h 172.20.80.69 mogu
etcd-mogu 1/1 Running
2 29h 192.168.200.132 mogu
kube-apiserver-mogu 1/1 Running
2 29h 192.168.200.132 mogu
kube-controller-manager-mogu 1/1 Running
2 29h 192.168.200.132 mogu
kube-proxy-mf8qh 1/1 Running
2 28h 192.168.200.129 node002
kube-proxy-mx8tj 1/1 Running
2 29h 192.168.200.132 mogu
kube-proxy-q8lts 1/1 Running
10 28h 192.168.200.130 node003
kube-scheduler-mogu 1/1 Running
2 29h 192.168.200.132 mogu
[root@node002 ~]# kube logs calico-node-zxr7x -n kube-system
-bash: kube: 未找到命令 [root@node002 ~]# kubectl logs calico-node-zxr7x -n kube-system 2024-12-12 08:16:08.117 [INFO][10] startup/startup.go 356:
Early log level set to info 2024-12-12 08:16:08.117 [INFO][10]
startup/startup.go 372: Using NODENAME environment for node name
2024-12-12 08:16:08.117 [INFO][10] startup/startup.go 384: Determined
node name: node002 2024-12-12 08:16:08.120 [INFO][10]
startup/startup.go 416: Checking datastore connection 2024-12-12
08:16:08.142 [INFO][10] startup/startup.go 440: Datastore connection
verified 2024-12-12 08:16:08.142 [INFO][10] startup/startup.go 107:
Datastore is ready 2024-12-12 08:16:08.170 [INFO][10]
startup/startup.go 481: Initialize BGP data 2024-12-12 08:16:08.172
[INFO][10] startup/startup.go 720: Using autodetected IPv4 address on
interface br-00f09bbc3c59: 172.18.0.1/16 2024-12-12 08:16:08.172
[INFO][10] startup/startup.go 551: Node IPv4 changed, will check for
conflicts 2024-12-12 08:16:08.185 [WARNING][10] startup/startup.go
1066: Calico node ‘mogu’ is already using the IPv4 address 172.18.0.1.
2024-12-12 08:16:08.185 [INFO][10] startup/startup.go 320: Clearing
out-of-date IPv4 address from this node IP=“172.18.0.1/16” 2024-12-12
08:16:08.197 [WARNING][10] startup/startup.go 1270: Terminating

问题原因:
发现报错描述172.18.0.1/16地址已经被mogu节点占用了,排查发现是部署在mogu节点的harbo容器启动时创建了bridge网络生成的网卡把172.18.0.1/16网段占用了,导致calico启动失败。

解决办法:
停止mogu节点上的harbor容器,重新启动harbor容器会重新生成新的网段bridge网络。

报错2:calico启动后发现其中一个po虽然是Ready状态,但status为0/1

calico-node-t96xv                         0/1     Running   1          26h     192.168.200.132   mogu      <none>           <none>

通过查看日志发现报错如下:

Warning Unhealthy 7m48s kubelet Readiness probe failed:2024-12-12 09:01:21.036 [INFO][141] confd/health.go 180: Number of node(s) with BGP peering established = 0
calico/node is not ready:BIRD is not ready: BGP not established with192.168.200.129,192.168.200.130 Warning Unhealthy 7m38s kubelet Readiness probe failed:2024-12-12 09:01:31.005 [INFO][178]
confd/health.go 180: Number of node(s) with BGP peering established = 0

问题原因:
需调整calicao网络插件的网卡发现机制,修改IP_AUTODETECTION_METHOD对应的value值。

官方提供的yaml文件中,ip识别策略(IPDETECTMETHOD)没有配置,即默认为first-found,这会导致一个网络异常的ip作为nodeIP被注册,从而影响node-to-nodemesh。我们可以修改成can-reach或者interface的策略,尝试连接某一个Ready的node的IP,以此选择出正确的IP。

修改配置文件:

kubectl edit daemonset calico-node -n kube-system

修改前效果:
在这里插入图片描述
添加如下2行代码:

 - name: IP_AUTODETECTION_METHOD
   value: interface=ens*

效果如下:
在这里插入图片描述
再次查看pods状态正常如图:
在这里插入图片描述

### 安装和配置 Kubernetes 集群 #### 准备环境 为了确保顺利安装 Kubernetes,在 CentOS 上需先更新系统并设置必要的内核参数。建议关闭防火墙和服务隔离工具 SELinux,以减少网络策略冲突。 #### 添加 Kubernetes YUM 源 由于默认的 CentOS 软件源不包含最新的稳定版 Kubernetes 组件,因此需要添加阿里云或官方 K8S 的 yum repo 来获取最新版本软件包。 ```bash cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kube* EOF ``` #### 安装必要组件 执行命令来安装 `kubeadm`、`kubelet` 和 `kubectl` 这三个核心组件[^3]: ```bash yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y ``` #### 初始化 Master 节点 初始化主节点前确认已禁用 swap 并启动容器运行时服务 Docker 或 containerd。接着使用如下指令初始化 master 节点: ```bash sudo kubeadm init --pod-network-cidr=10.244.0.0/16 ``` 此过程会生成加入 worker 节点所需的 token 及 CA 证书哈希值,请妥善保存输出信息中的 join 命令用于后续扩展集群规模。 #### 设置 kubectl 认证 为了让普通用户能够操作 API server,按照提示完成认证文件复制到家目录下,并创建相应的软链接以便于管理 Pod 策略等资源对象: ```bash mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` #### 安装 CNI 插件 Kubernetes 默认并不自带任何网络插件,所以还需要额外部署 Flannel 或 Calico 类型的 Container Network Interface (CNI),这里推荐采用 flannel 方案简化组网逻辑: ```bash kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` #### 加入 Worker 节点 对于每台希望作为计算单元参与调度的工作站而言,则只需在其本地终端输入之前记录下来的那条特定格式化的 join command 即可自动注册成为正式成员[^2]。 #### 验证集群状态 最后可以通过查询所有命名空间下的 pod 列表来检验整个集群是否处于健康运转之中[^1]: ```bash kubectl get pods --all-namespaces ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值