部署3节点k8s集群,要求使用版本1.24.2。

主机规划

作用 IP地址 操作系统 配置
Master 192.168.2.30 Centos7.9 基础设施服务器 2颗CPU 4G内存 50G硬盘
Node1 192.168.2.31 Centos7.9 基础设施服务器 2颗CPU 4G内存 50G硬盘
Node2 192.168.2.32 Centos7.9 基础设施服务器 2颗CPU 4G内存 50G硬盘

环境搭建

本次环境搭建需要安装三台Centos服务器(一主二从),k8s采用1.24.2版本。

主机安装

安装虚拟机过程中注意下面选项的设置:

  • 操作系统环境:CPU(2C) 内存(4G) 硬盘(50G)

  • 语言选择:中文简体

  • 软件选择:基础设施服务器

  • 分区选择:自动分区

  • 网络配置:按照下面配置网路地址信息

     网络地址:192.168.2.30  (每台主机都不一样  分别为30、31、32)
     子网掩码:255.255.255.0
     默认网关:192.168.2.2
     DNS:    223.5.5.5

  • 主机名设置:按照下面信息设置主机名

     master节点: master
     node节点:   node1
     node节点:   node2

环境初始化

1)检查操作系统的版本

 # 此方式下安装kubernetes集群要求Centos版本要在7.9
 [root@master ~]# cat /etc/redhat-release
 CentOS Linux release 7.9.2009 (Core)

2) 主机名解析

为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中推荐使用内部DNS服务器

 # 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
 192.168.2.30  master
 192.168.2.31  node1
 192.168.2.32  node2

3) 时间同步

kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。

企业中建议配置内部的时间同步服务器

 # 安装chrony
 [root@master ~]# yum install chrony
 # 修改配置文件
 [root@master ~]# vim /etc/chrony.conf
 server ntp1.aliyun.com iburst
 ​
 # 启动chronyd服务
 [root@master ~]# systemctl start chronyd
 # 设置chronyd服务开机自启
 [root@master ~]# systemctl enable chronyd
 # chronyd服务启动稍等几秒钟,就可以使用date命令验证时间了
 [root@master ~]# date

4) 禁用iptables和firewalld服务

kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

 # 1 关闭firewalld服务
 [root@master ~]# systemctl stop firewalld
 [root@master ~]# systemctl disable firewalld
 [root@master ~]# firewall-cmd --state
 not running
 ​
 # 2 关闭iptables服务
 [root@master ~]# systemctl stop iptables
 [root@master ~]# systemctl disable iptables

5) 禁用selinux

selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

 # 编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
 # 注意修改完毕之后需要重启linux服务
 SELINUX=disabled
 ​
 sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
 setenfoce 0
  [root@master ~]# sestatus
 SELinux status:                 disabled

6) 禁用swap分区

swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用

启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备

但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

 # 编辑分区配置文件/etc/fstab,注释掉swap分区一行
 # 注意修改完毕之后需要重启linux服务
  UUID=455cc753-7a60-4c17-a424-7741728c44a1 /boot    xfs     defaults        0 0
  /dev/mapper/centos-home /home                      xfs     defaults        0 0
 # /dev/mapper/centos-swap swap                      swap    defaults        0 0

7)升级操作系统内核

# 导入elrepo gpg key
[root@master ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

# 安装elrepo YUM源仓库
[root@master ~]# yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

# 安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本
[root@master ~]# yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64

# 设置grub2默认引导为0
[root@master ~]# grub2-set-default 0

# 重新生成grub2引导文件
[root@master ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

# 更新后,需要重启,使用升级的内核生效。
[root@master ~]# reboot

# 重启后,需要验证内核是否为更新对应的版本
[root@master ~]# uname -r
5.18.10-1.el7.elrepo.x86_64

8)修改linux的内核参数

# 修改linux的内核参数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
# 重新加载配置
[root@master ~]# sysctl -p /etc/sysctl.d/kubernetes.conf
# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter

9)配置ipvs功能

在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的

两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

# 1 安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadm -y

# 2 添加需要加载的模块写入脚本文件
[root@master ~]# cat <  /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

# 3 为脚本文件添加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules

# 4 执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules

# 5 查看对应的模块是否加载成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4

基础环境

k8s基本环境准备

由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源,本文使用阿里云YUM源

$ cat < /etc/yum.repos.d/kubernetes.repo
[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

$ yum clean all && yum makecache
# 集群软件安装
安装kubeadm、kubelet和kubectl
# yum install kubeadm kubelet kubectl -y

# 查看所有的可用版本
$  yum list  kubeadm  kubelet kubectl --showduplicates | sort -r

# 默认安装的版本就是最新版1.24.X,当然也可以指定版本安装 ,如 yum install kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2
$ yum install  kubeadm  kubelet kubectl

#安装后查看版本
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.2", GitCommit:"f66044f4361b9f1f96f0053dd46cb7dce5e990a8", GitTreeState:"clean", BuildDate:"2022-06-15T14:20:54Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"linux/amd64"}

# 配置kubelet的cgroup
# 为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。

$ cat < /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

# 设置kubelet开机自启
# systemctl enable kubelet

做完基础环境创建快照。

集群创建方式:containerd

安装containerd

本文采用在线方式安装

所有节点都安装。

直接安装docker-ce源
# step 1: 安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4:查询软件包
yum list | grep containerd
containerd.io.x86_64                      1.6.6-3.1.el7                docker-ce-stable
# Step 5:安装软件包
[root@node1 ~]# yum install containerd -y

# Step 6:初始化默认配置
containerd config default | tee /etc/containerd/config.toml

# Step 7:修改containerd配置更改cgroup
sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml

# Step 8:修改镜像源
sed -i "s#k8s.gcr.io#registry.aliyuncs.com/google_containers#g"  /etc/containerd/config.toml

# Step 9:配置crictl
cat < 
  

初始化 Master 节点

方法一:通过配置文件初始化

1)生成并修改配置文件

# 生成配置文件
$ kubeadm config print init-defaults > kubeadm.yml

修改如下配置:

  • advertiseAddress:为控制切面地址,( Master 主机 IP )

  • criSocket:为 containerd 的 socket 文件地址

  • name: 为master主机名

  • imageRepository:阿里云镜像代理地址,否则拉取镜像会失败

  • kubernetesVersion:为 k8s 版本

注意:一定要配置镜像代理,否则会由于防火墙问题导致集群安装失败

修改后配置文件如下:

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  # 控制切面的IP地址
  advertiseAddress: 192.168.2.30
  bindPort: 6443
nodeRegistration:
  # 容器运行时 socket 文件地址
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  # 控制面主机名,可省略
  name: master
  taints: 
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
# 镜像服务地址
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
# K8S 版本
kubernetesVersion: 1.24.2
networking:
  dnsDomain: cluster.local
  # service 的网段
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

2)初始化 K8S 集群

# 查看所需镜像列表
$ kubeadm config images list --config kubeadm.yml
# 拉取镜像
$ kubeadm config images pull --config kubeadm.yml
# 根据配置文件启动 kubeadm 初始化 k8s
$ kubeadm init --config=kubeadm.yml --upload-certs --v=6

方法二:通过命令初始化

参数 作用 缺省 配置
--apiserver-advertise-address apiserver 绑定的 IP Master 主机 IP
--apiserver-bind-port apiserver 监听的端口 6443 6443
--cri-socket CRI socket 文件路径 "unix:///var/run/containerd/containerd.sock"
--control-plane-endpoint 控制面地址 master_vip:6440
--image-repository 选择拉取镜像的仓库 k8s.gcr.io registry.aliyuncs.com/google_containers
--kubernetes-version 选择K8S版本 stable-1 1.24.2
--pod-network-cidr 指定 pod 的网络 10.244.0.0/16
--service-cidr 指定service 的IP 范围 10.96.0.0/12 10.96.0.0/12
kubeadm init --apiserver-advertise-address=192.168.2.30 --apiserver-bind-port=6443 --cri-socket="unix:///var/run/containerd/containerd.sock" --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version=1.24.2 --pod-network-cidr=10.244.0.0/16  --service-cidr=10.96.0.0/12

执行结果

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

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

kubeadm join 192.168.2.30:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:4ab2fe695b9917ac72d7ad4975605405d3f6a0731ef7f56ed627e79f93c8615b

说明 1:加入指令可以通过如下命令重复获取

$ kubeadm token create --print-join-command

说明 2:初始化失败可以用 reset 指令重置,解决问题后重新初始化

$ kubeadm reset

说明 3:查看日志

$ journalctl -f -u kubelet

说明 4:token 失效处理

# 重新生成token
$ kubeadm token create
abcdef.0123456789abcdef 

# 获取ca证书sha256编码hash值
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
b615fccddcd4e80fc6f9c5e477bfc7a053b017660b73fdeccf89c559739664d7

# 将新的node节点加入到k8s集群中
kubeadm join node主机ip地址:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:b615fccddcd4e80fc6f9c5e477bfc7a053b017660b7

添加 Worker 节点

在 Worker 节点执行

[root@node1 ~]# kubeadm join 192.168.2.30:6443 --token abcdef.0123456789abcdef         --discovery-token-ca-cert-hash sha256:4ab2fe695b9917ac72d7ad4975605405d3f6a0731ef7f56ed627e79f93c8615b
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

安装网络插件

没有安装之前查看集群节点

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE   VERSION
master   NotReady   control-plane   16m   v1.24.2
node1    NotReady             32s   v1.24.2
node2    NotReady             5s    v1.24.2

下载,这里我们安装 flannel

[root@master ~]# wget http://down.i4t.com/k8s1.24/kube-flannel.yml

# 根据需求修改网卡配置,这里以eth0为主
      containers:
      - name: kube-flannel
        image: rancher/mirrored-flannelcni-flannel:v0.17.0
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=eth0  # 如果是多网卡的话,指定内网网卡的名称

执行:
[root@master ~]# kubectl apply -f kube-flannel.yml

[root@master ~]# kubectl get nodes

结果

 

你可能感兴趣的:(服务器,linux,kubernetes)