k8s全称kubernetes,是一个为容器服务而生的可移植容器的编排管理工具,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。目前k8s已经主导了云业务流程,推动了微服务架构等热门技术的普及和落地。K8S在架构方面很好的解决了可用性、伸缩性。在部署运维层面、服务部署、服务监控、应用扩容和故障处理方面,K8S都提供了很好的解决方案。
K8S的架构:
准备的组件:三台CentOS7系统的服务器(一主二从),在每台服务器中分别安装docker(18.06.3),kubeadm(1.17.4),kubelet(1.17.4),kubectl(1.17.4)程序。
安装过程中需要注意的选项设置:
操作系统环境:CPU(2C) 内存(2G) 硬盘(50G)
安装流程为在VMWare中新建虚拟机→自定义→稍后安装操作系统→客户机操作系统选择为Linux(CentOS 64位)→设置CPU与内存→设置磁盘大小位50G→虚拟机设置中使用CentOS7的ISO映像文件。
CentOS安装过程中,软件选择为基础设施服务器,分区为自动分区,网络配置如下:
要注意的是,ip地址前三个字段需要与VMWare中NAT模式下的子网ip前面相同。最后一个字段随意。
采用MobaXTerm远程连接3台设备对其进行统一设置。在MobaXTerm中选中三个远程连接,使用多执行功能同时对其进行配置。
1)检查操作系统版本
cat /etc/redhat-release
2)主机名解析
为了方便后面集群节点间的直接调用,对其配置主机名解析。
vim /etc/host
# 主机名解析,编辑三台服务器的/etc/host文件,添加如下内容
192.168.160.100 master
192.168.160.101 node1
192.168.160.102 node2
配置成功后,可以互相ping通。
3)时间同步
kubernetes要求集群中的节点时间必须精确一致,这里使用chronyd服务从网络同步时间。
#启动chronyd服务
systemctl start chronyd
#设置chronyd服务开机自启
systemctl enable chronyd
#date命令验证
date
4)禁用iptables和firewalld服务
kubernetes和docker运行过程中和会产生大量的iptables规则,为了不让系统规则混淆,需要关闭。而CentOS中iptables服务本身不存在,不需要额外关闭,主要关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
5)禁用selinux
selinux是linux系统下的一个安全服务。如果不关闭,会在安装过程中遇到很多问题。
vim /etc/selinux/config
#修改config文件,将selinux值修改为disabled。注意,修改完毕后需要重启linux服务
SELINUX=disabled
6)禁用swap分区
swap分区指的是虚拟内存分区。启用swap设备会对系统性能产生负面影响,因此kubernetes要求每个节点都要禁用swap设备。
vim /etc/fstab
#注释掉swap分区一行,修改后需要重启linux服务
7)修改linux内核参数
#修改linux内核参数添加网桥过滤和地址转发功能
vim /etc/sysctl.d/kubernetes.conf
#重新加载配置
sysctl -p
#加载网桥过滤模块
modprobe br-netfilter
#查看是否加载成功
lsmod | grep br_netfilter
8)配置ipvs功能
在kubernetes中service有两种代理模型,其中ipvs性能要高一些。若想要使用该服务,需要手动载入ipvs模块。
注意,黑马程序员网课中提供的是ipvsadmin,但是无法顺利安装,需要改为ipvsadm
#安装ipvs和ipvsadm
yum install ipset ipvsadm -y
#添加需要加载的模块写入脚本文件
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
#为脚本添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
#执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
#查看是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
9)重启服务器
#1 切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yun.repos.d/docker-ce.repo
#2 查看当前镜像源中支持的docker版本
yum list docker-ce --showduplicates
#3 安装特定版本的docker-ce
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
#4 添加配置文件
mkdir /etc/docker
cat > /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdeiver=systemd"],
"registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
#5 启动docker
systemctl restart docker
#先切换为国内的镜像源
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
yum install --setopt=obsoletes=0 kubeadm=1.17.4-0 kubelet=1.17.4-0 kubectl=1.17.4-0 -y
#配置kubelet的cgroup
vim /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
#设置kubelet开机自启
systemctl enable kubelet
#先看看需要提前准备好的镜像
kubeadm config images list
#下载镜像
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
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
对集群进行初始化,将node节点加入到集群中
只在master节点上执行的操作
kubeadm init \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.160.100
#会返回需要创建必要文件和密钥的命令行,在master节点上复制粘贴创建必要文件的命令行段。
以下操作在node上完成
kubeadm join 192.168.160.100:6443 --token a4eiui.psghhb5jwxlb5qpd \
--discovery-token-ca-cert-hash sha256:0d2bd5cfce95a28db682ca6ba5d85fd8dd1de09aa579a8532c1bb88098b75abb
节点加入显示:
如果添加节点成功,那么在查询加入情况时,三个节点会全部显示ready:
kubernetes支持多种网络插件,如flannel、calico、canal等。这里使用flannel。以下操作均在master节点。
wget https://raw.githubusercontect.com/coreos/flannel/master/Documentation/kube-flannel.yml
#使用配置文件启动flannel
kubectl apply -f kube-flannel.yml
至此,kubernetes的集群环境搭建完成
#部署nginx
kubectl create deployment nginx --image=nginx:1.14-alpine
#暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
#查看服务状态
kubectl get pods,svc
service/nginx中的端口号可以通过IP+端口号在浏览器中访问。若访问成功,则配置成功
在配置过程中,由于node1节点配置失误,需要删除节点重新配置,走了很多弯路。先总结如下:
首先在master节点中采用如下代码移除node1节点:
kubectl delete node node1
然后再node1节点下采用如下代码脱离:
分别是删除/etc/kubernets/下的目录、kubelet重启、节点初始化。
[root@node1 ~]# rm -rf /etc/kubernetes/*
[root@node1 ~]# systemctl restart kubelet
[root@node1 ~]# kubeadm reset -f
重新加入则和之前操作一致。
配置过程中,由于node1节点配置失误,需要删除节点重新配置,走了很多弯路。先总结如下:
首先在master节点中采用如下代码移除node1节点:
kubectl delete node node1
然后再node1节点下采用如下代码脱离:
分别是删除/etc/kubernets/下的目录、kubelet重启、节点初始化。
[root@node1 ~]# rm -rf /etc/kubernetes/*
[root@node1 ~]# systemctl restart kubelet
[root@node1 ~]# kubeadm reset -f
重新加入则和之前操作一致。