Kubernetes - CentOS7搭建k8s集群高可用(kubeadm/二进制包部署方式)实测配置验证手册
前言概述:
一、Kubernetes—k8s是什么
Kubernetes 这个名字源于希腊语,意为“舵手“或”飞行员"。
Kubernetes,简称K8s,中间有8个字符用8代替缩写。
Google于2014年开源项目,为容器化应用提供集群和管理的开源工具,Kubernetes目标是让部署容器化的应用简单并且高效,提供了应用部署,规划,更新,维护的一种机制。传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
主要特性:
1、高可用,不宕机,自动灾难恢复
2、灰度更新,不影响业务正常运转
3、一键回滚到历史版本
4、方便的伸缩扩展(应用伸缩,机器加减)、提供负载均衡有一个完善的生态
二、kubernetes 功能和架构
2.1 K8s 概述 :
Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过Kubernetes 能够进行应用的自动化部署和扩缩容。在Kubernetes中,会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Google 生产环境运行工作负载 15年的经验,并吸收了来自于社区的最佳想法和实践。
2.2 K8s 功能:
1)自动装箱 —基于容器对应用运行环境的资源配置要求自动部署应用容器
2)自我修复(自愈能力) —当容器失败时,会对容器进行重启,当所部署的Node 节点有问题时,会对容器进行重新部署和重新调度当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
3)水平扩展 —通过简单的命令、用户 UI界面或基于CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
4)服务发现 —用户不需使用额外的服务发现机制,就能够基于 Kubernetes 自身能力实现服务发现和负载均衡
5)滚动更新 —可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
6)版本回退 —可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
7)密钥和配置管理 —在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署
8)存储编排 —自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
9)批处理 —提供一次性任务,定时任务;满足批量数据处理和分析的场景
三、kubernetes 集群搭建(kubeadm/二进制包部署方式)
此次我们以kubeadm部署方式演示验证
3.1 前置知识点
目前生产部署 Kubernetes 集群主要有两种方式:
1) kubeadm Kubeadm是一个K8s部署工具,提供kubeadm
init 和kubeadm join,用于快速部署Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
2)二进制包 从Github下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。 Kubeadm
降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署 Kubernetes
集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。3.2 kubeadm 部署方式介绍 kubeadm 是官方社区推出的一个用于快速部署kubernetes
集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
1)创建一个 Master 节点 kubeadm init
2)将 Node 节点加入到当前集群中 $ kubeadm join <Master节点的IP和端口>
四、安装要求
在配置Kubernetes集群节点之前,需要满足以下几个条件:
4.1 操作系统:支持Linux操作系统,推荐使用Ubuntu、CentOS等常见发行版;
4.2 主机数量:至少需要3台主机,建议一台用于Master节点,两台用于Worker节点;
4.3 硬件配置:至少2个CPU、2GB内存,硬盘30GB;
4.4 网络通信:集群中所有机器之间网络互通;
4.5 网络通信:可以访问外网,需要拉取镜像(需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点);
4.6 禁止SWAP分区 (kubernetes的想法是将实例紧密包装到尽可能接近100%。 所有的部署应该与CPU /内存限制固定在一起。 所以如果调度程序发送一个pod到一台机器,它不应该使用交换。设计者不想交换,因为它会减慢速度,所以关闭swap主要是为了性能考虑)。
五、最终目标/提纲
5.1 在所有节点上安装 Docker 和 kubeadm
5.2 部署 Kubernetes Master
5.3 部署容器网络插件
5.4 部署 Kubernetes Node,将节点加入 Kubernetes 集群中
5.5 部署 Dashboard Web 页面,可视化查看 Kubernetes 资源
六、学习课程前提
6.1 熟悉 Docker 的基本使用
6.2 熟悉 Linux 操作系统
相关环境:
实测步骤:
1、搭建三台虚拟机并安装操作系统CentOS_7.9
2、三台系统进行初始化操作环境
3、在三台节点安装docker kubelet kubeadm kubectl
4、在Master节点安装kubeadm init命令进行初始化
5、在Node节点执行kubeadm join命令将node节点添加到集群
6、在Master节点安装CNI配置插件,如flannel等
7、测试kubernetes集群,如nginx
8、部署Dashboard Web 页面,可视化查看 Kubernetes 资源
开始搬砖:
一、系统初始化(ALL节点)
# 替换国内源配置
ls /etc/yum.repos.d/
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak # 备份当前源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 阿里云 CentOS 7源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo # 网易163 CentOS 7源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.myhuaweicloud.com/repo/CentOS-7.repo # 华为云CentOS 7源# 清空缓存
yum clean all
# 生成缓存
yum makecache
# 安装前最好更新一下系统软件
yum -y install vim
yum -y install unzip
yum -y install lrzsz
yum -y update
# IP配置
ip address
vi /etc/sysconfig/network-scripts/ifcfg-ens192
systemctl restart network# 主机名配置
Hostname
hostnamectl set-hostname k8s-master # 192.168.10.160
hostnamectl set-hostname k8s-node01 # 192.168.10.161
hostnamectl set-hostname k8s-node02 # 192.168.10.162
# 防火墙配置
systemctl stop firewalld # 关闭
systemctl disable firewalld # 禁用
firewall-cmd --reload # 重启防火墙,生效配置# SELinux安全机制配置
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时关闭
# 关闭SWAP
swapoff -a # 临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久 (需重启)
# 设置host映射和主机名
vim /etc/hosts或脚本
cat >> /etc/hosts << EOF
192.168.10.160 k8s-master
192.168.10.161 k8s-node01
192.168.10.162 k8s-node02
EOF
# 将桥接的 IPv4 流量传递到 iptables 的链(内核参数修改---在所有主机上将桥接的ipv4流量传递到iptables的链将桥接的IPv4流量传递到iptables的链(有一些ipv4的流量不能走iptables链,因为linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失),配置kubernetes.conf文件(kubernetes.conf文件原来不存在,需要自己创建的)
vim /etc/sysctl.d/k8s.conf
-------------------------------------------
或脚本
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p # 生效
# 同步NTP时间
yum install -y ntpdate # 安装NTP
ntpdate time.windows.com # 同步NTP服务器系统网络时间
# 统一重启
reboot
二、安装Docker/kubeadm/kubelet (ALL节点)
2.1 安装Docker
Dockershim中间件会一直保留到2021年末,直到发布Kubernetes1.23版本为止。2022年k8s的1.24版本正式剔除dockershim,不再支持让docker去调用containerd,而是直接操作containerd,先安装containerd来替换CRI接口调用。
本次验证v1.18.0版本,后续再验证最新v1.28.0版本。 Kubernetes 1.18.0版本默认 CRI(容器运行时)为Docker,因此先安装Docker,可参考之前部署手册
# 安装依赖包yum install -y yum-utils device-mapper-persistent-data lvm2# 安装 Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 查看仓库中所有的docker版本
yum list docker-ce --showduplicates | sort -r# 不指定版本号即默认安装
yum install -y docker-ce
# 如果要指定版本号安装
yum install docker-ce-18.06* -y ,此时指定的就是docker-ce-18.06.1的版本
yum install -y docker-ce-18.06.1.ce-3.el7
# 启动docker并设置docker开机自启服务
systemctl start docker
systemctl enable docker# 测试验证docker是否安装成功
docker version# 永远的HelloWorld
docker run hello-world
# 镜像加速配置
1、URL:目前我这边测试环境使用阿里云容器镜像服务:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
2、注册账户:当然还有腾讯网易等都可以使用不指定,注册一个属于自己的阿里云账户
3、登入获取加速器地址及脚本:登陆阿里云开发者平台--点击控制台---选择容器镜像服务---获取加速器地址---粘贴脚本直接执行
4、重启服务器mkdir -p /etc/docker
vim /etc/docker/daemon.json
或脚本
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://k******f.mirror.aliyuncs.com"]
}
EOF
# 重启服务
systemctl restart docker
# 查看生效信息
docker info
2.2 安装kubeadm、kubelet、kubectl
kubeadm和kubectl都是工具,kubelet才是系统服务
安装包说明:
kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
kubeadm 用于初始化集群,启动集群的命令工具
kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
# 配置k8s镜像源
# 添加 yum 源
vim /etc/yum.repos.d/kubernetes.repo
或脚本
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes Repo
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
gpgcheck=0
enabled=1
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpgphttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 查询kubeadm可用的版本
yum list kubeadm --showduplicates# 安装kubeadm、kubelet、kubect,# 此次测试验证v1.24之前版本,最新v1.28.2
yum install -y kubeadm-1.18.0 kubelet-1.18.0 kubectl-1.18.0# 设置kubelet开机自启(先不用启动,会报错,后面kubeadm init初始化master时会自动拉起kubelet)
systemctl enable kubelet
四、集群初始化Kubernetes Master
在Master节点安装kubeadm init命令进行初始化
4.1 k8s-master节点初始化 (在192.168.10.160 k8s-master节点操作)
# 集群初始化
kubeadm init --apiserver-advertise-address=192.168.10.160 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
或脚本(去掉##注释,脚本 \ 后面不能有空格)
kubeadm init \ #在master节点执行初始化(node节点不用执行)
--apiserver-advertise-address=192.168.10.160 \ #指定apiserver的IP,即master节点的IP,指定master的interface
--image-repository registry.aliyuncs.com/google_containers \ #设置镜像仓库为国内的阿里云镜像仓库
--kubernetes-version v1.18.0 \ #设置k8s的版本,跟步骤三的kubeadm版本一致
--service-cidr=10.96.0.0/12 \ #设置node节点的网络
--pod-network-cidr=10.244.0.0/16 #指定Pod服务的虚拟IP地址范围,设置node节点的网络
#--------------------------------------#
# 记录kubeadm join的输出,后面需要这个命令将各个节点加入集群中
输出 Your Kubernetes control-plane has initialized successfully!
表示master节点安装成功。
#如果失败可以重置,注意版本。如安装成功后直接跳到下一步。
kubeadm reset
rm -rf $HOME/.kube/config
# 根据提示执行,使用 kubectl 工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 查看集群节点
kubectl get nodes
五、将Node节点全部加入到集群
在Node节点执行kubeadm join命令将node节点添加到集群
在k8s-node01/node02节点操作,把node节点加入集群
# 向集群添加新节点,执行在kubeadm init输出的kubeadm join命令
kubeadm join 192.168.10.160:6443 --token ntpc3i.81ga63fqtkprsrx8 \--discovery-token-ca-cert-hash sha256:399fced327c9274c660325648300b822aa3714f42b466f0edbba2cb32b754ae8
选择语言默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作命令如下:
kubeadm token create --print-join-command
# 在master节点上,再次查看集群节点,输出如下信息表示node节点加入集群成功
kubectl get nodes
状态为NotReady未准备就绪是因为需要部署网络插件才能生效。
六、部署Pod(CNI)网络插件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 默认镜像地址无法访问,sed命令修改为dockerhub镜像仓库:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 运行所有插件
kubectl get pods -n kube-system
-----------------------------------------------------------------------
NAME READY STATUS RESTARTS AGE
coredns-7ff77c879f-ctd28 1/1 Running 0 6d17h
coredns-7ff77c879f-xpbd9 1/1 Running 0 6d17h
etcd-k8s-master 1/1 Running 0 6d17h
kube-apiserver-k8s-master 1/1 Running 0 6d17h
kube-controller-manager-k8s-master 1/1 Running 0 6d17h
kube-proxy-6chlp 1/1 Running 0 6d17h
kube-proxy-7rfbc 1/1 Running 0 6d17h
kube-proxy-mzmsg 1/1 Running 0 6d17h
kube-scheduler-k8s-master 1/1 Running 0 6d17h
# 启动所有插件后,再观察集群活动状态为Ready,准备就绪了
kubectl get nodes
七、测试验证kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行
# 拉取nginx镜像
kubectl create deployment nginx --image=nginx
# 开通80端口对外
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看运行状态
kubectl get pod,svc
-----------------------------------------------------------------------
NAME READY STATUS RESTARTS AGE
pod/nginx-f89759699-zgrqt 1/1 Running 0 2m44sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d17h
service/nginx NodePort 10.104.45.57 <none> 80:30400/TCP 9s
# 测试访问地址:http://NodeIP:Port
http://192.168.10.160:30400/
http://192.168.10.161:30400/
http://192.168.10.162:30400/
八、部署可视化图形管理应用程序Dashboard
在Master节点安装Dashboard Dashboard是k8s的一套桌面管理应用,通过Dashboard我们可以通过可视化的方式查看k8s集群的状态,执行相关的操作,但没有kubectl来的简单直接,因人而异,选择合适自己的方式就是最好的。
Dashboard是官方提供的一个UI,可用于基本管理K8s资源。
8.1 查看pod运行情况
kubectl get pods -A -o wide
8.2 确认版本,本次验证版本K8S_v1.18.0,对应匹配版本Dashboard 2.0.3
kubectl version
-----------------------------------------------------------------------Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:58:59Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:50:46Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
8.3 下载对应recommended.yaml文件
# 国外链路如无法下载重试几次即可或者直接下载到本地执行也可。
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
8.4 修改recommended.yaml文件
# 修改kubernetes-dashboard的service类型为NodePort类型,使用nodeport方式访问Dashboard 。
vim recommended.yaml# 需要修改的内容如下所示
---
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:type: NodePort #增加 ports:- port: 443targetPort: 8443nodePort: 30001 #增加 设定图形界面自定义的端口号 selector:k8s-app: kubernetes-dashboard
---
8.5 安装Dashboard yaml
# 在master点执行安装kubernetes-dashboard.yaml
kubectl apply -f kubernetes-dashboard.yaml
8.6 确认Dashboard 关联pod和service的状态
[root@k8s-master ~]# kubectl get pods -n kubernetes-dashboard# [root@k8s-master ~]# kubectl get svc -A
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-6b4884c9d5-xc4ww 1/1 Running 0 15h
kubernetes-dashboard-7f99b75bf4-bflj5 1/1 Running 0 15h
[root@k8s-master ~]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.111.65.58 <none> 8000/TCP 15h
kubernetes-dashboard NodePort 10.98.117.240 <none> 443:30001/TCP 15h
8.7 创建 ServiceAccount和ClusterRoleBinding资源YAML文件
创建dashboard管理员dashboard-admin,默认Dashboard为最小RBAC权限,添加集群管理员权限以便从Dashboard操作集群资源
# 创建dashboard-admin.yaml文件
vim dashboard-admin.yaml
# 添加以下全部内容
---
apiVersion: v1
kind: ServiceAccount
metadata:name: dashboard-adminnamespace: kubernetes-dashboard---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: dashboard-admin
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: dashboard-adminnamespace: kubernetes-dashboard
---
8.8 创建admin-user并且赋予admin-user集权管理员权限
[root@k8s-master ~]# kubectl create -f dashboard-admin.yaml
serviceaccount/dashboard-admin created
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
8.9 浏览器访问Dashboard UI
敲黑板:建议用火狐或360浏览器登入访问,注意是https 443加密
查看dashboard界面https://IP:30001,浏览器访问打开链接
https://192.168.10.160:30001
8.10 查看Token
# 获取Token,用于登录Dashboard UI
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')
secret | grep dashboard-admin | awk '{print $1}')
Name: dashboard-admin-token-z4552
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: dashboard-adminkubernetes.io/service-account.uid: 1ee2a9a2-9c62-4f5d-80ba-0607414bb8eb
Type: kubernetes.io/service-account-token
Data
====
token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ii0wWVliTTQzRmVLYThnbk80OFFSbkF2WUhuZ012Z2hlblZFa1k5M00tVTAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tejQ1NTIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMWVlMmE5YTItOWM2Mi00ZjVkLTgwYmEtMDYwNzQxNGJiOGViIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.C_H8FmgpWtsawNS4qArnZabnF7tbP7e55_iPGrsMqMWnFABEDlS9wBaADtNS3RNawqopN41gsHnK6tynN-E3KfP176ZvPGZYOX-Q72lTRlUSAcuBYTDwplHVqCU-rzQREb2Wy7FJFLe4S7GAnQl8IvU6EMUt0RZTbwotQE61XuPLuRiWva9730v4ml4IGgyQa_ACUTvvaQbviBJZcngLq2f5liwFD-jNs4yW9gWkHlAzid74FAKj84Jaitp0f8aiTgaw23iQ-JX_PVscfStXRxXMS0nOrOwg9pkREfZeym2q6MABxVxH3RS0CPCgL4nDljItoeNnsXLAhoLjSvz8aA
ca.crt: 1025 bytes
namespace: 20 bytes
8.11 输入上述获取到的token值登入
8.12 点击登录后进入dashboard,部署搬砖完成!
以上,感谢!