Kubernetes是Google在2014年开源的一款容器集群系统,简称k8s
Kubernetes用于容器化应用程序部署、扩展和管理,目标是让容器化应用简单高效
官方网站:https://kubernetes.io/
官方文档:https://kubernetes.io/zh/docs/home/
K8S是一组服务器的集群,对节点(node)上的容器进行管理。
主要提供了如下的主要功能:
1.自我修复:一旦某-个容器崩溃,能够在1秒中左右迅速启动新的容器
2.弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
3.服务发现:服务可以通过自动发现的形式找到它所依赖的服务
4.负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
5.版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
6.存储编排:可以根据容器自身的需求自动创建存储卷
主要作用:集群的控制平面,集群的决策 负责管理k8s 集群管理
Kubernetes API:集群统一入口,各个组件的协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给apiserver处理后再提交etcd存储
控制集群入口
负责资源调度,按照预定的调度策略将Pod调度到相应Node上
例如 集群运行一个nginx容器,通过scheduler 根据调度策略计算 nginx 安装到那台对应的工作节点上(计算);
处理集群中常规的后台任务,一个资源对应一个控制器,而controller-manager就是负责管理这些控制器的
维护集群的状态。比如故障检测、自动扩展、滚动更新等
例如 集群运行一个nginx容器,通过scheduler 根据调度策略计算 nginx 安装到那台对应的工作节点上(计算),在 通过controller-manager 安排 将nginx安装到对应的工作节点上(安排)。
分布式键值存储系统。用于保存集群状态数据,比如Pod。Service等对象信息
我们可以将etcd 改成mysql。
主要作用:集群的数据平面,负责为容器提供运行环境(工作节点)
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期。比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器
kubelet 发送命令给docker 来运行容器
在Node节点或实现Pod网络代理,维护网络规则和四层负载均衡工作
访问程序的入口
1.一主多从: 在学习阶段我们只需要一台Master节点和多台Node节点,搭建简单,有单机发生故障风险,适合用于测试环境
2.多主多从:多台Master节点和多台Node节点,搭建有一些麻烦,安全系数高,适合用于生产环境
话不多说,我们开始,我们的目标是搭建一套一主多从的kubernetes 环境:
使用到的软件见下面:
Centos7.5下载链接:https://pan.baidu.com/s/1bfjGwpcTyfpuQqBQCcx-nw
提取码:12b5
VM工具链接:https://pan.baidu.com/s/1KIj32-Lkyz2kqv13wB_CkQ
提取码:5uri
1.安装一台干净的镜像centos服务器,配置如下(网上很多人说硬盘要50个G,实测不用):
2.克隆3台服务器,分别作为我们本次的master节点和两台node节点:
3.修改这三个节点的mac地址(重点),这样这三个节点起来后ip地址就会不一样
4.使用xshell工具连接三台节点
5.记录一下此时的vm服务器配置
ip地址 | 类型 | 操作系统 | 服务器配置 |
---|---|---|---|
192.168.18.128 | master | Centos7.5 | 2核CPU 2G内存 20G硬盘 |
192.168.18.132 | mode1 | Centos7.5 | 2核CPU 2G内存 20G硬盘 |
192.168.18.134 | node2 | Centos7.5 | 2核CPU 2G内存 20G硬盘 |
6.此时vm环境已经准备好了,开始初始化kubernetes的环境
6.1.检查操作系统的版本
#此方式下安装kubernetes集群要求Centos版本要在7.5或之上
cat /etc/redhat-release
6.2.主机名解析
为了方便后面集群节点间的直接调用,在这配置一下主机名解析, 企业中推荐使用内部DNS服务器
#主机名成解析编辑三台服务器的/etc/hosts文件,添加下面内容
vi /etc/hosts
192.168.18.128 master
192.168.18.132 node1
192.168.18.134 node2
效果如下:
每个服务器ping一下master、node1、node2
ping master
ping node1
ping node2
6.3.时间同步
kubernetes要求集群中的节点时间必须精确一致, 这里直接使用chronyd服务从网络同步时间。
企业中建议配置内部的时间同步服务器
yum install -y chrony
systemctl start chronyd
systemctl enable chronyd
6.4.禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
1.关闭firewalld服务[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
2.关闭iptables服务
[root@master ~]# systemctl disabled iptables
6.5.关闭selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
vi /etc/selinux/config 文件,修改SELINUX的值为disabled
#注意修改完毕之后需要重启 linux服务
SELINUX=disabled
6.6.禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
#编辑分区配置文件/etc/fstab,注释掉swap分区一行
vi /etc/fstab
#修改linux的内核参数,添加网桥过滤和地址转发功能
vi /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@localhost ~]# sysctl -p
#加载网桥过滤模块
[root@localhost ~]# modprobe br_netfilter
#查看网桥过滤模块是否加载成功
[root@localhost ~]# lsmod | grep br_netfilter
结果如下:
6.8.配置ipvs功能
在kubernetes中service有两种代理模型,-种是基于iptables的, - -种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
k8s service 会使用 ipvs/iptables
1安装ipset和ipvsadm
[root@localhost~]# yum install ipset ipvsadmin -y
2添加需要加载的模块写入脚本文件
[ root@localhost~]# 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
3为脚本文件添加执行权限
[root@localhost~]# chmod +x /etc/sysconfig/modules/ipvs.modules
4执行脚本文件
[root@localhost~]# sh +x /etc/sysconfig/modules/ipvs.modules
5查看对应的模块是否加载成功
[root@localhost~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
reboot
8.10开始安装kubernetes
8.10.1安装docker
1切换镜像源
[root@localhost~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
如果报错 -bash: wget: 未找到命令
则执行: yum -y install wget
2查看当前镜像源中支持的docker版本
[root@localhost ~]# yum list docker-ce --showduplicates
3安装特定版本的docker-ce
指定–setopt=obsoletes=0,否则yum会自动安装更高版本
[root@localhost~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
4添加一个配置文件 阿里云加速镜像
[root@localhost~]# mkdir /etc/docker
[ root@localhost~]# cat < /etc/docker/daemon.json
{
“exec-opts”: [“native.cgroupdriver=systemd”],
“registry-mirrors”: [ “https://yesbp2mq.mirror.aliyuncs.com”]
}
EOF
5启动docker
[root@localhost~]# systemctl start docker
[root@localhost~]# systemctl enable docker
6检查docker状态和版本
[root@localhost~]# docker --version
8.11安装kubernetes组件
1.由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源
2.vi /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
3.安装kubeadm、kubelet和kubectl
[root@localhost~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
4.配置kubelet的cgroup
5.vi /etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="–cgroup-driver=systemd"
KUBE_PROXY_MODE=“ipvs”
6.设置kubelet开机自启
[root@localhost~]# systemctl enable kubelet
8.12.准备集群镜像
在阿里云仓库中存在该镜像 在更改为k8s 官方的名称,同时需要在所有节点操作
#在安装k8s集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
1.kubeadm config images list
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
2.下载镜像
#此镜像在k8s的仓库中,由于网络原因,无法连接,下面提供了-种替代方案
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 i m a g e s [ @ ] ; d o d o c k e r p u l l r e g i s t r y . c n − h a n g z h o u . a l i y u n c s . c o m / g o o g l e c o n t a i n e r s / {images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/ images[@];dodockerpullregistry.cn−hangzhou.aliyuncs.com/googlecontainers/imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/ i m a g e N a m e k 8 s . g c r . i o / imageName k8s.gcr.io/ imageNamek8s.gcr.io/imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
执行docker images
8.13集群初始化
8.13.1.只需要在master节点上执行即可
kubeadm init
–kubernetes-version=v1.17.4
–pod-network-cidr=10.244.0.0/16
–image-repository registry.aliyuncs.com/google_containers
–service-cidr=10.96.0.0/12
–apiserver-advertise-address=192.168.18.132
注意:–image-repository 需要更改为阿里云加速镜像
–apiserver-advertise-address=192.168.18.132 修改为自己的 master的ip。
初始化大概需要花费1分钟左右
journalctl -xeu kubelet 查看日志
出现下图表示成功了!接着讲画红色框框的内容保存下来,准备在两个node节点执行
kubeadm join 192.168.18.128:6443 --token h9e0gd.f76uvzi6obhhw66k
–discovery-token-ca-cert-hash sha256:7a5e8dc336b9b9d05376eb93e0c7512a6283a79aa203b166bbd0a5295159ccf6
8.13.2.创建必要文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown ( i d − u ) : (id -u): (id−u):(id -g) $HOME/.kube/config
8.13.3.拷贝该到其他两个节点执行 加入 k8s集群环境
kubeadm join 192.168.18.128:6443 --token h9e0gd.f76uvzi6obhhw66k
–discovery-token-ca-cert-hash sha256:7a5e8dc336b9b9d05376eb93e0c7512a6283a79aa203b166bbd0a5295159ccf6
8.13.4.master上执行 kubectl get nodes
8.14.网络插件的安装
kube-flannel.yml 上传到Master节点任意位置
本文kube-flannel.yml
下载链接:https://pan.baidu.com/s/1nWt-l3IDz-b8Y38Y4-Cgqw
提取码:pnap
修改文件中quay.io仓库为quay-mirror.qiniu.com
#所有主机尽量都pull一下也是可以的(先执行这个,三台机器都要有这个镜像)
[root@master~]# docker pull quay.io/coreos/flannel:v0.12.0-amd64
#在master节点执行:
[root@master~]# kubectl apply -f kube-flannel.yml
耐心等待30-60s 查看状态 是否为 ready状态
kubectl get nodes
如果还是都是为 notready状态
则需要修改 每台节点的:vi /var/lib/kubelet/kubeadm-flags.env # 删除–network-plugin=cni
#重新启动
则需要修改 每台节点的
systemctl daemon-reload
systemctl restart kubelet
恭喜,现在整个k8s集群环境就搭建成功啦!