一、前期准备

我们准备搭建一个一主两从的集群,一共需要三台服务器,服务器配置选用2核4G的机器,采用docker的方式部署K8s集群,k8s选用1.28的版本。

主机名称 IP地址
k8s-master 192.168.127.150
k8s-node-01 192.168.127.151
k8s-node-02 192.168.127.152
1.1 配置hosts解析和免密钥
# 所有节点都执行
[root@k8s-all ~]# cat >> /etc/hosts << EOF
192.168.127.150 k8s-master
192.168.127.151 k8s-node-01
192.168.127.152 k8s-node-02
EOF

# 所有节点都执行
[root@k8s-all ~]# scp /etc/hosts k8s-node-01:/etc/
[root@k8s-all ~]# scp /etc/hosts k8s-node-02:/etc/

#master节点执行可以免密钥访问其他节点
[root@k8s-master ~]# ssh-keygen -f ~/.ssh/id_rsa -N '' -q
[root@k8s-master ~]# ssh-copy-id k8s-node-01
ssh-copy-id k8s-node-01
1.2 配置NTP时间服务

master节点执行

[root@k8s-master-01 ~]# sed -i '3,6 s/^/# /' /etc/chrony.conf
[root@k8s-master-01 ~]# sed -i '6 a server ntp.aliyun.com iburst' /etc/chrony.conf
[root@k8s-master-01 ~]# systemctl restart chronyd.service
[root@k8s-master-01 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2   6    17     1   +178us[+1281us] +/-   29ms

node 1节点执行

[root@K8s-node-01 etc]# systemctl stop firewalld
[root@K8s-node-01 etc]# sed -i '3,6 s/^/# /' /etc/chrony.conf
[root@K8s-node-01 etc]# sed -i '6 a server ntp.aliyun.com iburst' /etc/chrony.conf
[root@K8s-node-01 etc]# systemctl restart chronyd.service
[root@K8s-node-01 etc]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2   6    17     2   -985us[-2325us] +/-   38ms

node2节点执行

[root@K8s-node-02 etc]# systemctl stop firewalld
[root@K8s-node-02 etc]# sed -i '3,6 s/^/# /' /etc/chrony.conf
[root@K8s-node-02 etc]# sed -i '6 a server ntp.aliyun.com iburst' /etc/chrony.conf
[root@K8s-node-02 etc]# systemctl restart chronyd.service
[root@K8s-node-02 etc]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2   6    17     0   -886us[-5672us] +/-   36ms
1.3 禁用Swap交换分区(所有节点执行)
[root@k8s-all ~]# sed -i 's/.*swap.*/# &/' /etc/fstab
1.4 升级操作系统内核(所有节点执行)
[root@k8s-all ~]# wget -c http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-ml-6.0.3-1.el7.elrepo.x86_64.rpm
[root@k8s-all ~]# wget -c http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-ml-devel-6.0.3-1.el7.elrepo.x86_64.rpm

安装并设置启动顺序

[root@k8s-all ~]# rpm -ivh kernel-ml-6.0.3-1.el7.elrepo.x86_64.rpm
[root@k8s-all ~]# rpm -ivh kernel-ml-devel-6.0.3-1.el7.elrepo.x86_64.rpm
[root@k8s-all ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (6.0.3-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (1.10.0-1160.119.1.el7.x86_64) 7 (Core)
CentOS Linux (1.10.0-1160.71.1.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-35f6b014eff0419881bbf71f1d9d4943) 7 (Core)
[root@k8s-all ~]# grub2-set-default 0

重启生效

[root@k8s-all ~]# reboot
[root@k8s-all ~]# uname -r
6.0.3-1.el7.elrepo.x86_64
1.5 开启内核路由转发(所有节点执行)
[root@K8s-all ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@K8s-all ~]# modprobe br_netfilter
[root@k8s-all ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf 
[root@k8s-all ~]# sysctl -p
net.ipv4.ip_forward = 1
1.6 添加网桥过滤及内核转发配置文件(所有节点执行)
[root@K8s-all ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
EOF
[root@K8s-all ~]# modprobe br-netfilter
[root@K8s-all ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
1.7 开启IPVS(所有节点执行)
[root@K8s-all ~]# yum install ipset ipvsadm -y
[root@K8s-all ~]# cat >> /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash

ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_vip ip_vs_sed ip_vs_ftp nf_conntrack"

for kernel_module in $ipvs_modules; 
do
        /sbin/modinfo -F filename $kernel_module >/dev/null 2>&1
        if [ $? -eq 0 ]; then
                /sbin/modprobe $kernel_module
        fi
done

chmod 755 /etc/sysconfig/modules/ipvs.modules
EOF

[root@K8s-all ~]# bash /etc/sysconfig/modules/ipvs.modules
1.8 配置国内镜像源(所有节点执行)
[root@K8s-all ~]# cat >> /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
1.9 安装软件包(所有节点执行)
[root@K8s-all ~]# sudo yum install -y kubelet-1.28.2-0 kubeadm-1.28.2-0 kubectl-1.28.2-0
[root@k8s-all ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"28", GitVersion:"v1.28.2", GitCommit:"89a4ea3e1e4ddd7f7572286090359983e0387b2f", GitTreeState:"clean", BuildDate:"2023-09-13T09:34:32Z", GoVersion:"go1.20.8", Compiler:"gc", Platform:"linux/amd64"}

#为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,修改如下文件内容
[root@K8s-all ~]# cat <<EOF > /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

#命令用于确保 Kubelet 服务在每次系统启动时自动启动,并立即启动服务,以便在当前会话中也可以使用该服务。
#启动服务:sudo systemctl start kubelet.service 可以手动启动服务。
# 停止服务:sudo systemctl stop kubelet.service 可以手动停止服务。
# 查看状态:sudo systemctl status kubelet.service 可以查看服务的当前状态。

[root@K8s-all ~]# systemctl enable kubelet.service --now
1.10 kubectl命令自动补全(所有节点执行)
[root@K8s-all ~]# yum install -y bash-completion
[root@K8s-all ~]# source /usr/share/bash-completion/bash_completion
[root@K8s-all ~]# source <(kubectl completion bash)
[root@K8s-all ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

二、Docker方式部署K8s集群

2.1 Docker安装部署(所有节点执行)
[root@K8s-all ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
[root@K8s-all ~]# sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
[root@K8s-all ~]# sed -i 's/$releasever/7Server/g' /etc/yum.repos.d/docker-ce.repo
2.2安装Docker-ce(所有节点执行)
[root@K8s-all ~]# sudo yum install -y docker-ce-20.10.21 docker-ce-cli-20.10.21 containerd.io
2.3 安装cri-dockererd插件(所有节点执行)
[root@k8s-all ~]# wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el7.x86_64.rpm
[root@k8s-all ~]# yum install cri-dockerd-0.3.1-3.el7.x86_64.rpm -y
[root@k8s-all ~]# sed -i 's#^ExecStart=.*#ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9#' /usr/lib/systemd/system/cri-docker.service
[root@k8s-all ~]# systemctl daemon-reload
[root@k8s-all ~]# systemctl restart docker
[root@k8s-all ~]# systemctl enable --now cri-docker.service
2.4 修改docker配置文件(所有节点执行)
[root@k8s-all ~]# mkdir -p /etc/docker
[root@k8s-all ~]# cat /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": [
        "https://docker.anyhub.us.kg",
        "https://dockerhub.jobcher.com",
        "https://dockerhub.icu"
    ]
}
EOF
[root@k8s-all ~]# systemctl daemon-reload
[root@k8s-all ~]# systemctl restart docker
2.5 初始化Master节点(master执行)
[root@k8s-master ~]# kubeadm init --kubernetes-version=v1.28.2 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.127.150 --apiserver-bind-port=6443 --image-repository registry.aliyuncs.com/google_containers --cri-socket unix:///var/run/cri-dockerd.sock

[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
2.6 添加Worker节点(所有从节点执行)

在master初始化完成后,将生成的密钥在所有从节点执行,将从节点加入集群

[root@k8s-master ~]# kubeadm join 192.168.127.150:6443 --token xybyq6.7qqa8fpky0uex50t \
	--discovery-token-ca-cert-hash sha256:8a55dc04528706ea9ad526d3c85da50122db8e86b2a2ed4d3d69a435636a8e01 --cri-socket unix:///var/run/cri-dockerd.sock
2.7 查看集群
[root@K8s-master ~]# kubectl get nodes
NAME             STATUS     ROLES           AGE    VERSION
k8s-master       NotReady   control-plane   6m1s   v1.28.2
k8s-node-01      NotReady   <none>          91s    v1.28.2
k8s-node-02      NotReady   <none>          104s   v1.28.2
2.8 安装网络插件
# 所有节点
[root@k8s-all ~]# docker pull calico/cni:v3.25.0
[root@k8s-all ~]# docker pull calico/node:v3.25.0
[root@k8s-all ~]# docker pull calico/kube-controllers:v3.25.0

# 主节点执行
# 在k8s中安装calico
[root@K8s-master ~]#  kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
# 确认一下calico是否安装成功(耐心等待,coredns和calico为Running状态后再进行后面的操作)
[root@K8s-master ~]# kubectl get pods --all-namespaces -w
[root@K8s-master ~]# kubectl get nodes
NAME             STATUS  ROLES           AGE    VERSION
k8s-master       Ready   control-plane   8m20s   v1.28.2
k8s-node-01      Ready   <none>          2m36s   v1.28.2
k8s-node-02      Ready   <none>          2m48s   v1.28.2
2.9 从节点执行kubectl get nodes报错,无法查看集群信息问题解决
在主节点查看 config 内容:

cat $HOME/.kube/config

复制输出的全部内容。
在从节点创建 .kube 目录并粘贴内容:

mkdir -p $HOME/.kube
vi $HOME/.kube/config  # 粘贴主节点的 config 内容并保存


# 确保文件权限正确
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 在从节点执行,查看集群节点状态
kubectl get nodes

到此为止,我们的k8s集群就搭建好了。

    Logo

    码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

    更多推荐