基于Ubuntu 20.04.06操作系统极速部署K8S集群(更新增加kuboard配置)

1.Uduntu 服务器准备

主机名称 IP地址 系统
k8s-master-11 192.168.88.11 Uduntu
k8s-node-12 192.168.88.12 Uduntu
k8s-node-13 192.168.88.13 Uduntu

1.1 root用户密码处理

1
2
3
4

sudo -i //切换root用户
echo root:Aa551122 |sudo chpasswd root //修改root的密码 echo root:要登录的密码 |sudo chpasswd root

1.2 网络配置

配置文件地址 /etc/netplan/00-installer-config.yaml

1
2
3
4
5
6
7
# 备份文件网络配置文件
mv /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
# 添加新的网络配置
vi /etc/netplan/00-network-manager.yaml
# 应用配置
netplan apply

静态地址配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# This is the network config written by 'subiquity'
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.88.10/24
routes:
- to: default
via: 192.168.88.2
nameservers:
addresses:
- 223.6.6.6
- 114.114.114.114
- 8.8.8.8

1.3 关闭防火墙和selinux

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看防火墙状态
sudo ufw status
# 关闭防火墙
sudo ufw disable
# 永久关闭防火墙
sudo systemctl disable ufw
#关闭 selinux
sudo setenforce 0
# 永久关闭 selinux 打开配置文件 ,将 SELINUX=enforcing 修改为 SELINUX=disabled
sudo vi /etc/selinux/config



1.4 关闭swap分区

1
2
3
4
5
6
7
8
9
10
11
12

#临时禁用:
sudo swapoff /swapfile

#永久禁用: 编辑文件删除 /swapfile 这一行

vim /etc/fstab

# 使用 free -m 命令来查看确认交换分区已经被禁用

free -m

1.5 主机名称配置

1
2
3
4
5
6
7

hostnamectl set-hostname k8s-master-11 #11服务器执行此行命令

hostnamectl set-hostname k8s-node-12 #12服务器执行此行命令

hostnamectl set-hostname k8s-node-13 #13服务器执行此行命令

1.6 host文件,解析主机名称

1
2
3
4
5
6
7
8

echo '''
192.168.88.11 k8s-master-11
192.168.88.12 k8s-node-12
192.168.88.13 k8s-node-13
''' >> /etc/hosts


1.7 系统时区配置为+8(三台设备同时处理)

1
2
3
4
5
6
7
8
9
10
11

# 查看当前时区
timedatectl status

# 设置时区为上海
sudo timedatectl set-timezone Asia/Shanghai

# 查看时区是否设置成功
timedatectl status


1.8 配置内核转发以及网桥过滤(三台设备同时处理)

配置文件地址 /etc/modules-load.d/k8s.conf 增加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#文件写入
cat > /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
EOF

#加载配置
modprobe overlay
modprobe br_netfilter

# 查看是否加载
lsmod |grep overlay
lsmod |grep br_netfilter



内核转发和网桥过滤配置文件 /etc/sysctl.d/k8s.conf

1
2
3
4
5
6
7
8
9
10
11
12

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
EOF

#让配置生效:
sysctl -p /etc/sysctl.d/k8s.conf
#查看是否加载生效
lsmod |grep br_netfilter

1.9 安装ipset和ipvsadm (三台设备同时处理)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

apt install ipset ipvsadm
#配置 ipvsadm 模块加载方式

cat > /etc/modules-load.d/ipvs.conf << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

#写成一个手动启动脚本文件

cat << EOF | tee ipvs.sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF


2.容器运行时准备 containerd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#containerd下载
wget https://github.com/containerd/containerd/releases/download/v1.7.23/cri-containerd-1.7.23-linux-amd64.tar.gz

#解压并查看

tar xf cri-containerd-1.7.23-linux-amd64.tar.gz -C /
which containerd
#containerd配置文件生成并修改
#创建文件
mkdir /etc/containerd
#生成配置文件:
containerd config default > /etc/containerd/config.toml

#修改配置文件
#修改配置文件将pause:3.8改为3.9
#或者改为阿里云:registry.aliyuncs.com/google_containers/pause:3.9
#将SystemdCgroup = false改为true
#启动并设置开机自启

systemctl enable --now containerd
#查看版本:
containerd --version

3.k8s 安装部署

3.1 下载用于kubernetes软件包仓库的公告签名密钥

  • 社区源
1
2
3
4
5
6
7
8

#创建目录
sudo mkdir -p /etc/apt/keyrings/
#下载密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
#添加kubernetes apt仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

  • 阿里源
1
2
3
4
5
6
7
8
9

#创建目录:
sudo mkdir -p /etc/apt/keyrings/
#下载密钥
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
#添加kubernetes apt仓库
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list


3.2 安装kubelet、kubeadm、kubectl

1
2
3
4
5
6
7
8
#查看软件列表:
apt-cache madison kubeadm
#安装指定版本:
sudo apt-get install -y kubelet=1.30.5-1.1 kubeadm=1.30.5-1.1 kubectl=1.30.5-1.1
#锁定版本,防止后期自动更新。

sudo apt-mark hold kubelet kubeadm kubectl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

# 更新软件包列表
apt update

# 安装 apt-transport-https 和 curl
apt install -y apt-transport-https curl

# 添加 Kubernetes 的 GPG 密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 添加kubernetes apt仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 更新软件包列表
apt-get update

# 检查 kubelet、kubectl 和 kubeadm 的可用版本
apt-cache madison kubelet kubectl kubeadm | grep '1.30.5-1.1'

# 安装指定版本的 Kubernetes 组件
apt install -y kubelet=1.30.5-1.1 kubectl=1.30.5-1.1 kubeadm=1.30.5-1.1


3.3 集群初始化

kubeadm config images list –config kubeadm-config.yaml

1
2
3
4
5
6
7
8
9

#生成配置文件:

kubeadm config print init-defaults > kubeadm-config.yaml

#修改配置文件:

vim kubeadm-config.yaml

配置文件修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
localAPIEndpoint:
advertiseAddress: 192.168.88.11 # 主机地址
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: k8s-master01
taints: null

---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
apiServer:
timeoutForControlPlane: 4m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 仓库地址
kubernetesVersion: 1.30.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
scheduler: {}

---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

查看并下载镜像,初始化集群

1
2
3
4
5
6
7
8

#查看镜像

kubeadm config images list --config kubeadm-config.yaml
#下载镜像
kubeadm config images pull --config kubeadm-config.yaml
#初始化集群
kubeadm init --config kubeadm-config.yaml

3.4 安装完成后配置

初始完成后按照反馈的命令执行

image.png

1
2
3
#在k8s-master01节点查看是否有工作节点加入
kubectl get nodes

image.png

加入其他节点

1
2
3
4
5
#初始化完成后 如图 kubeadm join 命令输出
# 查看加入节点命令,在加入主机执行
kubeadm token create --print-join-command


4.网络插件安装部署(k8s-master01节点操作)

4.1 访问calico的官网

Quickstart for Calico on Kubernetes | Calico Documentation (tigera.io)

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#创建配置文件 1
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/tigera-operator.yaml

#查看是否运行:
kubectl get pods -n tigera-operator

wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/custom-resources.yaml
# 注我们在kubeadm-config.yaml文件中添加的pod网段是10.244.0.0/16所以我们要修改为一样的
vim custom-resources.yaml
#应用配置
kubectl create -f custom-resources.yaml
#查看命名空间
kubectl get ns
# 查看命名空间中运行的pods 如果没有全部起来稍微等一下,应该是在创建中,如果网络慢可能要半个小时。
kubectl get pods -n calico-system
#查看集群状态:
kubectl get nodes

5.创建nginx测试集群可用性(k8s-master操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

vim nginx.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginxweb
spec:
selector:
matchLabels:
app: nginxweb1
replicas: 2
template:
metadata:
labels:
app: nginxweb1
spec:
containers:
- name: nginxwebc
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
name: nginxweb-service
spec:
externalTrafficPolicy: Cluster
selector:
app: nginxweb1
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
type: NodePort


1
2
3
4
5
6
7
#启动创建容器
kubectl apply -f nginx.yaml
#查看是否创建成功
kubectl get deployment
kubectl get pods
kubectl get svc

在浏览器访问集群中任何一台服务器的IP加30080端口都可以访问到我们的nginx

其他问题

node1节点执行kubectl get pods命令时,报了如下错误:

img

解决方案

  1. 复制master节点中 /etc/kubernetes/admin.conf 拷贝到需要运行的服务器/etc/kubernetes目录
    1
    2
    scp /etc/kubernetes/admin.conf [email protected]:/etc/kub                                                                                                                                         ernetes

  2. 对应服务器配置环境变量并应用
1
2
3
4
5

echo "export KUBECONFIG=/etc/kubernetes/admin.config" >> ~/.bash_profile
source ~/.bash_profile