3

一、环境配置
1.1修改主机名(所以节点执行)
不修改主机名会在节点加入集群的时候出现问题。

#master执行
hostnamectl set-hostname k8s-master
#node1执行
hostnamectl set-hostname k8s-node1
#node2执行
hostnamectl set-hostname k8s-node1

1.2修改hosts配置(所有节点执行)
/etc/hosts文件用于本地的主机名解析,将主机名映射到IP地址。在Kubernetes集群中,各个节点之间需要通过网络通信,特别是Master节点和Worker节点之间的API Server通信。如果节点之间无法通过主机名正确解析到对方的IP地址,可能会导致通信失败,进而影响集群的初始化和节点加入。

#IP修改为集群实际的IP
echo "10.10.2.131 k8s-master" |  tee -a /etc/hosts
echo "10.10.2.132 k8s-node1" |  tee -a /etc/hosts
echo "10.10.2.133 k8s-node2" |  tee -a /etc/hosts

1.3关闭swap分区(所有节点执行)
不关闭swap会出现以下问题:
image.png

#临时关闭
swapoff -a
# 永久关闭:注释 /etc/fstab 中所有 Swap 相关条目
sed -i '/swap/ s/^\(.*\)$/#\1/' /etc/fstab

1.4关闭防火墙(所有节点执行)

systemctl disable firewalld
systemctl stop firewalld

1.5修改内核参数(所有节点执行)

#加载 br_netfilter 模块
#modprobe 用于加载或卸载内核模块。
#br_netfilter 是需要加载的模块
modprobe br_netfilter
#确保模块在系统启动时自动加载
echo "modprobe br_netfilter" >> /etc/profile
#为了使 Kubernetes 网络插件(如 Calico、Flannel)能够正确工作,需要配置以下 sysctl 参数
#net.bridge.bridge-nf-call-ip6tables = 1:允许桥接设备上的 ip6tables 规则生效。
#net.bridge.bridge-nf-call-iptables = 1:允许桥接设备上的 iptables 规则生效
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

1.6配置集群时间同步(所有节点执行)
时间同步在分布式系统中非常重要,尤其是像Kubernetes这样的集群环境。如果节点之间的时间不同步,可能会导致各种问题。比如,日志时间戳不一致,排查问题困难;证书验证失败,因为证书的有效期依赖时间;还有可能导致数据不一致,特别是使用有状态应用或数据库时。

安装日期插件

yum install -y ntp ntpdate 
ntpdate cn.pool.ntp.org
systemctl start ntpd
systemctl enable ntpd

1.7配置k8s的yum源(所有节点执行)
这里配置的是aliyun源

tee /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

二、安装docker
2.1先卸载docker(所有节点执行)
防止之前安装的docker版本影响K8S的部署(确保环境的整洁)

yum remove docker*

2.2安装依赖包(所有节点执行)

yum install -y gcc gcc-c++ yum-utils yum-utils device-mapper-persistent-data lvm2

2.3配置yum仓库(所有节点执行)

#配置阿里云的yum仓库地址
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.4安装docker(所有节点执行)

#安装docekr以及相关组件
#默认安装最新版本的,也可以安装指定版本,我这里指定安装20.10.24版本
yum install docker-ce-20.10.24 docker-ce-cli-20.10.24
#启动docker
systemctl start docker
#设置开机自启
systemctl enable docker
#验证安装
docker -v

#配置阿里云镜像加速器
#统一 cgroup 驱动配置(docker默认是 cgroups,k8s是systemd),使用的 cgroup 驱动不一致,会导致 kubelet 无法正常工作
tee /etc/docker/daemon.json <<-'EOF'
{
  
  "registry-mirrors": ["https://o67x09b2.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]

}
EOF
#重新加载并重启
systemctl daemon-reload
systemctl restart docker

如果配置的加速源无法拉取镜像可以这么配置

tee /etc/docker/daemon.json <<-'EOF'
{
        "registry-mirrors": [
        "https://docker.1panelproxy.com",
        "https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
        "https://docker.m.daocloud.io",
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com",
        "https://your_preferred_mirror",
        "https://dockerhub.icu",
        "https://docker.registry.cyou",
        "https://docker-cf.registry.cyou",
        "https://dockercf.jsdelivr.fyi",
        "https://docker.jsdelivr.fyi",
        "https://dockertest.jsdelivr.fyi",
        "https://mirror.aliyuncs.com",
        "https://dockerproxy.com",
        "https://mirror.baidubce.com",
        "https://docker.m.daocloud.io",
        "https://docker.nju.edu.cn",
        "https://docker.mirrors.sjtug.sjtu.edu.cn",
        "https://docker.mirrors.ustc.edu.cn",
        "https://mirror.iscas.ac.cn",
        "https://docker.rainbond.cc",
        "https://o67x09b2.mirror.aliyuncs.com"
        ],
        "exec-opts": ["native.cgroupdriver=systemd"]

}
EOF

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

# 默认安装最新版本,也可以指定安装版本,我这里指定安装1.23.17版本
yum install -y kubeadm-1.23.17 kubectl-1.23.17 kubelet-1.23.17
#设置开机自启
systemctl enable kubelet
#查看当前版本
kubeadm version
kubectl version --client

3.2初始化k8s集群(master节点)

--apiserver-advertise-address=IP     #指定 Kubernetes API 服务器监听的 IP 地址
--control-plane-endpoint=IP        #指定控制平面的统一访问入口(高可用集群必填),可以是域名、DNS 名称或负载均衡器 IP
--image-repository 容器仓库地址       #指定拉取 Kubernetes 组件镜像的容器仓库地址
--kubernetes-version 版本号 \         #明确指定安装的 Kubernetes 版本
--service-cidr=10.96.0.0/16 \        #指定Service的虚拟IP地址范围(CIDR),用于分配 ClusterIP
--pod-network-cidr=192.168.0.0/16    #指定 Pod 网络的 CIDR 范围,供 CNI 插件(如 Calico、Flannel)分配 Pod IP
kubeadm init \
--apiserver-advertise-address=10.10.2.131 \
--image-repository  registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.23.17 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=172.20.0.0/16

初始化完成之后,会输出一个"kubeadm join ..."信息,先保存下来。node节点加入master会使用.
image.png
3.3拷贝k8s认证文件(master节点)
用于将 Kubernetes 的认证文件(admin.conf)复制到用户目录并设置权限,以便普通用户能够安全地使用 kubectl 管理集群。如果一直都是root用户操作,可忽略此步骤。

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

3.4查看节点信息(master节点)
kubectl get nodes
3.5往集群加入node节点
3.5.1创建token(master节点)
 默认token有效期为24小时。token过期后,就需要重新创建token,可以直接使用命令快捷生成

# 查看token信息
kubeadm token list
#在master节点重新生成 Join Token,然后复制生成的内容,到从节点执行
kubeadm token create --print-join-command

image.png
3.5.2向集群添加新节点(node节点)
从节点执行刚刚在master节点重新生成 Join Token
image.png
image.png
由于网络插件还没有部署,所以状态是NotReady
3.6安装Network插件(master节点)
网络插件是必要部件,常用的有Flannel、Calico等。可以根据实际情况选择。
我这里安装的是 Flannel
3.6.1下载下载kube-flannel.yml文件

#下载kube-flannel.yml文件
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 查看需要哪些镜像
cat kube-flannel.yml | grep image
#修改kube-flannel.yml文件
# kube-flannel.yml 中检查 net-conf.json 部分
net-conf.json: |
  {
    "Network": "10.244.0.0/16",   # 必须与 kubeadm 的 --pod-network-cidr 一致
    "Backend": {
      "Type": "vxlan"
    }
  }

image.png

3.6.2下载安装flannel需要的镜像

# pull:拉取镜像【联网节点】
docker pull docker.io/flannel/flannel:v0.23.0
docker pull docker.io/flannel/flannel-cni-plugin:v1.2.0

3.6.3安装flannel

#安装
kubectl apply -f kube-flannel.yml
# 查看节点信息
kubectl get nodes

image.png
image.png
四、测试
可以自己的爱好选择测试方式,我这里是测试部署一个nginx服务。

# 创建一个nginx服务
[root@master ~]# kubectl create deployment nginx --image=nginx
# 暴露80端口
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
# 查看 pod 以及服务信息
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        70m
service/nginx        NodePort    10.109.81.191   <none>        80:31474/TCP   10s

浏览器访问:http://masterIP:31474http://node1IP:31474http://node2IP:31474
image.png
image.png
image.png
K8S集群部署完成且可以正常部署服务


苦逼的小运维
1 声望1 粉丝

下一篇 »
k8s之yaml详解