1.说明

由于k8s1.24后不在支持docker引擎作为容器运行时(CRI)了,目前部署官网指定了三种cri的方案
红框处为目前支持的cri
本次部署CRI选择为docker+cri-dockerd的方案

2.环境准备

操作系统:centos8.2.2004,下载链接:https://mirrors.aliyun.com/centos-vault/8.2.2004/isos/x86_64/
虚拟机规格 :2核4g 192.168.182.135(master) 192.168.182.136(node1)192.168.182.137(node2)
主机yum源
在这里插入图片描述
系统源配置为阿里云的源http://mirrors.aliyun.com/centos/
docker和k8s后面会有获取方法

3.部署的前置条件

3.1主机互信配置

每台主机执行ssh-keygen,一路回车,生成公钥,ssh-copy-id将公钥分发给另外两台主机即可

3.2主机名配置
#master节点
hostnamectl set-hostname k8s-master01
#node1节点
hostnamectl set-hostname k8s-worker01
#node2节点
hostnamectl set-hostname k8s-worker02
3.3主机配置静态ip

以第一台192.168.182.135为例,三台均需要配置

#vi /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens160"
UUID="bf37430a-ad2c-4848-983c-1b9ea1b4522e"
DEVICE="ens160"
ONBOOT="yes"
IPADDR=192.168.182.135
NETMASK=255.255.255.0
GATEWAY=192.168.182.2
DNS1=192.168.182.2 

另外两台同样配置

3.4主机名与ip映射配置

三台虚拟机均需要配置
如下:

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.182.135     k8s-master
192.168.182.136     k8s-node1
192.168.182.137     k8s-node2

3.5防火墙&selinux配置

所有机器均需要操作
关闭防火墙:

# systemctl disable firewalld
# systemctl stop firewalld
# firewall-cmd --state

关闭selinux

1.直接setenforce0
2.需重启sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
3.6时间同步

由于是克隆的虚拟机,所以这里时间是自然同步的,但是如果生产环境部署此步骤一定不能省略

# crontab -l
0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com
3.7操作系统内核检查

检查操作系统内核,3.10的内核可能会出问题
我这里是4.18

uname -r

在这里插入图片描述

3.8配置内核转发以及网桥过滤

所有机器均需要进行此操作
配置如下

添加网桥过滤和内核配置转发文件
# cat >/etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
加载br_netfilter模块
modprobe br_netfilter
查看是否加载
#lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter
加载网桥过滤及内核转发配置文件
#sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
3.9安装ipset以及ipvsadm

所有主机均需要操作

安装ipset及ipvsadm
# yum -y install ipset ipvsadm
配置ipvsadm模块加载方式
添加需要加载的模块
# cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
授权、运行、检查是否加载
# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
3.10关闭swap分区

临时关闭:swapoff -a
永久关闭:

永远关闭swap分区,需要重启操作系统
# cat /etc/fstab
......
此行注释#/dev/mapper/centos-swap swap swap defaults 0 0

4.docker准备

4.1获取docker的yum源
# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O
/etc/yum.repos.d/docker-ce.repo
4.2安装docker
# yum -y install docker-ce
4.3修改cgroup方式
创建/etc/docker/daemon.json
在/etc/docker/daemon.json添加如下内容
# cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
4.4启动docker服务
systemctl start docker

5.cri-dockerd安装

5.1golang环境准备
获取golang安装包
# wget https://golang.google.cn/dl/go1.16.15.linux-amd64.tar.gz

tips:如果网络延迟太大,就手动上去下载下来再解压

解压golang至指定目录
# tar -xzf go1.16.15.linux-amd64.tar.gz -C /usr/local

添加环境变量
# cat /etc/profile
......
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

加载/etc/profile文件
# source /etc/profile

验证golang是否安装完成
# go version
输出
go version go1.16.15 linux/amd64
5.2安装cri-dockerd
5.2.1获取cri-dockerd包

由于虚拟机无法直接git clone源码(到github的网络问题),所以需要手动获取
我用的0.2.1版本了,链接:https://github.com/Mirantis/cri-dockerd/releases/tag/v0.2.1
下载cri-dockerd-0.2.1.amd64.tgz包
直接解压,解压后得到cri-dockerd文件

cp cri-dockerd /usr/bin/
5.2.2systemctl相关配置文件准备

创建cri-docker.service文件,注意pause版本要适配k8s版本,容器镜像改成阿里云

[root@k8s-master cri-dockerd]# vim /usr/lib/systemd/system/cri-docker.service 

[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.5
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

StartLimitBurst=3

StartLimitInterval=60s

LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target

5.2.3socket文件配置

如下:

[root@k8s-master cri-dockerd]# vim /usr/lib/systemd/system/cri-docker.socket 

[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=root

[Install]
WantedBy=sockets.target

5.2.4设置和启动cri-dockerd
systemctl daemon-reload
systemctl start cri-docker
systemctl enable cri-docker
检查服务状态
systemctl status cri-docker

将/usr/bin/cri-dockerd传到另外两个节点/usr/bin/路径下,并执行上述同样的部署过程

6.部署k8s1.22.1

6.1配置k8s yum源
[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
6.2yum安装集群软件

所有节点均可安装

安装
# yum -y install kubeadm-1.22.1 kubelet-1.22.1 kubectl-1.22.1
#这里我是指定版本安装的,不指定的话就是最新的1.24版本
6.3配置kubelet
需要保持docker使用的cgroupdriver与kubelet使用的cgroup一致
# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
# systemctl enable kubelet
6.4集群镜像准备

先查看当前安装k8s版本需要什么版本的镜像

#kubeadm config images list --kubernetes-version=1.22.1
k8s.gcr.io/kube-apiserver:v1.22.1
k8s.gcr.io/kube-controller-manager:v1.22.1
k8s.gcr.io/kube-scheduler:v1.22.1
k8s.gcr.io/kube-proxy:v1.22.1
k8s.gcr.io/pause:3.5
k8s.gcr.io/etcd:3.5.0-0
k8s.gcr.io/coredns/coredns:v1.8.4

编写下载镜像脚本

version=1.22.1
images=$(kubeadm config images list --kubernetes-version=${version}|awk -F '/' '{print $NF}')
for imageName in ${images[@]};
do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName} k8s.gcr.io/${imageName}
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
done

也可以手动docker pull下载镜像:
所需镜像对应版本如下

k8s.gcr.io/kube-apiserver:v1.22.1
k8s.gcr.io/kube-controller-manager:v1.22.1
k8s.gcr.io/kube-scheduler:v1.22.1
k8s.gcr.io/kube-proxy:v1.22.1
k8s.gcr.io/pause:3.5
k8s.gcr.io/etcd:3.5.0-0
k8s.gcr.io/coredns/coredns:v1.8.4

6.5初始化
kubeadm init --kubernetes-version=v1.22.1 --pod-networkcidr=10.244.0.0/16 --apiserver-advertise-address=192.168.182.135 --cri-socket unix:///var/run/cri-dockerd.sock

注意需指定cri-socket

7.集群网络calico安装

k8s集群部署完成后,kubectl get nodes发现三个节点都是notready状态,这个原因是因为还没有部署集群网络,本次安装calico作为集群网络使用

7.1下载operator资源清单文件
# wget https://docs.projectcalico.org/manifests/tigera-operator.yaml
应用资源清单文件,创建operator
# kubectl apply -f tigera-operator.yaml
通过自定义资源方式安装
# wget https://docs.projectcalico.org/manifests/custom-resources.yaml
修改文件第13行,修改为使用kubeadm init ----pod-network-cidr对应的IP地址段10.244.0.0
# vim custom-resources.yaml
......
13 cidr: 10.244.0.0/16
14 encapsulation: VXLANCrossSubnet

应用资源清单文件
# kubectl apply -f custom-resources.yaml

监视calico-sysem命名空间中pod运行情况
# watch kubectl get pods -n calico-system

删除 master 上的 taint
# kubectl taint nodes --all node-role.kubernetes.io/master-

# kubectl get pods -n calico-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-59f859b79d-7gx7k   1/1     Running   0          20h
calico-node-m2nf2                          1/1     Running   0          20h
calico-node-mgr8s                          1/1     Running   0          20h
calico-node-xvvtm                          1/1     Running   0          20h
calico-typha-76665cf59d-ltznd              1/1     Running   0          20h
calico-typha-76665cf59d-rfwwn              1/1     Running   0          20h

# kubectl get pods -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-7f6cbbb7b8-lwskf             1/1     Running   0          40h
coredns-7f6cbbb7b8-rhhqj             1/1     Running   0          40h
etcd-k8s-master                      1/1     Running   0          40h
kube-apiserver-k8s-master            1/1     Running   0          40h
kube-controller-manager-k8s-master   1/1     Running   0          40h
kube-proxy-4vmwn                     1/1     Running   0          39h
kube-proxy-r877v                     1/1     Running   0          40h
kube-proxy-znhkv                     1/1     Running   0          39h
kube-scheduler-k8s-master            1/1     Running   0          40h

7.2安装calico客户端
下载二进制文件
# curl -L
https://github.com/projectcalico/calico/releases/download/v3.21.4/calicoctllinux-
amd64 -o calicoctl
如果到github网络有问题,就手动上去下载包

安装calicoctl
# mv calicoctl /usr/bin/
为calicoctl添加可执行权限
# chmod +x /usr/bin/calicoctl
查看添加权限后文件
# ls /usr/bin/calicoctl
/usr/bin/calicoctl
查看calicoctl版本
# calicoctl version
Client Version: v3.21.4
Git commit: 220d04c94
Cluster Version: v3.21.4
Cluster Type: typha,kdd,k8s,operator,bgp,kubeadm

通过~/.kube/config连接kubernetes集群,查看已运行节点
# DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes

安装完成后,再执行kubectl get nodes,发现均为ready状态,集群安装完成!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐