Kubernetes入门与安装配置
什么是K8S
Kubernetes 是一个跨主机集群的开源的容器调度平台,它可以自动化应用容器的部署、扩展和操作 , 提供以容器为中心的基础架构。谷歌旗下开源软件,江湖人称K8S。
K8S能做什么
- 自动化容器部署和复制
- 随时扩展和收缩容器规模
- 容器分组Group,并且提供容器间的负载均衡
- 实时监控,及时故障发现,自动替换
只需要通过脚本规划好容器在哪台服务器运行、运行多少副本,K8S都能自动创建部署,K8S还支持自动或者手动的调节容器规模,例如数据库压力大时,动态增加数据的计算单元,服务器压力小时动态缩减tomcat的数量。K8S还支持容器间的负载均衡,通常在项目中做集群部署,大多使用Nginx做前置服务器分发请求,但是现在完全可以交给K8S去做负载均衡,因为K8S提供了容器间的负载均衡。K8S还支持实时监控,自动处理故障,当某个应用服务挂掉时,K8S会剔除掉对应服务并尝试自动重启服务。
K8S的几个关键概念
- pod
- container(容器)
- Label(标签)
- Replication Controller(复制控制器)
- service(服务)
- Node(节点)
- Kubernetes Master(K8S主节点)
上图是一个通过K8S搭建的集群环境,采用三台物理机搭建(三台机器是K8S搭建集群的最低要求),我先简单介绍一下几个重点名词。
1.Kubernetes Master 是K8S的主服务器,容器的部署、发布、复制都是通过它发起的命令,一般是部署在单独的物理机上。同时所有外界的数据包也都是先经过Kubernetes Master,由它来进行分配。
2.Node 是集群的节点,它可以是一个独立的物理机,也可以是一个虚拟机,在每个节点中都有一个以上的pod。Node里面的功能都是通过docker、kubelet、kube-proxy这三个应用程序实现。
- docker,K8S容器编排技术就是dokcer容器实现的,必备组件。
- kubelet是用来处理master 下发的任务, 管理pod 中的容器, 注册自身所在的节点,以系统服务的方式呈现。
- kube-proxy用于实现K8S跨主机跨容器的网路通信,之前我们提到的Pod与Pod之间、容器与容器之间(Pause)的通信都是通过它来实现。
3.pod是K8S独有的概念,也是最基础最重要的概念。 中文释义有豆荚,豌豆的意思。它是K8S里面最小的控制单元,相比docker中容器是最小的控制单元,他们之间又有什么联系与区别呢?
- Pod是“容器”的容器,可以包含多个”Container”,这就是与docker容器的区别,Pod就像一个豌豆荚包含了多个豆子,他包含了多个容器
- Pod是K8S最小可部署单元,一个Pod就是一个进程,拥有自己独立的资源
- Pod都是部署完整的应用或模块,一般情况下一个Pod中应该是一整套完整的服务,或者一整套功能性的模块
- Pod内部容器网络互通的(通过Pause实现),每个Pod都有独立虚拟IP,Pod与Pod之间的通信通过Service服务实现,所有的通信底层都是基于kube-proxy的。
1.Pause是Pod的组成部分之一,Pause的一个作用是让同一个Pod的容器间可以直接使用localhost加端口号的形式互相访问
2.Pause还提供同一个Pod内所有容器的公共数据卷挂载功能 - 4.Label 标签可以理解为每一个Pod的别名
5.Replication Controller 复制控制器的职责是对Pod数量进行监控,例如我们命令中需要三个Pod,但是现在只有两个,那么Replication Controller会自动创建一个新的Pod,当它发现某个Pod没有响应时,Replication Controller会自动剔除这个Pod,如果有必要会创建新的Pod。它让我们可以通过一个参数直接修改Pod的数量。
K8S安装教程
环境准备
Centos 7 Master * 1 (注意必须是双核以上的CPU,否则无法初始化K8S)
- 192.168.220.131
Centos 7 Node * 2
- 192.168.220.132
- 192.168.220.133
1.设置主机名与时区
timedatectl set-timezone Asia/Shanghai
hostnamectl set-hostname master #131执行
hostnamectl set-hostname node1 #132执行
hostnamectl set-hostname node2 #133执行
2.为了便于区分,三台机器均配置以下hosts
192.168.220.131 master
192.168.220.132 node1
192.168.220.133 node2
3.关闭Linux自带的安全增强模块,设置临时生效,并且关闭防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
K8S安装前置环境配置(三台机器都要执行)
1.将镜像包上传至服务器每个节点,里面包含了K8S、docker、以及各类配置文件,后面会有概述各个文件的作用。
mkdir /usr/local/k8s-install
cd /usr/local/k8s-install
将文件上传至该目录
kubernetes-1.14https://www.aliyundrive.com/s/cEE3LwqssCQ
提取码: 88ym
2.每个Centos上安装Docker,注意不要使用19.0以上的docker版本,目前最新的1.15版本K8S也暂时不支持19.0的版本
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf docker-ce-18.09.tar.gz
cd docker
yum localinstall -y *.rpm #加载当前目录下的所有rpm文件自动完成安装
systemctl start docker
systemctl enable docker
3.确保cgroup driver都是 groupfs
- cgroups是control groups的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
- cgroups是实现IaaS虚拟化(kvm、lxc等),PaaS容器沙箱(Docker等)的资源管理控制部分的底层基础。
- 子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。
- 在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源
虽然在现在版本的K8S会提示使用Linux自带的“Systemd”做为cgroup driver,但Systemd与cgroupfs作用相同,只不过cgroupfs是docker自带的,而systemd是linux系统自带的。早期k8s并没有建议使用Systemd,所以一直沿用到1.14。除非是极端情况下,默认使用docker自带的cgroupfs即可。
执行以下命令
docker info | grep cgroup
如果不是groupfs,执行下列语句
cat << EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
EOF
systemctl daemon-reload && systemctl restart docker\
4.安装kubeadm,kubeadm是集群部署管理工具,可用来安装K8S的一个工具,极大简化安装流程
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm
5.关闭交换区,Linux的交换区类似windows系统中虚拟内存,不太建议使用这个选项,关闭掉
swapoff -a
vi /etc/fstab
将最后一行注释
6.配置网桥,iptables是Linux的一个网络规则,对我们的包按规则进行过滤。该配置让K8S容器间通过网桥通讯的时候也要遵循iptables的规则,提高网络传输安全性
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
7.加载k8s的docker镜像
cd /usr/local/k8s-install/kubernetes-1.14
docker load -i k8s-114-images.tar.gz #加载K8S镜像
docker load -i flannel-dashboard.tar.gz #集群可视化管理组件
运行docker images可以看到以下几个关键应用
kube-proxy 容器间通讯代理、kube-apiserver API服务端、kube-scheduler 任务调度器、kube-controller-manager 集群控制器、coredns K8S内置的 DNS 服务器、etcd 用于保存集群所有的网络配置和对象的状态信息、pause前面已经提到用于容器间的通讯以及数据卷的挂载。至此K8S安装完成
K8S集群安装配置
master主服务器配置,kubernetes-version表示安装K8S的版本,pod-network-cidr设置pod的虚拟IP范围
kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16
图中的第一个红框的命令是需要管理员手动复制,然后在master服务器上执行的。
mkdir -p $HOME/.kube #创建.kube目录
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config #拷贝admin.conf文件到刚刚创建的目录
sudo chown $(id -u):$(id -g) $HOME/.kube/config #进行相应的授权
PS: admin.conf是kubeadm集群管理的核心配置文件,包含整个集群各个节点的授权信息,以及本身的一些配置信息
第二个红框中的命令是在node节点上执行,里面包含了一个加入集群的token认证信息以及ca证书的hashcode。通过该token可以加入K8S集群.
2.执行 kubectl get nodes 查看当前集群的所有节点
从图中看到master节点处于NotReady状态,说明节点中存在有问题的Pod,查看存在问题的pod,执行以下命令查看所有Pod状态
kubectl get pod --all-namespaces
如果某个Pod的STATUS处于CrashLoopBackOff状态表示创建失败了,那么它会不断自动重新创建。上图中两个coredns处于pending状态,原因是我们没有配置K8S网络通讯协议fannel,从上传的文件中加载并创建flannel网络组件
kubectl create -f kube-flannel.yml
3.在node节点上执行刚刚由kubeadm生成的节点加入命令
kubeadm join 192.168.220.131:6443 --token 25x9dp.3k4ysps4xeuv7lm5 \
--discovery-token-ca-cert-hash sha256:ef7751d4347df3a8b401c53588c8ee8376cb100c7f14c550c2d175a266b8b6a9
如果出现反复无法加入节点的情况,运行 kubeadm reset 这条命令还原当前节点上 kubeadm init 或者 kubeadm join 所做的所有更改。当想加入新节点忘记token时可以使用 kubeadm token list 查看token,或者 kubeadm token create创建token,采用跳过ca安全认证的方式加入节点。
kubeadm join 192.168.220.131:6443 --token 25x9dp.3k4ysps4xeuv7lm5 --discovery-token-unsafe-skip-ca-verification
4.三台机器设置kubelet开机自启,至此通过kubeadm集群配置完成
csystemctl enable kubelet
安装K8S可视化仪表盘
在主节点上执行以下命令,以下三个配件都是已经配置好的,装载即可。
kubectl apply -f kubernetes-dashboard.yaml # web-ui 配置文件
kubectl apply -f admin-role.yaml # 角色配置
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml #角色的权限配置
kubectl -n kube-system get svc #获取系统命名空间下的所有服务
图中dashboard服务已经被创建,配置文件中关闭了密码验证,只需要浏览器打开 http://192.168.220.131:32000无需登录。
K8S仪表盘
进入docker
作者:远古程序猿