一、基本信息介绍

kubernetes: 1.27.4
系统:centos7
etcd:3.5.7
containerd:1.6.20
runc:1.1.5
建议内核升级到5.10

本次安装就只有一个master和两个个node节点
192.168.2.111 k8s-n1
192.168.2.112 k8s-n2
192.168.2.113 k8s-n3

其中 k8s-n1 是master节点

网络插件:calico 3.26.0 (虽然目前是最新版本,官方文档没显示支持kubernetes1.27,但测试安装可以使用)

二、linux环境调整

为了简单直接root用户登录

1. 设置静态ip,k8s需要固定ip

vi /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=ens160
UUID=5a26dced-6a7f-405e-bb52-abc83085f30e
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.2.111
NETMASK=255.255.255.0
GATEWAY=192.168.2.2
DNS1=192.168.2.2

2. 设置主机名

hostnamectl set-hostname k8s-n1

3. 本地dns解析

cat >> /etc/hosts << EOF  
192.168.2.111 k8s-n1
192.168.2.112 k8s-n2
192.168.2.113 k8s-n3
EOF

4.关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

5.关闭selinux

sed -i 's/enforcing/0/' /etc/selinux/config
setenforce 0

6、关闭swap

sed -ri 's/.*swap.*/#&/' /etc/fstab 
swapoff -a 

7、添加内核模块和开启ipv4转发、网桥参数

(1)加载内核模块:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter
(2)添加内核参数

#追加以下内容
cat >> /etc/sysctl.conf << EOF 
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system  #生效

6、时间同步

yum install ntp -y
ntpdate ntp2.aliyun.com
 

三、安装 containerd

kubernetes1.20版本后不在直接由docker daemon处理镜像操作,转为直接与containerd服务交互后,去调用runc去处理镜像操作

1.yum源安装

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

yum makecache

2.安装containerd

#我安装的版本是 containerd.io.aarch64 0:1.6.22-3.1.el7
yum install containerd.io -y

四、安装kubectl、kubeadm、kubelet

Kubelet:

运行在cluster所有节点上,负责启动POD和容器

Kubeadm:

用于初始化cluster的一个工具

Kubectl:

kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件

直接安装是用的谷歌的源,我们更换为aliyun的源

# x86 架构cpu
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

# 苹果m1芯片cup
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
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

 

yum makecache
yum install kubelet  kubeadm  kubectl  -y


如果选错了源,导致yum源缓存了错误的包信息,可以 rm -rf /var/cache/yum/*删除所有的源缓存,重新执行yum makecache

五、修改containerd配置

本步骤node节点也要同样的修改

cp /etc/containerd/config.toml /etc/containerd/config.toml.bak  #备份源文件

containerd config default > /etc/containerd/config.toml

vi /etc/containerd/config.toml

找到SystemdCgroup = false这一行,将false改为true。

找到包含sandbox_image这一行,将地址改为“registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9”

六、 启动containerd和 kubelet

systemctl enable containerd --now
systemctl enable kubelet --now

如果之前已经启动了 containerd 用下面的命令重启
systemctl restart containerd#重启生效修改后的配置

crictl containerd管理工具配置

执行如下命令:

crictl images list

如果crictl执行出现类似:

WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead. 
ERRO[0002] connect endpoint 'unix:///var/run/dockershim.sock', make sure you are running as root and the endpoint has been started: context deadline exceeded 

这时需要配置crictl,执行如下命令:

cat <<EOF> /etc/crictl.yaml 
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

七、启动集群

1. 提前拉取主节点需要的镜像

国内镜像下载比较慢,我们可以提前拉取主节点,需要的镜像。这样启动的主节点的时候,就不需要再重新拉取

 #查看会拉取的镜像清单
 kubeadm config images list
 #手动提前拉取镜像,可以看到拉取过程及拉取情况
 kubeadm config images pull
Your Kubernetes control-plane has initialized successfully!
如果拉取不下来,可以去阿里云手动拉取
# 外网下载不下来,用阿里云下载
crictl pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.27.4
crictl pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.27.4
crictl pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.27.4
crictl pull registry.aliyuncs.com/google_containers/kube-proxy:v1.27.4
crictl pull registry.aliyuncs.com/google_containers/pause:3.9
crictl pull registry.aliyuncs.com/google_containers/etcd:3.5.7-0
crictl pull registry.aliyuncs.com/google_containers/coredns:v1.10.1

不用担心名称不同,他们的镜像id是一样的,会被k8s识别到

注意版本号要和 kubeadm config images list 列出的一致

2. 启动主节点

1)初始化

kubeadm init \
--apiserver-advertise-address=192.168.2.111 \
--control-plane-endpoint=k8s-n1 \
--image-repository  registry.aliyuncs.com/google_containers \
--kubernetes-version v1.27.4  \
--service-cidr=10.10.0.0/12  \
--pod-network-cidr=10.254.0.0/16

找个地方记录输出中的下面这几行

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join k8s-n1:6443 --token nwmhrt.0kty45odiblhi8i8 \
	--discovery-token-ca-cert-hash sha256:85a9863a8444c4800a3dcf647d0cf57147c6eca5037d9fa730c004f25b635ef8 \
	--control-plane 

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

kubeadm join k8s-n1:6443 --token nwmhrt.0kty45odiblhi8i8 \
	--discovery-token-ca-cert-hash sha256:85a9863a8444c4800a3dcf647d0cf57147c6eca5037d9fa730c004f25b635ef8

其中下面这一行,用于向集群中添加主节点

kubeadm join k8s-n1:6443 --token nwmhrt.0kty45odiblhi8i8 \
	--discovery-token-ca-cert-hash sha256:85a9863a8444c4800a3dcf647d0cf57147c6eca5037d9fa730c004f25b635ef8 \
	--control-plane 

下面这一行,用于向集群中添加从节点

kubeadm join k8s-n1:6443 --token nwmhrt.0kty45odiblhi8i8 \
	--discovery-token-ca-cert-hash sha256:85a9863a8444c4800a3dcf647d0cf57147c6eca5037d9fa730c004f25b635ef8
没有记录到添加节点的命令,也没有关系可以用如下命令重新获得。

kubeadm token create --print-join-command

3.检查初始化情况

kubectl get pod -n kube-system

如果出现:couldn’t get current server API group list: Get “http://localhost:8080/api?timeout=32s”: dial tcp 127.0.0.1:8080: connect: connection refused

需要执行下面操作

注意一定要在 kubeadm init 执行完之后,/etc/kubernetes/admin.conf才会产生

方法1:

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

方法2:

sudo vim /etc/profile
export KUBECONFIG=/etc/kubernetes/admin.conf
source /etc/profile

在这里插入图片描述

4 添加node节点

在node节点上执行,上面保存的子节点加入命令

kubeadm join k8s-n1:6443 --token nwmhrt.0kty45odiblhi8i8 \
    --discovery-token-ca-cert-hash sha256:85a9863a8444c4800a3dcf647d0cf57147c6eca5037d9fa730c004f25b635ef8

03主节点上执行如下命令,查看节点加入情况

kubectl get nodes

在这里插入图片描述

八.配置集群网络

大家可以注意到,此时的node节点,都是处于NotReady状态,这是因为,我们还没有为集群安装,网络管理插件(也是一个容器)

网络管理插件主流的目前有两种flannel和calico,这里只演示calico。

1.下载calico的压缩包到主节点

以下都是在主节点操作

(1)到https://kgithub.com/projectcalico/calico/releases下去下载release-v3.26.0.tgz
我是直接下载的最新版本

(2) 解压缩

tar xvf elease-v3.26.0.tgz 

(3) 安装镜像

注意这一步不是必须的,只是为了加速部署

# 进入镜像目录
cd elease-v3.26.0/images/
#查看当前kubernetes环境下有哪些镜像
crictl images list
#查看有哪些命名空间,默认导入镜像会到default这个命名空间
ctr namespace list

#安装镜像需要指定导入的命名空间为k8s.io,如果不在image目录下,镜像要写绝对路径,苹果的m1芯片下,往往不会成功,可以跳过这个步骤
ctr --namespace=k8s.io images import calico-kube-controllers.tar
ctr --namespace=k8s.io images import calico-node.tar
ctr --namespace=k8s.io images import calico-cni.tar


crictl image list

查看导入的镜像,见下图
在这里插入图片描述

2.直接用yaml文件创建calico的pod。

# 进入镜像目录
cd elease-v3.26.0/manifests/
# 加载calico的pod到k8s
kubectl apply -f calico.yaml

如果本地没有calico的pod镜像,
k8s会自动下载镜像,只是时间会长一点

查看pod部署情况,看是否都已经,部署ok

kubectl get pods -n kube-system
在这里插入图片描述

此时查看节点情况,会发现节点都已经ready了

kubectl get nodes

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐