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内所有容器的公共数据卷挂载功能
  • kubesphere 配置绑核 kubernetes配置_kubernetes

  • 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

kubesphere 配置绑核 kubernetes配置_容器_02


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.14
https://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

将最后一行注释

kubesphere 配置绑核 kubernetes配置_Pod_03

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可以看到以下几个关键应用

kubesphere 配置绑核 kubernetes配置_kubesphere 配置绑核_04

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

kubesphere 配置绑核 kubernetes配置_kubernetes_05


图中的第一个红框的命令是需要管理员手动复制,然后在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

kubesphere 配置绑核 kubernetes配置_kubesphere 配置绑核_06


如果某个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  #获取系统命名空间下的所有服务

kubesphere 配置绑核 kubernetes配置_kubernetes_07


图中dashboard服务已经被创建,配置文件中关闭了密码验证,只需要浏览器打开 http://192.168.220.131:32000无需登录。

kubesphere 配置绑核 kubernetes配置_Pod_08


K8S仪表盘

进入docker

kubesphere 配置绑核 kubernetes配置_容器_09


kubesphere 配置绑核 kubernetes配置_容器_10

kubesphere 配置绑核 kubernetes配置_docker_11

作者:远古程序猿