曾一度羡慕的眼神看运维各种吹牛*k8s的种种,今天自己试下搭建k8s,随便找了台i5+16G+256G的机器,安装vmware16,用虚拟机搭建k8s环境

硬件环境

每台机器分配2*2个CPU

每台机器分配4G内存

每台机器分配20G空间(草率了,最终在master节点进行了硬盘扩容,建议master不低于40G)

网络:桥接网络,直接连接物理网络

准备工作

1:兼容的 Linux 的主机或虚拟机。本文Kubernetes 项目基于centos7系统,内核5.4。

2:每台机器至少2 个 CPU、 2 GB内存(网上其他大佬总结经验之谈)

3:集群中所有机器之间的完整网络连接(公共或专用网络都可以,本文为验证环境,内网独立IP)。

4:机器上的部分端口是需要开放的(本环境为验证操作,关闭防火墙 systemctl stop firewalld);

5:交换Swap分区禁用。必须禁用Swap才能使 kubelet 正常工作(swapoff -a)。

6:所有机器的机器名需独立( hostnamectl set-hostname master01   设置名称为master01)

最终我的服务器配置

192.168.0.250  master00   2核*2个cpu + 4G 内存

192.168.0.251  master01 2核*2个cpu + 4G 内存

192.168.0.252  node01 2核*2个cpu + 4G 内存

192.168.0.253  node02 2核*2个cpu + 4G 内存

192.168.0.254  master02 2核*2个cpu + 4G 内存 (开始并未计划加入该节点,后续为了记录本博文部署该节点)

需要开放的端口

协议

方向

端口范围

目的

使用者

TCP

入站

6443

Kubernetes API 服务器

全部

TCP

入站

2379-2380

etcd 服务器客户端 API

kube-apiserver, etcd

TCP

入站

10250

Kubelet API

自我,控制平面

TCP

入站

10259

kube-调度器

自己

TCP

入站

10257

kube-控制器-管理器

自己

虽然 etcd 端口包含在控制平面部分,但您也可以在外部或自定义端口上托管自己的 etcd 集群

协议

方向

端口范围

目的

使用者

TCP

入站

10250

Kubelet API

自我,控制平面

TCP

入站

30000-32767

NodePort端口范围

全部

可以覆盖所有默认端口号。当使用自定义端口时,这些端口需要打开而不是此处提到的默认值。

一个常见的例子是 API 服务器端口,有时会切换到 443。或者,默认端口保持原样,API 服务器放在负载均衡器后面,该负载均衡器监听 443 并将请求路由到默认端口上的 API 服务器。

一:修改每台机器的hosts文件

# vim /etc/hosts
192.168.0.250  master00
192.168.0.251  master01
192.168.0.252  node01
192.168.0.253  node02
192.168.0.254  master02

二:关闭swap分区以及防火墙

[root@master02 ~]# swapoff -a
[root@master02 ~]# echo "vm.swappiness = 0" >> /etc/sysctl.conf
[root@master02 ~]# vim /etc/fstab# /dev/mapper/rl-swap     none                    swap    defaults        0 0 
[root@master02 ~]# systemctl stop firewalld && systemctl disable firewalld # 关闭并且禁用防火墙

所有机器均操作完成后,均重启reboot

三:Containerd的基础安装和操作,此处正式开始安装环境

本文档后续基于Containerd+RockyLinux+Kubeadmin部署Kubernetes1.25.2版本的环境。

containerd

Docker

CRI-O

需要注意的是,根据Kubernetes官方给出的公告。Kubernetes 1.20x版本将会废弃对Docker的支持(https://kubernetes.io/docs/setup/)。

1:国内因为墙的原因无法访问k8s.io或者访问极慢,本文通过通过阿里云镜像源安装

[root@master02 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@master02 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
[root@master02 ~]# yum -y install containerd.io

[root@master02 ~]# containerd -v 
containerd containerd.io 1.6.8 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6

 

 

 

2:生成containerd的配置文件 

 台主机全部执行此操作

默认情况下在/etc/containerd/config.toml已经有这个文件了,但是里面是一些简短的配置.

[root@master02 ~]# mkdir - /etc/containerd/
[root@master02 ~]# containerd config default | tee /etc/containerd/config.toml # 生成contained的默认配置

3:修改sandbox_img

台主机全部执行此操作由于部分用户无法进入k8s.gcr.io资源地址,需要对此地址进行替换.

[root@master02 ~]# vim /etc/containerd/config.toml
sandbox_image = "k8s.gcr.io/pause:3.6"  # 找到此选项并且修改为: registry.aliyuncs.com/google_containers/pause:3.6
SystemdCgroup = true # Cgroup改为tre
runtime_type = "io.containerd.runtime.v1.linux" # 修改为io.containerd.runtime.v1.linux

4:启动containerd

台主机全部执行此操作(保证Active: active(running)的状态即可

[root@master02 ~]# vim /etc/containerd/config.toml


Press ENTER or type command to continue
[root@master02 ~]# systemctl restart containerd
[root@master02 ~]# 
[root@master02 ~]# systemctl enable containerd
Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /usr/lib/systemd/system/containerd.service.
[root@master02 ~]# 
[root@master02 ~]# systemctl status containerd
● containerd.service - containerd container runtime
   Loaded: loaded (/usr/lib/systemd/system/containerd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-10-10 02:25:06 +0330; 18s ago
     Docs: https://containerd.io
 Main PID: 1961 (containerd)
   CGroup: /system.slice/containerd.service
           └─1961 /usr/bin/containerd

Oct 10 02:25:06 master02 containerd[1961]: time="2022-10-10T02:25:06.823804392+03:30" level=info msg="Start subscribing containerd event"
Oct 10 02:25:06 master02 containerd[1961]: time="2022-10-10T02:25:06.823850033+03:30" level=info msg="Start recovering state"
Oct 10 02:25:06 master02 containerd[1961]: time="2022-10-10T02:25:06.823902935+03:30" level=info msg="Start event monitor"
Oct 10 02:25:06 master02 containerd[1961]: time="2022-10-10T02:25:06.823906795+03:30" level=info msg=serving... address=/run/containerd/containerd.sock.ttrpc
Oct 10 02:25:06 master02 containerd[1961]: time="2022-10-10T02:25:06.824004720+03:30" level=info msg=serving... address=/run/containerd/containerd.sock
Oct 10 02:25:06 master02 containerd[1961]: time="2022-10-10T02:25:06.823933756+03:30" level=info msg="Start snapshots syncer"
Oct 10 02:25:06 master02 containerd[1961]: time="2022-10-10T02:25:06.824144920+03:30" level=info msg="Start cni network conf syncer for default"
Oct 10 02:25:06 master02 containerd[1961]: time="2022-10-10T02:25:06.824157462+03:30" level=info msg="Start streaming server"
Oct 10 02:25:06 master02 containerd[1961]: time="2022-10-10T02:25:06.824251378+03:30" level=info msg="containerd successfully booted in 0.025993s"
Oct 10 02:25:06 master02 systemd[1]: Started containerd container runtime.
[root@master02 ~]#

5:配置IP转发

cat <<EOF | tee /etc/modules-load.d/kubernetes1.24.conf
overlay
br_netfilter
EOF
cat <<EOF | tee /etc/sysctl.d/kubernetes1.24-forsys.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

[root@master02 ~]# modprobe br_netfilter
[root@master02 ~]# 
[root@master02 ~]# sysctl --system

6:安装 Kubernetes (五台全部安装)

由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl 安装

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

[root@master02 ~]# yum install -y --nogpgcheck kubelet kubeadm kubectl

 

 可以通过yum --showduplicates list kubelet查看当前仓库中可用的版本

7:安装命令提示(安装后可以使用tab进行快捷提示)

[root@master02 ~]# yum -y install bash-completion
[root@master02 ~]# source <(kubeadm completion bash) && source <(kubectl completion bash)

 

 

如果要永久生效,则修改.bashrc

 

8:启动kubelet

[root@master02 ~]# systemctl enable kubelet
[root@master02 ~]# systemctl  start kubelet

 

9:初始化集群配置信息

[root@master02 ~]# kubeadm config print init-defaults > init.yaml 
[root@master02 ~]# vim init.yaml #修改如截图

 

修改完后执行初始化

# 初始化等待镜像Pull完成
[root@master02 ~]# kubeadm init --config=init.yaml 

 初始化完成后如截图:

10:创建admin配置目录

[root@master02 ~]# mkdir -p $HOME/.kube
[root@master02 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master02 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

 11:创建集群网络

因为flannel不支持网络隔离以及其他策略所以使用calico网络

[root@master02 ~]# curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O

 

[root@master02 ~]# curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O

[root@master02 ~]# vim calico.yaml
- name: CALICO_IPV4POOL_CIDR # 修改CIDR为Kubernetes的子网地址,即初始化集群的serviceSubnet
    value: "10.96.0.0/12"

12:创建calico网络

[root@master02 ~]# kubectl apply -f calico.yaml 

13:加入集群

如果初始化成功会出现

Your Kubernetes control-plane has initialized successfully!

 节点执行加入集群命令:

[root@master02 ~]# kubeadm join 192.168.0.250:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:99c57b0e86024ed9a41a227e9cba03bc464024cf9ca50287ff80bfe4801748a1

注意如若出现,如截图:

 

执行重置操作,并重新加入集群即可:
[root@master02 ~]# kubeadm reset

14:Master验证加入k8s集群

从master上查看节点是否已经全部Ready,

[root@master00 .kube]# kubectl get nodes

 

查看master节点的Pod是否全部启动

 

注意:

1:遇到token过期

默认情况下,该token只有24小时,如果token值过期的话需要重新生成,查看当前master集群的token列表

[root@master00 .kube]# kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
qyb9cq.i985wud0yuhhmxal   20h         2022-10-11T13:32:57Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token

 

重新生成一份token

[root@master00 .kube]# kubeadm token create

 

上述一套k8s集群基础部署完成,其中其他节点最先部署完成,本文执行的命令基于最后新加入的0.254机器,机器名master02.

在学习过程中遇到部分问题偶然遇上可供参观大佬的博文,在此十分感谢大佬,链接:https://zhuanlan.zhihu.com/p/565029907

Logo

开源、云原生的融合云平台

更多推荐