一台master节点和多台node节点,搭建简单,但是有单机故障风险,适合用于测试环境
多台master节点和多台node节点,搭建麻烦,安全性高,适合用于生产环境
为了测试简单,本次搭建的是一主两从类型的集群
k8s有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包
现在需要安装k8s集群环境,但又不想过于麻烦,所以选择使用kubeadm的方式
虚拟机安装步骤自行百度,注意虚拟机配置至少2核2g内存,不然无法使用k8s集群
这样我们就能同时向三台虚拟机发送命令,同时观察三台虚拟机的状态了
使用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
注意:这只是开发学习中使用,生产环境中慎重关闭
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是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
[root@master ~]# vim /etc/selinux/config #将里面的SELINUX改为disabled SELINUX=disabled
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
启用swap设备会对系统的性能产生非常负面的影响,因此k8s要求每个节点都要禁用swap设备
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
[root@master ~]# vim /etc/fstab #将swap一行进行注释 #/dev/mapper/centos-swap swap
修改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
在k8s中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它的话,需要手动载入ipvs模块
安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadm -y
添加需要加载的模块写入脚本文件
[root@master ~]# cat </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
依旧发送键盘输入的所有会话
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
[root@master ~]# yum list docker-ce --showduplicates
#安装时必须指定--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 </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"] }
[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的镜像源在国外,这里切换成国内的镜像源
[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
[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
[root@master ~]# vim /etc/sysconfig/kubelet KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs"
[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
【文章福利】:C/C++Linux服务器开发/后台架构师【公开课学习】(C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg,大厂面试题 等)有需要的可以点击793599096加群领取哦~
[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地址
如果成功,你将会在最后两行看见如下消息
复制这两行消息
在节点一及节点二中粘贴刚刚复制的消息
在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
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 149m v1.17.4 node1 NotReady137m v1.17.4 node2 NotReady 137m v1.17.4
表明节点添加成功
注意:此操作只在master节点执行
[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 Ready3h23m v1.17.4 node2 Ready 3h23m v1.17.4
在k8s集群中部署一个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.1443/TCP 17h nginx NodePort 10.99.24.85 80:31892/TCP 33m
在浏览器中输入主机ip地址加上nginx的端口,我这里是31892
表明nginx已经正常开启了
转自https://www.cnblogs.com/Ayanamidesu/p/14926118.html