kubernetes介绍

Kubernetes是Google在2014年开源的一款容器集群系统,简称k8s
Kubernetes用于容器化应用程序部署、扩展和管理,目标是让容器化应用简单高效
官方网站:https://kubernetes.io/
官方文档:https://kubernetes.io/zh/docs/home/
K8S是一组服务器的集群,对节点(node)上的容器进行管理。
主要提供了如下的主要功能:
1.自我修复:一旦某-个容器崩溃,能够在1秒中左右迅速启动新的容器
2.弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
3.服务发现:服务可以通过自动发现的形式找到它所依赖的服务
4.负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
5.版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
6.存储编排:可以根据容器自身的需求自动创建存储卷

kubernetes 组件

Master组件

主要作用:集群的控制平面,集群的决策 负责管理k8s 集群管理

apiserver

Kubernetes API:集群统一入口,各个组件的协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给apiserver处理后再提交etcd存储
控制集群入口

scheduler

负责资源调度,按照预定的调度策略将Pod调度到相应Node上
例如 集群运行一个nginx容器,通过scheduler 根据调度策略计算 nginx 安装到那台对应的工作节点上(计算);

controller-manager

处理集群中常规的后台任务,一个资源对应一个控制器,而controller-manager就是负责管理这些控制器的
维护集群的状态。比如故障检测、自动扩展、滚动更新等
例如 集群运行一个nginx容器,通过scheduler 根据调度策略计算 nginx 安装到那台对应的工作节点上(计算),在 通过controller-manager 安排 将nginx安装到对应的工作节点上(安排)。

etcd

分布式键值存储系统。用于保存集群状态数据,比如Pod。Service等对象信息
我们可以将etcd 改成mysql。

node组件

主要作用:集群的数据平面,负责为容器提供运行环境(工作节点)

kubelet

kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期。比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器
kubelet 发送命令给docker 来运行容器

kube-proxy

在Node节点或实现Pod网络代理,维护网络规则和四层负载均衡工作
访问程序的入口

kubernetes 环境搭建(基于Centos7.5版本搭建一主多从)

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

在这里插入图片描述
6.7.修改Linux内核参数

#修改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

在这里插入图片描述
8.9.重启Linux系统

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 images[@];dodockerpullregistry.cn−hangzhou.aliyuncs.com/googlecontainers/{images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/images[@];dodockerpullregistry.cnhangzhou.aliyuncs.com/googlecontainers/imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/imageNamek8s.gcr.io/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 (id−u):(id -u):(idu):(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集群环境就搭建成功啦!

Logo

开源、云原生的融合云平台

更多推荐