k8s集群环境搭建
环境规划
集群类型
一主多从
一台master节点和多台node节点,搭建简单,但是有单机故障风险,适合用于测试环境
多主多从
多台master节点和多台node节点,搭建麻烦,安全性高,适合用于生产环境
为了测试简单,本次搭建的是一主两从类型的集群
安装方式
k8s有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包
- minikube:一个用于快速搭建单节点的k8s的工具
- kubeadm:一个用于快速搭建k8s集群的工具
- 二进制包:从官网下载的每个组件的二进制包,依次去安装,此方式对于理解k8s组件更加有效
现在需要安装k8s集群环境,但又不想过于麻烦,所以选择使用kubeadm的方式
环境搭建
准备三台centos虚拟机,分别命名为master node1 node2
虚拟机安装步骤自行百度,注意虚拟机配置至少2核2g内存,不然无法使用k8s集群
使用xshell连接三台虚拟机
配置xshell同时向三台虚拟机输入命令
改变xshell布局为瓷砖排列
这样我们就能同时向三台虚拟机发送命令,同时观察三台虚拟机的状态了
环境初始化
检查centos版本
使用k8s集群要求centos版本在7.5及以上,在xshell中输入
[root@master ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
显示centos版本为7.9,符合要求
主机名解析
配置三台虚拟机的主机名到ip地址的映射
[root@master ~]# vim /etc/hosts
#在里面添加
你的master虚拟机的ip地址 master
你的node1虚拟机的IP地址 node1
你的node2虚拟机的ip地址 node2
ping主机名查看是否能成功连通
[root@master ~]# ping master [root@master ~]# ping node1 [root@master ~]# ping node2
如果都能ping通证明没有问题
开启时间同步
kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间
启动chronyd服务
[root@master ~]# systemctl start chronyd
设置chronyd服务开机自启
[root@master ~]# systemctl enable chronyd
使用date验证时间
[root@master ~]# date 2021年 06月 30日 星期三 09:51:14 CST
禁用iptables和firewalld服务
注意:这只是开发学习中使用,生产环境中慎重关闭
k8s和docker在运行过程中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
#关闭防火墙 [root@master ~]# systemctl stop firewalld #设置开机自动关闭防火墙 [root@master ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. #关闭iptables服务 [root@master ~]# systemctl stop iptables Failed to stop iptables.service: Unit iptables.service not loaded.
禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
[root@master ~]# vim /etc/selinux/config
#将里面的SELINUX改为disabled
SELINUX=disabled
禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
启用swap设备会对系统的性能产生非常负面的影响,因此k8s要求每个节点都要禁用swap设备
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
[root@master ~]# vim /etc/fstab
#将swap一行进行注释
#/dev/mapper/centos-swap swap
修改linux的内核参数
修改Linux的内核参数,添加网桥过滤和地址转发功能
[root@master ~]# vim /etc/sysctl.d/kubernetes.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1
重新加载配置
[root@master ~]# sysctl -p #加载网桥过滤模块 [root@master ~]# modprobe br_netfilter #查看网桥过滤模块是否加载成功 [root@master ~]# lsmod |grep br_netfilter br_netfilter 22256 0 bridge 151336 1 br_netfilter
配置ipvs功能
在k8s中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它的话,需要手动载入ipvs模块
安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadm -y
添加需要加载的模块写入脚本文件
[root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules > #!/bin/bash > modprobe -- ip_vs > modprobe -- ip_vs_rr > modprobe -- ip_vs_wrr > modprobe -- ip_vs_sh > modprobe -- nf_conntrack_ipv4 > EOF
为脚本文件添加权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
#执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
查看对应的模块是否加载成功
[root@master ~]# lsmod |grep -e ip_vs -e nf_conntrack_ipv4 nf_conntrack_ipv4 15053 0 nf_defrag_ipv4 12729 1 nf_conntrack_ipv4 ip_vs_sh 12688 0 ip_vs_wrr 12697 0 ip_vs_rr 12600 0 ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr nf_conntrack 139264 2 ip_vs,nf_conntrack_ipv4 libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
重启服务器
上述步骤完成之后,需要重启Linux系统
[root@master ~]# reboot
查看selinux是否是禁用状态
[root@master ~]# getenforce
Disabled
查看swap分区
[root@master ~]# free -m total used free shared buff/cache available Mem: 1819 166 1488 9 164 1504 Swap: 0 0 0
安装docker
依旧发送键盘输入的所有会话
切换镜像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
查看当前镜像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates
安装特定版本的docker-ce
#安装时必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本 [root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
添加一个配置文件
docker在默认情况下使用的Cgroup Driver为cgroupfs,而k8s推荐使用systemd来代替cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <<EOF> /etc/docker/daemon.json > { > "exec-opts":["native.cgroupdriver=systemd"], > "registry-mirrors":["https://knOt2bca.mirror.aliyuncs.com"] > } > EOF [root@master ~]# more /etc/docker/daemon.json { "exec-opts":["native.cgroupdriver=systemd"], "registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"] }
启动docker
[root@master ~]# systemctl start docker [root@master ~]# docker version Client: Version: 18.06.3-ce API version: 1.38 Go version: go1.10.3 Git commit: d7080c1 Built: Wed Feb 20 02:26:51 2019 OS/Arch: linux/amd64 Experimental: false Server: Engine: Version: 18.06.3-ce API version: 1.38 (minimum version 1.12) Go version: go1.10.3 Git commit: d7080c1 Built: Wed Feb 20 02:28:17 2019 OS/Arch: linux/amd64 Experimental: false
设置docker开机自启动
[root@master ~]# systemctl enable docker
安装kubernetes组件
由于kubernetes的镜像源在国外,这里切换成国内的镜像源
[root@master ~]# vim /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
安装kubeadm、kubelet和kubectl
[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
配置kubelet的cgroup
[root@master ~]# vim /etc/sysconfig/kubelet KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs"
设置kubernets开机自启
[root@master ~]# systemctl enable kubelet
准备集群镜像
在安装kubernetes集群之前,必须提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@node1 ~]# kubeadm config images list I0630 15:52:58.055686 9125 version.go:251] remote version is much newer: v1.21.2; falling back to: stable-1.17 W0630 15:53:00.822309 9125 validation.go:28] Cannot validate kube-proxy config - no validator is available W0630 15:53:00.822336 9125 validation.go:28] Cannot validate kubelet config - no validator is available k8s.gcr.io/kube-apiserver:v1.17.17 k8s.gcr.io/kube-controller-manager:v1.17.17 k8s.gcr.io/kube-scheduler:v1.17.17 k8s.gcr.io/kube-proxy:v1.17.17 k8s.gcr.io/pause:3.1 k8s.gcr.io/etcd:3.4.3-0 k8s.gcr.io/coredns:1.6.5
下载镜像
[root@master ~]# images=( kube-apiserver:v1.17.17 kube-controller-manager:v1.17.17 kube-scheduler:v1.17.17 kube-proxy:v1.17.17 pause:3.1 etcd:3.4.3-0 coredns:1.6.5 )
[root@master ~]# for imageName in ${images[@]};do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName done
查看镜像
[root@master ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE k8s.gcr.io/kube-proxy v1.17.17 3ef67d180564 5 months ago 117MB k8s.gcr.io/kube-apiserver v1.17.17 38db32e0f351 5 months ago 171MB k8s.gcr.io/kube-controller-manager v1.17.17 0ddd96ecb9e5 5 months ago 161MB k8s.gcr.io/kube-scheduler v1.17.17 d415ebbf09db 5 months ago 94.4MB k8s.gcr.io/coredns 1.6.5 70f311871ae1 20 months ago 41.6MB k8s.gcr.io/etcd 3.4.3-0 303ce5db0e90 20 months ago 288MB k8s.gcr.io/pause 3.1 da86e6ba6ca1 3 years ago 742kB
集群初始化
注意:此过程只需要在master节点上执行
创建集群
[root@master ~]# kubeadm init \ --kubernetes-version=v1.17.17 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --apiserver-advertise-address=你的master的ip地址
如果成功,你将会在最后两行看见如下消息
复制这两行消息
将节点加入k8s集群
在节点一及节点二中粘贴刚刚复制的消息
在master节点中添加配置
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config [root@master ~]# kubectl get nodes
查看kubernetes节点信息
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 149m v1.17.4 node1 NotReady <none> 137m v1.17.4 node2 NotReady <none> 137m v1.17.4
表明节点添加成功
安装网络插件
注意:此操作只在master节点执行
获取fannel的配置文件
[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果下载失败可以复制链接到你的电脑然后通过代理进行下载传到虚拟机中
运行安装命令
[root@master ~]# kubectl apply -f kube-flannel.yml 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
查看状态
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 3h34m v1.17.4 node1 Ready <none> 3h23m v1.17.4 node2 Ready <none> 3h23m v1.17.4
服务部署
在k8s集群中部署一个nginx程序,测试集群是否在正常工作
部署nginx
注意:此操作只在master节点上执行
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine deployment.apps/nginx created
暴露端口
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort service/nginx exposed
查看服务状态
[root@master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-6867cdf567-65vjr 1/1 Running 0 33m
[root@master ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h nginx NodePort 10.99.24.85 <none> 80:31892/TCP 33m
在浏览器中输入主机ip地址加上nginx的端口,我这里是31892
表明nginx已经正常开启了