使用kubeadm搭建k8s生产环境集群v1.23.1


1、基本介绍

kubeadm和二进制安装k8s适用场景分析

kubeadm是官方提供的开源工具,是一个开源项目,用于快速搭建kubernetes集群,目前是比较方便和推荐使用的。kubeadm init 以及 kubeadm join 这两个命令可以快速创建 kubernetes 集群。Kubeadm初始化k8s,所有的组件都是以pod形式运行的,具备故障自恢复能力。
kubeadm是工具,可以快速搭建集群,也就是相当于用程序脚本帮我们装好了集群,属于自动部署,简化部署操作,证书、组件资源清单文件都是自动创建的,自动部署屏蔽了很多细节,使得对各个模块感知很少,如果对k8s架构组件理解不深的话,遇到问题比较难排查。
kubeadm适合需要经常部署k8s,或者对自动化要求比较高的场景下使用。

二进制:在官网下载相关组件的二进制包,如果手动安装,对kubernetes理解也会更全面。
Kubeadm和二进制都适合生产环境,在生产环境运行都很稳定,具体如何选择,可以根据实际项目进行评估。


2、初始化安装k8s集群的实验环境,每台机器都要操作

实验环境

控制节点 192.168.1.128 master 2核4G
工作节点 192.168.1.129 node1 2核4G
工作节点 192.168.1.130 node2 2核4G

本文所需的安装包,下载

2.1. 修改机器IP和DNS

如果默认已配置,可忽略

vim /etc/sysconfig/network-scripts/ifcfg-ens33文件
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.1.128
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1
DEFROUTE=yes
NAME=ens33
DEVICE=ens33
ONBOOT=yes
  • 修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下:
service network restart

2.2. 配置主机hosts和机器名

配置主机hosts文件,相互之间可通过主机名互相访问

修改每台机器的/etc/hosts文件,增加如下三行:
192.168.1.128 k8s-master
192.168.1.129 k8s-node1
192.168.1.130 k8s-node2

在192.168.1.128上执行如下:
hostnamectl set-hostname k8s-master && bash 
在192.168.1.129上执行如下:
hostnamectl set-hostname k8s-node1 && bash
在192.168.1.130上执行如下:
hostnamectl set-hostname k8s-node2 && bash

2.3. 配置主机之间无密码登录

看情况配置,可以配置,也可不配置,无影响。这里不做介绍

2.4. 关闭交换分区swap,提升性能

  • 临时关闭
swapoff -a
  • 永久关闭:注释swap挂载,给swap这行开头加一下注释
vim /etc/fstab   
#/dev/mapper/centos-swap swap      swap    defaults        0 0
#如果是克隆的虚拟机,需要删除UUID

2.5. 修改内核参数

modprobe br_netfilter
echo "modprobe br_netfilter" >> /etc/profile
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

2.6. 关闭firewalld防火墙

systemctl stop firewalld ; systemctl disable firewalld

2.7. 关闭selinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  • 修改selinux配置文件之后,重启机器,selinux配置才能永久生效
[root@master ~]#getenforce
Disabled
  • 显示Disabled说明selinux已经关闭

2.8. 配置repo源

安装rzsz命令

yum install lrzsz -y

安装scp:

yum install openssh-clients

安装基础软件包

yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack ntpdate telnet ipvsadm

#配置epel源,默认已配置,一般不用动

2.9. 上传k8s组件离线包

上传至每台机器的/app/k8s/src

离线包下载

2.10. 配置时间同步

默认已配置,一般不用动

2.11. 开启ipvs

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules}; do
 /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
 if [ 0 -eq 0 ]; then
 /sbin/modprobe ${kernel_module}
 fi
done
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

2.12. 安装iptables

如果用firewalld不习惯,可以安装iptables :
#安装iptables

yum install iptables-services -y

#先禁用iptables,以后备用

service iptables stop   && systemctl disable iptables

#清空防火墙规则

iptables -F

3、安装docker服务

3.1.安装docker-ce

上传docker.tar.gz至/app/k8s/src

cd /app/k8s/src && tar -xf docker.tar.gz && cd /app/k8s/src/docker-20.10/
yum install -y *.rpm
systemctl start docker && systemctl enable docker.service

3.2.配置docker镜像加速器和驱动和docker默认存储位置

mkdir -p /data/docker
vim /etc/docker/daemon.json
{
 "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"],
 "exec-opts": ["native.cgroupdriver=systemd"],
 "graph": "/data/docker"
} 

#修改docker文件驱动为systemd,默认为cgroupfs,kubelet默认使用systemd,两者必须一致才可以。

systemctl daemon-reload  && systemctl restart docker
systemctl status docker

4、安装初始化k8s需要的软件包

cd /app/k8s/src
rpm -ivh *.rpm --force --nodeps
systemctl enable kubelet && systemctl start kubelet
systemctl status kubelet

#看到kubelet状态不是running状态,这个是正常的,不用管,等k8s组件起来这个kubelet就正常了。
注:每个软件包的作用
Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
kubelet: 安装在集群所有节点上,用于启动Pod的
kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

5、kubeadm初始化k8s集群

#上传初始化k8s集群需要的离线镜像包

docker pull harbor.com/pub-image/kube-apiserver:v1.23.1
docker pull harbor.com/pub-image/kube-proxy:v1.23.1
docker pull harbor.com/pub-image/kube-scheduler:v1.23.1
docker pull harbor.com/pub-image/kube-controller-manager:v1.23.1
docker pull harbor.com/pub-image/etcd:3.5.1-0
docker pull harbor.com/pub-image/coredns:v1.8.6
docker pull harbor.com/pub-image/pause:3.6

注:以上初始化步骤每台机器都要操作,离线镜像包请网上自行下载

注:以下步骤要区分master和node
#使用kubeadm初始化k8s集群

[root@master ~]# kubeadm init --kubernetes-version=1.23.1  --apiserver-advertise-address=192.168.1.128  --image-repository harbor.com/pub-image  --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification

显示如下,说明安装完成:
在这里插入图片描述
#配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理

[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# kubectl get nodes
NAME               STATUS    ROLES                  AGE   VERSION
cnsz92vl21370   NotReady   control-plane,master   2m47s   v1.23.1

此时集群状态还是NotReady状态,因为没有安装网络插件。

6、扩容k8s集群-添加第一个工作节点

在master1上查看加入节点的命令:

[root@master ~]# kubeadm token create --print-join-command

把node1/node2加入k8s集群:

[root@node1~]# kubeadm join 192.168.1.128:6443 --token 92k8q9.jojusveug21vkkhs \
        --discovery-token-ca-cert-hash sha256:443f2b57fef7c5606c4ee6576499d247f961b226b2329b1796bd3d949cc1c401

在这里插入图片描述
#看到上面说明node1节点已经加入到集群了,充当工作节点
#在master1上查看集群节点状况:

[root@master ~]# kubectl get nodes
NAME            STATUS     ROLES                  AGE     VERSION
cnsz92vl21369   NotReady   <none>                 19s     v1.23.1
cnsz92vl21370   NotReady   control-plane,master   8m30s   v1.23.1
cnsz92vl21371   NotReady   <none>                 31s     v1.23.1

#可以看到node的ROLES角色为空,就表示这个节点是工作节点。
#可以把node的ROLES变成work,按照如下方法:

kubectl label node cnsz92vl21371 node-role.kubernetes.io/worker=worker
kubectl label node cnsz92vl21369 node-role.kubernetes.io/worker=worker
NAME            STATUS     ROLES                  AGE     VERSION
cnsz92vl21369   NotReady   worker                 7m47s   v1.23.1
cnsz92vl21370   NotReady   control-plane,master   15m     v1.23.1
cnsz92vl21371   NotReady   worker                 7m59s   v1.23.1

注意:上面状态都是NotReady状态,说明没有安装网络插件

7、安装kubernetes网络组件-Calico

上传calico.yaml到master1上,使用yaml文件安装calico 网络插件 。
在线下载的配置文件注意修改镜像地址,离线包的calico.yaml地址已修改

[root@master ~]# kubectl apply -f  calico.yaml

注:在线下载配置文件地址是:https://docs.projectcalico.org/manifests/calico.yaml

再次查看集群状态。

[root@master ~]# kubectl get nodes
NAME            STATUS   ROLES                  AGE   VERSION
cnsz92vl21369   Ready    worker                 20m   v1.23.1
cnsz92vl21370   Ready    control-plane,master   28m   v1.23.1
cnsz92vl21371   Ready    worker                 20m   v1.23.1

[root@master ~]# kubectl get pods -n kube-system
在这里插入图片描述
#STATUS状态是Ready,说明k8s集群正常运行了

8、测试在k8s创建pod是否可以正常访问网络

[root@master1 ~]# kubectl run busybox --image busybox:latest --restart=Never --rm -it busybox -- sh
/ # ping baidu.com
PING baidu.com (100.65.188.7): 56 data bytes
64 bytes from 100.65.188.7: seq=0 ttl=55 time=1.554 ms

#通过上面可以看到能访问网络,说明calico网络插件已经被正常安装了

9、安装metrics-server组件

metrics-server是一个集群范围内的资源数据集和工具,同样的,metrics-server也只是显示数据,并不提供数据存储服务,主要关注的是资源度量API的实现,比如CPU、文件描述符、内存、请求延时等指标,metric-server收集数据给k8s集群内使用,如kubectl,hpa,scheduler等

9.1 部署metrics-server组件

注意:这个是k8s在1.17的新特性,如果是1.16版本的可以不用添加,1.17以后要添加。这个参数的作用是Aggregation允许在不修改Kubernetes核心代码的同时扩展Kubernetes API。

[root@master~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml

增加如下内容:

- --enable-aggregator-routing=true

在这里插入图片描述
重新更新apiserver配置:

[root@mcnsz92vl21370 ~]# kubectl apply -f  /etc/kubernetes/manifests/kube-apiserver.yaml
[root@cnsz92vl21370 ~]# kubectl get pods -n kube-system

#把CrashLoopBackOff状态的pod删除

kubectl delete pods kube-apiserver -n kube-system
kubectl apply -f metrics.yaml 

kubectl get pods -n kube-system | grep metrics
metrics-server-788c55759d-kb2rx            1/1     Running   0              111m

9.2 测试kubectl top命令

[root@cnsz92vl21370 ~]# kubectl top nodes
NAME            CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
cnsz92vl21369   104m         5%     1624Mi          44%       
cnsz92vl21370   171m         8%     1646Mi          44%       
cnsz92vl21371   120m         6%     1563Mi          42%

10、安装StorageClass持久化存储

Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。k8s 集群管理员通过创建storageclass可以动态生成一个存储卷pv供k8s pvc使用。storageclass 需要有一个供应者,用来确定我们使用什么样的存储来创建pv,常见的 provisioner 如下:
https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

以NFS为例,要想使用 NFS,我们需要一个 nfs-client 的自动装载程序,称之为 provisioner

10.1 搭建 nfs 服务

[root@cnsz92vl21370 ~]# yum install nfs-utils -y
mkdir /data/volumes -pv 
vim /etc/exports
/data/volumes 100.76.74.11(rw,no_root_squash)
/data/volumes 100.76.74.7(rw,no_root_squash)
/data/volumes 100.76.74.6(rw,no_root_squash)
#no_root_squash: 用户具有根目录的完全管理访问权限 

#使 NFS 配置生效

[root@cnsz92vl21370 ~]# exportfs -arv 
service nfs start 
systemctl enable nfs 
systemctl status nfs

10.2 在node1/node2测试nfs 服务,手动挂载试试

mount 192.168.1.128:/data/volumes /media
df -h
192.168.1.128:/data/volumes     60G  6.3G   54G  11% /media

#nfs 可以被正常挂载
#手动卸载:
[root@node1 ~]# umount /media

10.3 安装 nfs provisioner

[root@cnsz92vl21370 ~]# kubectl apply -f nfs-deployment.yaml
[root@cnsz92vl21370 ~]#  kubectl get pods -n kube-system | grep nfs
nfs-provisioner-5859c55c9-g7stx            1/1     Running   1              11m

10.4 创建 storageclass,动态供给 pv

[root@cnsz92vl21370 ~]# cat nfs-storageclass.yaml  
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: nfs-storage
provisioner: example.com/nfs
[root@cnsz92vl21370 ~]# kubectl apply -f nfs-storageclass.yaml 
#查看 storageclass 是否创建成功 
[root@cnsz92vl21370 ~]# kubectl get storageclass 
NAME   PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE    
nfs-storage       example.com/nfs         Delete          Immediate          

#显示内容如上,说明 storageclass 创建成功了

11、安装Kong

注意:Konga前端页面需要做持久化存储,需要storageclass 创建成功了才能执行。

kubectl apply -f kong-ingress.yaml
kubectl apply -f konga.yaml
#查看 kong是否创建成功
kubectl get pods  -n kong

在这里插入图片描述
#查看 kong是否创建成功
kubectl get pvc -n kong
在这里插入图片描述

11.1 访问konga

浏览器打开:http://192.168.1.128/konga
在这里插入图片描述

12 安装Kuboard + 持久化存储

Kuboard,是一款免费的 Kubernetes 图形化管理工具。
官网地址:https://kuboard.cn/install/v3/install.html
官网yaml文件:https://kuboard.cn/install-script/kuboard.yaml

kubectl apply -f kuboard-v3-storage-class.yaml
kubectl get pods -n kuboard
kuboard-etcd-0              1/1     Running   0                 52m
kuboard-v3-5458d845-4qqf2   1/1     Running   0                 8m56s

#pod运行正常,打开web看看
浏览器打开:http://192.168.1.128/k8s
用户名和密码默认:admin/Kuboard123
根据提示添加集群,即可。
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值