安装篇-kubeadm
# Kubernetes 1.32版本集群部署
# 1、基础配置
- 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭,需要重启
setenforce 0 #临时关闭
1
2
2
- 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
1
2
2
- 修改主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
1
2
3
2
3
- 修改网络为固定IP
sudo nmcli con mod ens160 ipv4.addresses 192.168.1.100/24
sudo nmcli con mod ens160 ipv4.gateway 192.168.1.1
sudo nmcli con mod ens160 ipv4.dns "8.8.8.8"
sudo nmcli con mod ens160 ipv4.method manual
sudo nmcli con down ens160 && sudo nmcli con up ens160
1
2
3
4
5
2
3
4
5
- 关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
1
2
2
- 添加时间同步
#修改时区,同步时间
yum install chrond -y
vim /etc/chrony.conf
-----
pool 2.pool.ntp.org iburst
pool 1.rocky.pool.ntp.org iburst
-----
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- 系统优化
vi /etc/sysctl.d/k8s_better.conf
# 启用桥接的IPv4和IPv6流量过滤,确保iptables能处理桥接流量。
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 启用IPv4转发,用于容器间的网络通信。
net.ipv4.ip_forward=1
# 禁止内存交换(swapping),即不使用swap空间,减少磁盘I/O延迟,适合内存密集型工作负载。
vm.swappiness=0
# 设置内存分配策略为“总是成功”。
vm.overcommit_memory=1
# 当内存不足时,允许内核丢弃进程而不是在OOM时崩溃。
vm.panic_on_oom=0
# 增加inotify监视器实例的最大数量,适用于高频率文件监控。
fs.inotify.max_user_instances=8192
# 增加inotify可监视的文件数量,适用于高频率文件监控。
fs.inotify.max_user_watches=1048576
# 设置最大文件描述符数,允许更多并发文件打开。
fs.file-max=52706963
# 设置最大打开文件数,容器或高并发应用可能会用到更多的文件描述符。
fs.nr_open=52706963
# 禁用IPv6,通常为了减少不必要的网络流量或提高安全性。
net.ipv6.conf.all.disable_ipv6=1
#设置网络连接跟踪表的最大连接数,适用于大规模的网络环境。
net.netfilter.nf_conntrack_max=2310720
执行
modprobe br_netfilter
lsmod |grep conntrack
modprobe ip_conntrack
sysctl -p /etc/sysctl.d/k8s_better.conf
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
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
- 修改hosts
192.168.51.46 k8s-master01
192.168.51.47 k8s-node1
192.168.51.48 k8s-node2
1
2
3
2
3
- 更换默认源,安装epel(非必须)
【推荐阿里源】
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/rocky-*.repo
dnf makecache
【配置Epel 镜像】
下载新repo到/etc/yum.repos.d/
epel(RHEL 8)
1)安装 epel 配置包
yum install -y epel-release
2)将 repo 配置中的地址替换为阿里云镜像站地址
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 安装依赖包
yum -y install wget jq psmisc vim net-tools nfs-utils socat telnet device-mapper-persistent-data lvm2 git tar curl -y
yum install -y conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
1
2
3
4
2
3
4
- 开启ipvs转发
yum install ipvsadm ipset sysstat conntrack libseccomp -y
--------------------------
modprobe br_netfilter
mkdir /etc/sysconfig/modules
vi /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
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 设置系统句柄数为最大
ulimit -SHn 65535
cat >> /etc/security/limits.conf <<EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* seft memlock unlimited
* hard memlock unlimitedd
EOF
#查看修改结果
ulimit -a
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 如果使用的是vmware克隆机,还需检查uuid
cat /sys/class/dmi/id/product_uuid
1
# 安装containerd
创建配置文件
【3台机器全部执行】
创建 /etc/modules-load.d/containerd.conf 配置文件
----------------------
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
----------------------
modprobe overlay
modprobe br_netfilter
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
配置源文件
获取阿里云YUM源
vim /etc/yum.repos.d/docker-ce.repo
------------------
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/9/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
----------------------
yum makecache
下载安装:
yum install -y containerd.io
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
配置config文件
3台机器全部执行
生成containerd的配置文件
mkdir /etc/containerd -p
生成配置文件
containerd config default > /etc/containerd/config.toml
编辑配置文件
vim /etc/containerd/config.toml
------------
SystemdCgroup = false 改为
【搜索】:/SystemdCgroup
SystemdCgroup = true //第139行
sandbox_image = "k8s.gcr.io/pause:3.6"
改为:
【搜索】:/sandbox_image
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" //第67行
-----------
设置开机启动
systemctl enable containerd
启动服务
systemctl start containerd
查看镜像,验证安装是否成功
ctr images ls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 安装k8s 1.32.0
1、配置k8s yum源
3台机器全部配置
#添加阿里云YUM软件源
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
EOF
-------------
# 清除原有 yum 缓存
yum clean all
# 生成新的缓存
yum makecache
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
2、查看所有可用的版本
yum list kubelet --showduplicates | sort -r |grep 1.32
1
3、安装kubeadm,kubelet和kubectl
3台机器全部执行,默认安装最新版本1.32.0
yum install -y kubectl kubelet kubeadm
1
2
2
会自动安装5个包,明细如下:
cri-tools-1.32.0-150500.1.1.x86_64
kubeadm-1.32.0-150500.1.1.x86_64
kubectl-1.32.0-150500.1.1.x86_64
kubelet-1.32.0-150500.1.1.x86_64
kubernetes-cni-1.6.0-150500.1.1.x86_64
1
2
3
4
5
6
2
3
4
5
6
4、配置cgroup
为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。
vim /etc/sysconfig/kubelet [3台全部设置下]
---------------------
添加
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
---------------------
设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
5、准备k8s 1.32.0镜像
kubeadm config images list --kubernetes-version=v1.32.1
1
6、拉取镜像
使用以下命令从阿里云仓库拉取镜像 [3台都执行安装]
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
1
2
2
7、集群初始化
集群初始化 【主机76安装即可】
使用kubeadm init命令初始化
在lyc-80-76上执行,报错请看k8s报错汇总
vim kubeinit.sh
. ./kubeinit.sh
-------------------------------------
kubeadm init --kubernetes-version=v1.32.0 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.80.76 --image-repository registry.aliyuncs.com/google_containers
------------------------------------------
--apiserver-advertise-address 集群通告地址
--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
--kubernetes-version K8s版本,与上面安装的一致
--service-cidr 集群内部虚拟网络,Pod统一访问入口
--pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
安装成功提示
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
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.51.46:6443 --token 7a3yak.7qs7326t28m0ww3f \
--discovery-token-ca-cert-hash sha256:5cadea570e7168fc56bf0c805b9e8debd9a1d427e172f6e6bc5b00d09757c40c
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
根据提示,主节点执行下提示信息
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
1
2
3
4
5
6
7
2
3
4
5
6
7
8、node节点加入集群
lyc-80-77/lyc-80-78 分别执行
kubeadm join 192.168.51.46:6443 --token 7a3yak.7qs7326t28m0ww3f \
--discovery-token-ca-cert-hash sha256:5cadea570e7168fc56bf0c805b9e8debd9a1d427e172f6e6bc5b00d09757c40c
1
2
3
2
3
9、查看集群节点
# 查看集群节点:
kubectl get node
1
2
2
# 安装Calico网络插件
网络组件有很多种,只需要部署其中一个即可,推荐Calico。
Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。
Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器(vRouter)来负责数据转发,
而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。
此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能。
*******************************************
github地址:https://github.com/projectcalico/calico
下载Calico配置文件
wget https://docs.projectcalico.org/manifests/calico.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
这里我用的是提前准备好的配置文件
还记得初始化k8s集群时填的这个地址不?
--pod-network-cidr=10.224.0.0/16
安装网络插件calico的时候,配置成这个地址才行
vim calico.yaml
---------------
注意看2个地方的配置
搜索查看文件:
:/CALICO_IPV4POOL_CIDR
:/image 修改镜像地址
-------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#修改文件中镜像地址为可以拉取镜像的地址
sed -i s#docker.io/calico/cni:v3.25.0#docker.cnb.cool/zzppjj/docker-images/cni:v3.25.0#g calico.yaml
sed -i s#docker.io/calico/node:v3.25.0#docker.cnb.cool/zzppjj/docker-images/node:v3.25.0#g calico.yaml
sed -i s#docker.io/calico/kube-controllers:v3.25.0#docker.cnb.cool/zzppjj/docker-images/kube-controllers:v3.25.0#g calico.yaml
部署calico网络
calico.yaml
kubectl apply -f calico.yaml
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
查看网络
kubectl get node
kubectl get nodes -o wide
kubectl get pods --all-namespaces -o wide
等待几分钟查看pod情况
kubectl get node -A
kubectl get pod -n kube-sysrem
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 安装ingress-nginx控制器
下载部署文件
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/cloud/deploy.yaml
1
修改镜像,并执行安装
#修改下载部署文件的镜像地址
vi deploy.yaml
docker.cnb.cool/zzppjj/docker-images/controller:v1.12.0
docker.cnb.cool/zzppjj/docker-images/kube-webhook-certgen:v1.5.0
kubectl apply -f deploy.yaml
1
2
3
4
5
2
3
4
5
检查 ingress-nginx 控制器的 Service
kubectl get svc -n ingress-nginx
1
# 部署 MetalLB 来为集群提供 LoadBalancer 功能
官方网站部署步骤:Installation :: MetalLB, bare metal load-balancer for Kubernetes (opens new window)
修改kube-proxy 配置
kubectl edit configmap -n kube-system kube-proxy
将strictARP值改成: true
1
2
2
下载部署文件
wget https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
1
修改部署文件的配置镜像,改成下方地址
docker.cnb.cool/zzppjj/docker-images/controller:v0.13.10
docker.cnb.cool/zzppjj/docker-images/speaker:v0.13.10
1
2
2
执行部署
kubectl apply -f metallb-native.yaml
1
创建metallb地址池
vi metallb-ippool.yaml
#添加如下内容
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: localip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.51.100-192.168.51.102
autoAssign: true
avoidBuggyIPs: true
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
通过网卡对外通告
vi metallb-l2.yaml
#添加如下内容
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: localip-pool-l2a
namespace: metallb-system
spec:
ipAddressPools:
- localip-pool
interfaces:
- ens160
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
执行启动
kubectl apply -f metallb-ippool.yaml
kubectl apply -f metallb-l2.yaml
1
2
2
检查对外的ip是否关联上
# 小试牛刀
部署前端web程序
# deplyment文件,如果没有配置,去掉相关环境变量的配置即可
apiVersion: apps/v1
kind: Deployment
metadata:
name: resume-frontend
labels:
app: resume
spec:
replicas: 1
selector:
matchLabels:
app: resume
template:
metadata:
labels:
app: resume
spec:
containers:
- name: resume-container
image: docker-images/resume:latest # 建议使用具体版本标签
ports:
- containerPort: 3000
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: resume-service
spec:
type: LoadBalancer
selector:
app: resume
ports:
- protocol: TCP
port: 80
targetPort: 3000
---
# Ingress 配置(需要集群已安装 Ingress Controller)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: resume-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: / # Nginx Ingress 专用注解
spec:
ingressClassName: nginx # 指定 Ingress 控制器类型
rules:
- host: resume.example.com # 修改为您的域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: resume-service
port:
number: 80
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
应用完整配置
kubectl apply -f deployment.yaml
1
查看Ingress 分配的外部 IP
kubectl get ingress resume-ingress
1
DNS 配置
将域名 resume.example.com 解析到 Ingress 控制器的外部 IP
1
完整流量路径
客户端 -> Ingress (resume.example.com) -> Service (resume-service) -> Pod (resume-frontend)
参考链接
第四十八节 Rocky9.5 安装 k8s v1.32.0 底层走containerd_大数据仓库工程师的技术博客_51CTO博客 (opens new window)
k8s之基于metallb实现LoadBalancer型Service - 一炁化三清 - 博客园 (opens new window)


上次更新: 2025/02/22, 20:44:09