kubeadm和二进制安装k8s适用场景分析
kubeadm是官方提供的开源工具,是一个开源项目,用于快速搭建kubernetes集群,目前是比较方便和推荐使用的。kubeadm init 以及 kubeadm join 这两个命令可以快速创建 kubernetes 集群。Kubeadm初始化k8s,所有的组件都是以pod形式运行的,具备故障自恢复能力。
kubeadm是工具,可以快速搭建集群,也就是相当于用程序脚本帮我们装好了集群,属于自动部署,简化部署操作,证书、组件资源清单文件都是自动创建的,自动部署屏蔽了很多细节,使得对各个模块感知很少,如果对k8s架构组件理解不深的话,遇到问题比较难排查。
kubeadm适合需要经常部署k8s,或者对自动化要求比较高的场景下使用。
二进制:在官网下载相关组件的二进制包,如果手动安装,对kubernetes理解也会更全面。
Kubeadm和二进制都适合生产环境,在生产环境运行都很稳定,具体如何选择,可以根据实际项目进行评估。
实验环境
控制节点 192.168.1.128 master 2核4G
工作节点 192.168.1.129 node1 2核4G
工作节点 192.168.1.130 node2 2核4G
本文所需的安装包,下载
如果默认已配置,可忽略
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
配置主机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
看情况配置,可以配置,也可不配置,无影响。这里不做介绍
swapoff -a
vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
#如果是克隆的虚拟机,需要删除UUID
modprobe br_netfilter
echo "modprobe br_netfilter" >> /etc/profile
cat > /etc/sysctl.d/k8s.conf <.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
systemctl stop firewalld ; systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@master ~]#getenforce
Disabled
安装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源,默认已配置,一般不用动
上传至每台机器的/app/k8s/src
离线包下载
默认已配置,一般不用动
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
如果用firewalld不习惯,可以安装iptables :
#安装iptables
yum install iptables-services -y
#先禁用iptables,以后备用
service iptables stop && systemctl disable iptables
#清空防火墙规则
iptables -F
上传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
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
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可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
#上传初始化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状态,因为没有安装网络插件。
在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状态,说明没有安装网络插件
上传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集群正常运行了
[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网络插件已经被正常安装了
metrics-server是一个集群范围内的资源数据集和工具,同样的,metrics-server也只是显示数据,并不提供数据存储服务,主要关注的是资源度量API的实现,比如CPU、文件描述符、内存、请求延时等指标,metric-server收集数据给k8s集群内使用,如kubectl,hpa,scheduler等
注意:这个是k8s在1.17的新特性,如果是1.16版本的可以不用添加,1.17以后要添加。这个参数的作用是Aggregation允许在不修改Kubernetes核心代码的同时扩展Kubernetes API。
[root@master~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
增加如下内容:
- --enable-aggregator-routing=true
[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
[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%
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
[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
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
[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
[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 创建成功了
注意: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
浏览器打开:http://192.168.1.128/konga
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
根据提示添加集群,即可。