目 录
- 一、使用kubeadm方式搭建K8S集群
- ①Kubeadm方式搭建K8S集群
- ②安装要求
- 二、话不多说直接部署
- ①在所有主机上进行部署
- (2)设置主机的前期基本操作(所有主机)
- (2)各个主机之间的免密操作(仅在master上做一次即可所有主机免密登陆)
- (3)配置镜像源(所有主机)
- (4)安装常用工具、主机时间和系统时间同步(所有主机)
- (5)系统内核的升级(所有主机)
- (6)安装docker(所有主机)
- (7)安装kubelet(所有主机)
- ②在master节点上进行部署
- (1)初始化master节点(master节点)
- (2)创建 kubernetes 必要文件(master节点)
- (3)在Kubernetes集群中添加Node节点(master节点)
- (4)检查集群的状态(master节点)
- (5)测试k8s集群是否搭建成功(master节点)
- (6)测试集群部署的nginx服务是否成功(谷歌浏览器)
一、使用kubeadm方式搭建K8S集群
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
这个工具能通过两条指令完成一个kubernetes集群的部署:
# 创建一个 Master 节点
kubeadm init
# 将一个 Node 节点加入到当前集群中
kubeadm join <Master节点的IP和端口 >
①Kubeadm方式搭建K8S集群
使用kubeadm方式搭建K8s集群主要分为以下几步
- 准备三台虚拟机,同时安装操作系统CentOS 7.x
- 对三个安装之后的操作系统进行初始化操作
- 在三个节点安装 docker kubelet kubeadm kubectl
- 在master节点执行kubeadm init命令初始化
- 在node节点上执行 kubeadm join命令,把node节点添加到当前集群
- 配置CNI网络插件,用于节点之间的连通【失败了可以多试几次】
- 通过拉取一个nginx进行测试,能否进行外网测试
②安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多【注意master需要两核】
- 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
- 禁止swap分区
二、话不多说直接部署
机器准备:
角色 | IP |
master | 192.168.17.33 |
node1 | 192.168.17.66 |
node2 | 192.168.17.99 |
①在所有主机上进行部署
(2)设置主机的前期基本操作(所有主机)
# 设置主机名
[root@k8s-master-01 ~]# hostnamectl set-hostname k8s-master-01
# 添加hosts解析
[root@k8s-master-01 ~]# cat >> /etc/hosts << EOF
192.168.17.33 k8s-master-01
192.168.17.66 k8s-node-01
192.168.17.99 k8s-node-02
EOF
# 查看是否添加
[root@k8s-master-01 ~]# cat /etc/hosts | tail -3
192.168.17.33 k8s-master-01
192.168.17.66 k8s-node-01
192.168.17.99 k8s-node-02
注:下面为系统优化(所有主机)
# 关闭防火墙
[root@k8s-master-01 ~]# systemctl disable --now firewalld
# 关闭Selinux
[root@k8s-master-01 ~]# setenforce 0
setenforce: SELinux is disabled
# 关闭swap交换分区(以下三种情况各选一种)
(1)(临时关闭swap分区)
[root@k8s-master-01 ~]# swapoff -a
(2)(永久关闭swap分区)
[root@k8s-master-01 ~]# sed -i.bak '/swap/s/^/#/' /etc/fstab
(3)(修改/etc/fstab 让kubelet忽略swap分区)
[root@k8s-master-01 ~]# echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet
# 查看swap交换分区(确认关闭状态)
[root@k8s-master-01 ~]# free -h
total used free shared buff/cache available
Mem: 2.9G 205M 2.6G 9.4M 132M 2.6G
Swap: 0B 0B 0B
(2)各个主机之间的免密操作(仅在master上做一次即可所有主机免密登陆)
# 创建密钥对(所有主机都需要创建)
[root@k8s-master-01 ~]# ssh-keygen -t rsa
# 集群互传公钥(所有主机都需要执行该循环)
[root@k8s-master-01 ~]# for i in k8s-master-01 k8s-node-01 k8s-node-02;do ssh-copy-id -i ~/.ssh/id_rsa.pub root@$i; done
# 测试公钥是否互传成功(所有主机都需要测试)
[root@k8s-master-01 ~]# ssh k8s-master-01
Last login: Sat Aug 7 12:31:37 2021 from 192.168.17.1
[root@k8s-master-01 ~]# ssh k8s-node-01
Last login: Sat Aug 7 12:31:37 2021 from 192.168.17.1
[root@k8s-master-01 ~]# ssh k8s-node-02
Last login: Sat Aug 7 12:31:37 2021 from 192.168.17.1
(3)配置镜像源(所有主机)
# 添加阿里云镜像源
[root@k8s-master-01 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清空yum缓存和重新生成yum源
[root@k8s-master-01 ~]# yum clean all && yum makecache
(4)安装常用工具、主机时间和系统时间同步(所有主机)
# 更新系统
[root@k8s-master-01 ~]# yum update -y --exclud=kernel*
# 安装常用软件工具包
[root@k8s-master-01 ~]# yum install wget expect vim net-tools ntp bash-completion ipvsadm ipset jq iptables conntrack sysstat libseccomp -y
# 下载ntpdate工具
[root@k8s-master-01 ~]# yum install ntpdate -y
# 同步阿里云时间
[root@k8s-master-01 ~]# ntpdate ntp1.aliyun.com
7 Aug 15:13:12 ntpdate[23233]: adjust time server 120.25.115.20 offset 0.000932 sec
[root@k8s-master-01 ~]# hwclock --systohc
[root@k8s-master-01 ~]# hwclock
2021年08月07日 星期六 15时13分23秒 -0.444250 秒
[root@k8s-master-01 ~]# date
2021年 08月 07日 星期六 15:13:27 CST
(5)系统内核的升级(所有主机)
# 下载更新内核的安装包
[root@k8s-master-01 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 更新内核
[root@k8s-master-01 ~]# yum --enablerepo=elrepo-kernel install -y kernel-lt
# 查看当前主机可使用的的所有内核版本
[root@k8s-master-01 ~]# cat /boot/grub2/grub.cfg | grep menuentry
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
menuentry_id_option=""
export menuentry_id_option
menuentry 'CentOS Linux (5.4.137-1.el7.elrepo.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1160.el7.x86_64-advanced-3c49ddca-eb95-4f55-bccd-1781694c9ca6' {
menuentry 'CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1160.el7.x86_64-advanced-3c49ddca-eb95-4f55-bccd-1781694c9ca6' {
menuentry 'CentOS Linux (0-rescue-e7501b1c2d764242907ae8bd3ebbfbb9) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-e7501b1c2d764242907ae8bd3ebbfbb9-advanced-3c49ddca-eb95-4f55-bccd-1781694c9ca6' {
# 查看当前主机正在使用的内核版本
[root@k8s-master-01 ~]# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
# 修改启动内核版本,设置开机启动新内核(默认调动版本),设置完内核后,需要重启服务器才会生效
[root@k8s-master-01 ~]# grub2-set-default 'CentOS Linux (5.4.137-1.el7.elrepo.x86_64) 7 (Core)'
# 关闭默认的内核,启动新的内核 (5.4.137-1.el7.elrepo.x86_64)
[root@k8s-master-01 ~]# grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.4.137-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-5.4.137-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-e7501b1c2d764242907ae8bd3ebbfbb9
Found initrd image: /boot/initramfs-0-rescue-e7501b1c2d764242907ae8bd3ebbfbb9.img
done
# 查看当前默认启动的内核
[root@k8s-master-01 ~]# grubby --default-kernel
/boot/vmlinuz-5.4.137-1.el7.elrepo.x86_64
# 重启后查询内核
[root@k8s-master-01 ~]# reboot
[root@k8s-master-01 ~]# uname -r
5.4.137-1.el7.elrepo.x86_64
注释:安装ipvs(所有主机)和优化内核参数(所有主机)
# 安装IPVS
[root@k8s-master-01 ~]# 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
# 查看IPVS模块
[root@k8s-master-01 ~]# lsmod | grep ip_vs
ip_vs_ftp 16384 0
nf_nat 40960 1 ip_vs_ftp
ip_vs_sed 16384 0
ip_vs_nq 16384 0
ip_vs_fo 16384 0
ip_vs_sh 16384 0
ip_vs_dh 16384 0
ip_vs_lblcr 16384 0
ip_vs_lblc 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs_wlc 16384 0
ip_vs_lc 16384 0
ip_vs 155648 24 ip_vs_wlc,ip_vs_rr,ip_vs_dh,ip_vs_lblcr,ip_vs_sh,ip_vs_fo,ip_vs_nq,ip_vs_lblc,ip_vs_wrr,ip_vs_lc,ip_vs_sed,ip_vs_ftp
nf_conntrack 147456 2 nf_nat,ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
libcrc32c 16384 4 nf_conntrack,nf_nat,xfs,ip_vs
# 修改内核启动参数
[root@k8s-master-01 ~]#vim /etc/sysctl.d/k8s.conf
#将下面内容复制进去
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.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp.keepaliv.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.top_timestamps = 0
net.core.somaxconn = 16384
# 立即生效
[root@k8s-master-01 ~]# sysctl --system
...
* Applying /etc/sysctl.conf ...
(6)安装docker(所有主机)
# 卸载之前安装过得docker(若之前没有安装过docker,直接跳过此步)
[root@k8s-master-01 ~]# sudo yum remove docker docker-common docker-selinux docker-engine
# 安装docker需要的依赖包 (之前执行过,可以省略)
[root@k8s-master-01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker软件
[root@k8s-master-01 ~]# yum install docker-ce -y
# 配置镜像下载加速器
# 建立缓存加速文件
# 去阿里云找到镜像加速器服务,查看自己的加速器地址(每个人有专属的加速器地址)
#(查看本机加速器地址)
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
[root@k8s-master-01 ~]# mkdir /etc/docker
[root@k8s-master-01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["本机的加速器地址"]
}
# 启动docker并加入开机自启动
[root@k8s-master-01 ~]# systemctl enable docker && systemctl start docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
# 查看docker详细信息,也可看docker运行状态
[root@k8s-master-01 ~]# docker info
(7)安装kubelet(所有主机)
# 添加kubernetes镜像源
[root@k8s-master-01 ~]#vim /etc/yum.repos.d/kubernetes.repo
#复制下面内容
[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
#到此结束
# 安装kubeadm、kubelet、kubectl (版本更新频繁,指定版本号部署安装)
[root@k8s-master-01 ~]# yum install -y kubelet-1.21.3 kubeadm-1.21.3 kubectl-1.21.3
#注:此处如果安装K8S失败的话,请yum clean all && yum makecache
# 启动kubelet并加入开机自启动
[root@k8s-master-01 ~]# systemctl enable --now kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
②在master节点上进行部署
(1)初始化master节点(master节点)
# master节点初始化
# 注意--apiserver-advertise-address后面的IP地址!!!
[root@k8s-master-01 ~]# kubeadm init \
--apiserver-advertise-address=这边填写自己master节点的IP地址 \
--image-repository=registry.cn-shanghai.aliyuncs.com/yosigo \
--kubernetes-version=v1.21.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
#--ignore-preflight-errors=all
#参数详解:
–apiserver-advertise-address # 集群通告地址
–image-repository # 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
–kubernetes-version # K8s版本,与安装的一致
–service-cidr # 集群内部虚拟网络,Pod统一访问入口
–pod-network-cidr # Pod网络,与下面部署的CNI网络组件yaml中保持一致
# 查看下载的镜像
[root@k8s-master-01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-shanghai.aliyuncs.com/yosigo/kube-apiserver v1.21.3 3d174f00aa39 2 weeks ago 126MB
registry.cn-shanghai.aliyuncs.com/yosigo/kube-scheduler v1.21.3 6be0dc1302e3 2 weeks ago 50.6MB
registry.cn-shanghai.aliyuncs.com/yosigo/kube-controller-manager v1.21.3 bc2bb319a703 2 weeks ago 120MB
registry.cn-shanghai.aliyuncs.com/yosigo/kube-proxy v1.21.3 adb2816ea823 2 weeks ago 103MB
registry.cn-shanghai.aliyuncs.com/yosigo/pause 3.4.1 0f8457a4c2ec 6 months ago 683kB
registry.cn-shanghai.aliyuncs.com/yosigo/coredns v1.8.0 7916bcd0fd70 9 months ago 42.5MB
registry.cn-shanghai.aliyuncs.com/yosigo/etcd 3.4.13-0 8855aefc3b26 11 months ago 253MB
(2)创建 kubernetes 必要文件(master节点)
# 创建 kubernetes 必要文件(kuberctl执行文件)
[root@k8s-master-01 ~]# mkdir -p $HOME/.kube
[root@k8s-master-01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master-01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 查看当前的node节点
[root@k8s-master-01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master-01 NotReady control-plane,master 7m36s v1.21.3
注:安装集群网络插件flannel(master节点),解决上面的状态还是NotReady,下面我们需要网络插件,来进行联网访问
# flannel插件yml文件下载,下载到当前文件夹(默认文件名:kube-flannel.yml)
[root@k8s-master-01 ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#若下载不了,请到下面百度云自取kube-flannel.yml文件,然后上传到master节点上
[root@k8s-master-01 ~]# rz (选取刚刚下载的kube-flannel.yml文件)
#修改kube-flannel.yml文件内容
将 image: 的内容替换成我们自购建的镜像 registry.cn-shanghai.aliyuncs.com/yosigo/flannel:v0.14.0
[root@k8s-master-01 ~]# sed -i 's#image: quay.io/coreos/flannel:v0.13.0#image: registry.cn-shanghai.aliyuncs.com/yosigo/flannel:v0.14.0#' kube-flannel.yml
# 指定文件进行部署集群网络
[root@k8s-master-01 ~]# kubectl apply -f kube-flannel.yml
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
(3)在Kubernetes集群中添加Node节点(master节点)
- matser节点操作
# 集群命令生成,在master创建token(标识),生成join(加入master集群的命令,默认生成了CA证书)
[root@k8s-master-01 ~]# kubeadm token create --print-join-command
kubeadm join 192.168.17.33:6443 --token arfkui.nxm8di1u460qzbrt --discovery-token-ca-cert-hash sha256:abab375165a311c0918a69fa0554eeccceb22fdba4f77ef216e8d7926b70899d
默认token有效期为24小时,当过期之后,该token就不可用了,需要重新创建token。
# 使用openssl命令查看matser节点生成的CA证书信息
# 这步可忽略查看,这仅仅是个查看内容
[root@k8s-master-01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
abab375165a311c0918a69fa0554eeccceb22fdba4f77ef216e8d7926b70899d
- node节点操作
# node加入集群 (复制master节点生成的token输出信息到node节点,即可加入Kubernetes集群)
[root@k8s-node-01 ~]# kubeadm join 192.168.17.33:6443 --token arfkui.nxm8di1u460qzbrt --discovery-token-ca-cert-hash sha256:abab375165a311c0918a69fa0554eeccceb22fdba4f77ef216e8d7926b70899d
[root@k8s-node-02 ~]# kubeadm join 192.168.17.33:6443 --token arfkui.nxm8di1u460qzbrt --discovery-token-ca-cert-hash sha256:abab375165a311c0918a69fa0554eeccceb22fdba4f77ef216e8d7926b70899d
(4)检查集群的状态(master节点)
# 查看当前的node节点
[root@k8s-master-01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-01 Ready control-plane,master 43m v1.21.3
k8s-node-01 Ready <none> 56s v1.21.3
k8s-node-02 NotReady <none> 9s v1.21.3
注:安装命令提示工具(即K8S补全工具)
# 安装命令提示工具
[root@k8s-master-01 ~]# yum install -y bash-completion
[root@k8s-master-01 ~]# source /usr/share/bash-completion/bash_completion
[root@k8s-master-01 ~]# source <(kubectl completion bash)
[root@k8s-master-01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
(5)测试k8s集群是否搭建成功(master节点)
# 集群创建服务nginx测试
[root@k8s-master-01 ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
# 启动创建的实列,指定端口
[root@k8s-master-01 ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
# 查看服务pod状态
[root@k8s-master-01 ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-6799fc88d8-9vvht 1/1 ContainerCreating 0 18s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 30m
service/nginx NodePort 10.98.121.81 <none> 80:31316/TCP 7s
# 查看在哪个节点上运行服务
[root@k8s-master-01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6799fc88d8-9vvht 1/1 Running 0 73m 10.244.2.3 k8s-node-02 <none> <none>
(6)测试集群部署的nginx服务是否成功(谷歌浏览器)
访问:http://192.168.17.33:31316
K8S集群服务部署成功!!!