曾一度羡慕的眼神看运维各种吹牛*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
五台主机全部执行此操作(保证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 <
6:安装 Kubernetes (五台全部安装)
由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl 安装
cat < /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 system:bootstrappers:kubeadm:default-node-token
重新生成一份token
[root@master00 .kube]# kubeadm token create
上述一套k8s集群基础部署完成,其中其他节点最先部署完成,本文执行的命令基于最后新加入的0.254机器,机器名master02.
在学习过程中遇到部分问题偶然遇上可供参观大佬的博文,在此十分感谢大佬,链接:https://zhuanlan.zhihu.com/p/565029907