[云原生案例2.4 ] Kubernetes的部署安装 【通过Kubeadm部署Kubernetes高可用集群】

文章目录

  • [1. 基本架构及前置准备](#1. 基本架构及前置准备)
    • [1.1 基本架构](#1.1 基本架构)
    • [1.2 前置准备](#1.2 前置准备)
  • [2. 系统初始化操作 ---- 所有节点](#2. 系统初始化操作 ---- 所有节点)
    • [2.1 关闭防火墙、selinux和swap分区](#2.1 关闭防火墙、selinux和swap分区)
      • [2.1.1 关闭防火墙和selinux](#2.1.1 关闭防火墙和selinux)
      • [2.1.2 关闭交换分区](#2.1.2 关闭交换分区)
    • [2.2 修改主机名,添加域名映射](#2.2 修改主机名,添加域名映射)
      • [2.2.1 修改主机名](#2.2.1 修改主机名)
      • [2.2.2 修改本地hosts文件](#2.2.2 修改本地hosts文件)
    • [2.3 内核升级](#2.3 内核升级)
    • [2.4 调整内核参数](#2.4 调整内核参数)
    • [2.5 所有节点实现Linux的资源限制](#2.5 所有节点实现Linux的资源限制)
    • [2.6 加载ip_vs模块](#2.6 加载ip_vs模块)
    • [2.7 时间同步](#2.7 时间同步)
    • [2.8 内核升级(可选项)](#2.8 内核升级(可选项))
  • [3. 部署Docker](#3. 部署Docker)
    • [3.1 通过yum安装docker ---- 所有节点](#3.1 通过yum安装docker ---- 所有节点)
    • [3.2 修改相关配置并启动docker](#3.2 修改相关配置并启动docker)
  • [4. 部署Kurbernetes的相关工具](#4. 部署Kurbernetes的相关工具)
    • [4.1 安装kubeadm,kubelet和kubectl ---- 所有节点](#4.1 安装kubeadm,kubelet和kubectl ---- 所有节点)
  • [5. 高可用组件安装、配置](#5. 高可用组件安装、配置)
    • [5.1 部署 Haproxy ---- 所有 master 节点](#5.1 部署 Haproxy ---- 所有 master 节点)
    • [5.2 部署Keepalived ---- 所有 master 节点](#5.2 部署Keepalived ---- 所有 master 节点)
    • [5.3 编写状态监控脚本,启动haproxy和keepalived](#5.3 编写状态监控脚本,启动haproxy和keepalived)
  • [6. 部署Kurbernetes集群](#6. 部署Kurbernetes集群)
    • [6.1 设置集群初始化配置文件 ---- master01 节点](#6.1 设置集群初始化配置文件 ---- master01 节点)
    • [6.2 所有节点拉取镜像](#6.2 所有节点拉取镜像)
    • [6.3 master01 节点进行初始化](#6.3 master01 节点进行初始化)
    • [6.4 环境配置 ---- master01节点](#6.4 环境配置 ---- master01节点)
    • [6.5 部署网络插件flannel](#6.5 部署网络插件flannel)
    • [6.6 所有节点加入集群](#6.6 所有节点加入集群)
      • [6.6.1 master节点加入集群](#6.6.1 master节点加入集群)
      • [6.6.1 node 节点加入集群](#6.6.1 node 节点加入集群)
    • [6.7 查看当前集群信息](#6.7 查看当前集群信息)

1. 基本架构及前置准备

1.1 基本架构

1.2 前置准备

bash 复制代码
Master01	192.168.67.100	
Master02	192.168.67.101	
Master03	192.168.67.102	

Node01	192.168.67.103	
Node02	192.168.67.104	

Harbor	192.168.67.105
bash 复制代码
注意事项:
- master节点cpu核心数要求大于2
- 最新的版本不一定好,但相对于旧版本,核心功能稳定,但新增功能、接口相对不稳
- 学会一个版本的 高可用部署,其他版本操作都差不多
- 宿主机尽量升级到CentOS 7.9
- 内核kernel升级到 4.19+ 这种稳定的内核
- 部署k8s版本时,尽量找 1.xx.5 这种大于5的小版本(这种一般是比较稳定的版本)

2. 系统初始化操作 ---- 所有节点

2.1 关闭防火墙、selinux和swap分区

2.1.1 关闭防火墙和selinux

bash 复制代码
#关闭防火墙
systemctl disable firewalld --now

#关闭selinux 
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

2.1.2 关闭交换分区

bash 复制代码
#交换分区必须要关闭。

#K8s的各个组件和容器都需要足够的内存来运行,而Swap的使用可能导致性能下降,甚至是应用程序的奔溃。

#关闭Swap可以确保集群的可预测性和稳定性,避免不必要的磁盘交换。

swapoff -a						
sed -ri 's/.*swap.*/#&/' /etc/fstab		
#永久关闭swap分区,&符号在sed命令中代表上次匹配的结果

2.2 修改主机名,添加域名映射

2.2.1 修改主机名

bash 复制代码
hostnamectl set-hostname master01
hostnamectl set-hostname master02
hostnamectl set-hostname master03
hostnamectl set-hostname node01
hostnamectl set-hostname node02

2.2.2 修改本地hosts文件

bash 复制代码
vim /etc/hosts
192.168.67.100 master01
192.168.67.101 master02
192.168.67.102 master03
192.168.67.103 node01
192.168.67.104 node02

2.3 内核升级

bash 复制代码
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm -O /opt/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm

wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm -O /opt/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm

cd /opt/
yum localinstall -y kernel-ml*

#更改内核启动方式
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
grubby --default-kernel

reboot

2.4 调整内核参数

bash 复制代码
cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720

net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF

#生效参数
sysctl --system  

2.5 所有节点实现Linux的资源限制

bash 复制代码
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 65535
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited

2.6 加载ip_vs模块

bash 复制代码
#加载 ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

2.7 时间同步

bash 复制代码
#通过ntp
yum -y install ntpdate

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

#修改时区
echo 'Asia/Shanghai' >/etc/timezone

#时间同步
ntpdate time2.aliyun.com
bash 复制代码
systemctl enable --now crond

crontab -e
*/30 * * * * /usr/sbin/ntpdate time2.aliyun.com

2.8 内核升级(可选项)

bash 复制代码
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm -O /opt/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm -O /opt/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm

cd /opt/
yum localinstall -y kernel-ml*

#更改内核启动方式
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
grubby --default-kernel
reboot

3. 部署Docker

3.1 通过yum安装docker ---- 所有节点

bash 复制代码
yum install -y yum-utils device-mapper-persistent-data lvm2 

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

yum install -y docker-ce docker-ce-cli containerd.io

3.2 修改相关配置并启动docker

配置镜像加速,修改默认Cgroupdriver,修改日志存储格式。

  1. 使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。

  2. 日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。

bash 复制代码
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://k2anw3oh.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "500m", "max-file": "3"
  }
}
EOF
bash 复制代码
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service --now
bash 复制代码
docker info | grep "Cgroup Driver"

4. 部署Kurbernetes的相关工具

4.1 安装kubeadm,kubelet和kubectl ---- 所有节点

bash 复制代码
#定义kubernetes源
cat > /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

#安装
yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15
bash 复制代码
#配置Kubelet使用阿里云的pause镜像
cat > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2"
EOF

#开机自启kubelet
systemctl enable kubelet.service --now
#K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启

5. 高可用组件安装、配置

5.1 部署 Haproxy ---- 所有 master 节点

bash 复制代码
#yum安装haproxy
yum -y install haproxy
bash 复制代码
#修改配置文件
cat > /etc/haproxy/haproxy.cfg << EOF
global
    log         127.0.0.1 local0 info
    log         127.0.0.1 local1 warning
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                    tcp
    log                     global
    option                  tcplog
    option                  dontlognull
    option                  redispatch
    retries                 3
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout check           10s
    maxconn                 3000

frontend monitor-in
    bind *:33305
    mode http
    option httplog
    monitor-uri /monitor

frontend k8s-master
    bind *:6444
    mode tcp
    option tcplog
    default_backend k8s-master

backend k8s-master
    mode tcp
    option tcplog
    option tcp-check
    balance roundrobin
    server k8s-master1 192.168.67.100:6443  check inter 10000 fall 2 rise 2 weight 1
    server k8s-master2 192.168.67.101:6443  check inter 10000 fall 2 rise 2 weight 1
    server k8s-master3 192.168.67.102:6443  check inter 10000 fall 2 rise 2 weight 1
EOF

5.2 部署Keepalived ---- 所有 master 节点

bash 复制代码
yum -y install keepalived
bash 复制代码
cd /etc/keepalived/
vim keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id LVS_HA1			#路由标识符,每个节点配置不同
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state MASTER				#本机实例状态,MASTER/BACKUP,备机配置文件中设置BACKUP
    interface ens33
    virtual_router_id 51
    priority 100				#本机初始权重,备机设置小于主机的值
    advert_int 1
    virtual_ipaddress {
        192.168.67.200          #设置VIP地址
    }
    track_script {
        chk_haproxy
    }
}



5.3 编写状态监控脚本,启动haproxy和keepalived

bash 复制代码
vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
if ! killall -0 haproxy; then
    systemctl stop keepalived
fi
bash 复制代码
systemctl enable --now haproxy
systemctl enable --now keepalived
bash 复制代码
#观察VIP漂移情况
ip a

6. 部署Kurbernetes集群

6.1 设置集群初始化配置文件 ---- master01 节点

bash 复制代码
#生成配置模板,包含默认的 Kubernetes 集群配置
kubeadm config print init-defaults > /opt/kubeadm-config.yaml
bash 复制代码
cd /opt/
#修改配置文件
vim kubeadm-config.yaml
......
11 localAPIEndpoint:
12   advertiseAddress: 192.168.67.100		#指定当前master节点的IP地址
13   bindPort: 6443

21 apiServer:
22   certSANs:								#在apiServer属性下面添加一个certsSANs的列表,添加所有master节点的IP地址和集群VIP地址
23   - 192.168.67.200
24   - 192.168.67.100
25   - 192.168.67.101
26   - 192.168.67.102

30 clusterName: kubernetes
31 controlPlaneEndpoint: "192.168.67.200:6444"		#指定集群VIP地址
32 controllerManager: {}

38 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers			#指定镜像下载地址
39 kind: ClusterConfiguration
40 kubernetesVersion: v1.20.15				#指定kubernetes版本号
41 networking:
42   dnsDomain: cluster.local
43   podSubnet: "10.244.0.0/16"				#指定pod网段,10.244.0.0/16用于匹配flannel默认网段,指定service网段
44   serviceSubnet: 10.96.0.0/16			#指定service网段
45 scheduler: {}
#末尾再添加以下内容
--- 
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs									#把默认的kube-proxy调度方式改为ipvs模式


#尽量手打不要拷贝
bash 复制代码
#更新集群初始化配置文件
kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml

6.2 所有节点拉取镜像

bash 复制代码
#查看初始化需要的镜像
kubeadm config images list --kubernetes-version 1.25.4
bash 复制代码
#拷贝yaml配置文件给其他主机,通过配置文件进行拉取镜像
for i in master02 master03 node01 node02; do scp /opt/new.yaml $i:/opt/; done
bash 复制代码
kubeadm config images pull --config /opt/new.yaml
#进行拉取镜像

6.3 master01 节点进行初始化

bash 复制代码
kubeadm init --config new.yaml --upload-certs | tee kubeadm-init.log
#会初始化一个 Kubernetes 集群并生成相应的证书和密钥,并将相关信息保存在指定的配置文件中
bash 复制代码
#若初始化失败,进行的操作
kubeadm reset -f
ipvsadm --clear 
rm -rf ~/.kube
再次进行初始化

6.4 环境配置 ---- master01节点

bash 复制代码
#配置 kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
bash 复制代码
#修改controller-manager和scheduler配置文件
vim /etc/kubernetes/manifests/kube-scheduler.yaml 
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
......
    #- --port=0					#搜索port=0,把这一行注释掉


bash 复制代码
systemctl restart kubelet

6.5 部署网络插件flannel

所有节点上传 flannel 镜像 flannel.tar 和网络插件 cni-plugins-linux-amd64-v1.3.0.tgz 到 /opt 目录

bash 复制代码
cd /opt
docker load < flannel.tar
bash 复制代码
mv /opt/cni /opt/cni_bak
mkdir -p /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin
bash 复制代码
#master节点上传 kube-flannel.yml 文件
kubectl apply -f kube-flannel.yml 

6.6 所有节点加入集群

6.6.1 master节点加入集群

bash 复制代码
kubeadm join 192.168.67.200:6444 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:0edd4bc85bc4ff92c543fe317cc09f072527daa9e35e328fd01a07af3bdd4ca1 \
    --control-plane --certificate-key e27514724dd576114513144779d7c23c0ebe5e1ae91d93528838afc4d1511ec6

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


6.6.1 node 节点加入集群

bash 复制代码
kubeadm join 192.168.67.200:6444 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:0edd4bc85bc4ff92c543fe317cc09f072527daa9e35e328fd01a07af3bdd4ca1


6.7 查看当前集群信息

bash 复制代码
kubectl get nodes
bash 复制代码
kubectl get pod -n kube-system 
#返回所有运行 kube-system 命名空间中的 pod 的列表,以及每个 pod 的状态、运行时间和 IP 地址等信息
#kube-system 命名空间是用于存储 Kubernetes 系统组件和插件的命名空间
#查看这些组件和插件的状态和健康信息
相关推荐
运维螺丝钉1 小时前
docker安装应用
运维·docker·容器
optimistic_chen2 小时前
【Docker入门】cgroups 资源控制
linux·运维·ubuntu·docker·容器·cgroup
芥子沫3 小时前
书签管理工具使用:Readeck-Docker部署和使用技巧
运维·docker·容器·书签管理
ba_pi3 小时前
每天写点什么2026-01-19-docker如何使用GPU
运维·docker·容器
Gold Steps.3 小时前
K8S基于 Argo Rollouts 的高级版本发布实践
云原生·容器·kubernetes
七七powerful3 小时前
docker 部署dirsearch并进行目录遍历扫描
运维·docker·容器
王九思4 小时前
Docker访问权限问题
docker·云原生·容器
孤岛悬城4 小时前
61 K8s之Pod控制器与配置资源管理
云原生·容器·kubernetes
噎住佩奇4 小时前
kubeadm方式部署单节点k8s
云原生·容器·kubernetes
十月南城4 小时前
Kubernetes入门地图——核心对象、网络与存储的抽象关系与心智模型
网络·容器·kubernetes