1. kubernetes介绍
1.1 kubernetes简介
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
服务发现:服务可以通过自动发现的形式找到它所依赖的服务
负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
存储编排:可以根据容器自身的需求自动创建存储卷
1.2 kubernetes组件
一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。
master:集群的控制平面,负责集群的决策(管理)
ApiServer:资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
Scheduler:负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager:负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
Etcd:负责存储集群中各种资源对象的信息
node:集群的数据平面,负责为容器提供运行环境(干活)
Kubelet:负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
KubeProxy:负责提供集群内部的服务发现和负载均衡
Docker:负责节点上容器的各种操作
举例:以部署一个nginx服务来说明kubernetes系统各个组件调用关系
- 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中,
- 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件,
- apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上,在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer,
- apiServer调用controller-manager去调度Node节点安装nginx服务,
- kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod,pod是kubernetes的最小操作单元,容器必须跑在pod中至此,
- 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理,
最后,外界用户就可以访问集群中的nginx服务了。
1.3 kubernetes概念
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
2. kubernetes集群
目前生产部署Kubernetes 集群主要有两种方式:
Kubeadm:
Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二进制包:
从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。
Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
3. Kubeadm方式部署(一主多从)
3.1 kubeadm介绍
kubeadm是官方社区推出的一个用于快速部署 kubernetes集群的工具,这个工具能通过两条指令完成一个 kubernetes 集群的部署:
第一、创建一个 Master 节点 kubeadm init
第二、将 Node 节点加入到当前集群中 # kubeadm join <Master节点的 IP和端口 >
3.2 安装要求
在开始之前,部署 Kubernetes集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB或更多 RAM,2 个 CPU或更多 CPU,硬盘 30GB或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止 swap分区
3.3 实现目标
(1)在所有节点上安装 Docker 和 kubeadm
(2)部署 Kubernetes Master
(3)部署容器网络插件
(4)部署 Kubernetes Node,将节点加入 Kubernetes 集群中
(5)部署 Dashboard Web页面,可视化查看 Kubernetes资源
3.4 环境准备
角色 |
IP |
组件 |
master |
10.27.134.250 |
docker、kubectl、kubeadm、kubelet |
node1 |
10.27.134.251 |
docker、kubectl、kubeadm、kubelet |
node2 |
10.27.134.252 |
docker、kubectl、kubeadm、kubelet |
3.5 系统初始化(所有节点均需操作)
3.5.1 主机名解析
##修改主机名
[root@jss-k8s-1 ~]# hostnamectl set-hostname master #master节点
[root@jss-k8s-2 ~]# hostnamectl set-hostname node1 #node1节点
[root@jss-k8s-3 ~]# hostnamectl set-hostname node2 #node2节点
##三台服务器的地址和主机名添加到三个节点的/etc/hosts文件中
[root@master ~]# cat >> /etc/hosts << EOF
10.27.134.250 master
10.27.134.251 node1
10.27.134.252 node2
EOF
3.5.2 时间同步
kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间
# 启动chronyd服务并设置开机启动
# systemctl start chronyd && systemctl enable chronyd
# 核验时间
# date
3.5.3 禁用iptable和firewalld服务
kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
##关闭firewalld服务
# systemctl stop firewalld && systemctl disable firewalld
##关闭iptables服务
# systemctl stop iptables && systemctl disable iptables
3.5.4 禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
# 永久关闭
# sed -i 's/enforcing/disabled/' /etc/selinux/config
# 临时关闭
# setenforce 0
3.5.5 禁用swap分区
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
# 永久关闭
# vim /etc/fstab
# 临时关闭
# swapoff -a
3.5.6 将桥接的 IPv4流量传递到 iptables的链上
##加载网桥过滤模块
# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
##修改内核参数
# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
##配置生效
# sysctl --system
##建议重启下系统,让配置彻底生效
# reboot
3.5.7 配置yum源
# curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF
# yum clean all && yum makecache
3.6 所有节点安装 docker
##查看所有的可用版本
# yum list docker-ce --showduplicates | sort -r
##安装旧版本(稳定性问题)
yum install docker-ce-cli-18.09.9-3.el7 docker-ce-18.09.9-3.el7
##安装源里最新版本
# yum install docker-ce
##配置docker加速
# mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"insecure-registries": [
"10.27.134.250:5000"
],
"registry-mirrors" : [
"https://8xpk5wnt.mirror.aliyuncs.com"
]
}
EOF
##启动docker
# systemctl enable docker && systemctl start docker
3.7 部署kubernetes master
(1)安装 kubeadm, kubelet 和 kubectl,操作节点:所有的节点需要执行
##可以指定版本,不指定即安装最新
# yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 --disableexcludes=Kubernetes
##查看kubeadm 版本
# kubeadm version
##设置kubelet开机启动
# systemctl enable kubelet
(2)初始化配置文件,操作节点: 只在master节点执行
# kubeadm config print init-defaults > kubeadm.yaml
##修改kubeadm的yaml文件
# vim kubeadm.yaml
(3)下载镜像
操作节点:只在master节点执行
##查看需要使用的镜像列表,若无问题,将得到如下列表
# kubeadm config images list --config kubeadm.yaml
##提前下载镜像到本地
# kubeadm config images pull --config kubeadm.yaml
(4)初始化master节点
操作节点:只在master节点执行
kubeadm init --config kubeadm.yaml
##按照上述提示信息操作,配置kubectl客户端的认证
mkdir -p #HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf #HOME/.kube/config
sudo chown #(id -u):#(id -g) #HOME/.kube/config
##此时查看节点应该处于notReady状态,因为还未配置网络插件。
若执行初始化过程中出错,根据错误信息调整后,执行kubeadm reset后再次执行init操作即可
# kubectl get nodes
3.8 添加node节点到集群中
操作节点:所有的node节点需要执行
在每台node节点,执行如下命令,该命令是在kubeadm init成功后提示信息中打印出来的,需要替换成实际init后打印出的命令。
kubeadm join 10.27.134.250:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:99006ec72f04c1e61ebd6d9037eec86c5dad7e239164e4928902e46ad7887d16
3.9 安装flannel网络插件
操作节点:只在master节点(k8s-master)执行
(1)下载flannel的yaml文件
wget https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
##若是无法进行下载,可以本地浏览器打开地址后复制网页内容粘贴到本地,修改文件名和格式后再导入到master节点底层。
(2)修改flannel插件yml文件,新增一行配置指定网卡名称
(3)执行安装
##先拉取镜像,此过程国内速度比较慢
# docker pull quay.io/coreos/flannel:v0.11.0-amd64
##执行flannel安装
# kubectl create -f kube-flannel.yml
##若是网页复制粘贴的方式,安装出现下面报错,建议使用notepad打开转换为unix格式
3.10 集群验证
(1)操作节点: 在master节点执行
# kubectl get nodes #观察集群节点是否全部Ready
(2)创建一个nginx服务进行测试
# kubectl run test-nginx --image=nginx:alpine
(3)查看pod是否创建成功,并访问pod ip测试是否可用
# kubectl get pods -o wide
# curl 10.244.1.2
3.11(可选)设置master节点参与pod调度
操作节点:master
##默认部署成功后,master节点无法调度业务pod,如需设置master节点也可以参与pod的调度,需执行:
# kubectl taint node k8s-master node-role.kubernetes.io/master:NoSchedule-
3.12 部署dashboard可视化模块
(1)服务部署
##下载yml文件
# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml
##修改yam文件,service改为NodePort类型
##创建服务
# kubectl create -f recommended.yaml
##查看服务对外暴露的端口号
# kubectl get svc -n kubernetes-dashboard
(2)访问测试
##使用浏览器访问
(3)创建ServiceAccount进行登录
##创建admin.conf配置文件
# cat > /opt/kubernetes/cfg/admin.conf << EOF
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kubernetes-dashboard
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kubernetes-dashboard
EOF
##查看命名空间内的加密信息是否有token和名称
# kubectl get secret -n kubernetes-dashboard
##使用该命令拿到token,替换上条命令查询的名称admin-token-qt24k,然后粘贴到浏览器中进行登录
# kubectl -n kubernetes-dashboard get secret admin-token-qt24k -o jsonpath={.data.token}|base64 -d
##使用token登录dashboard
3.13 环境重置
如果在集群安装过程中遇到了其他问题,也可以使用下面的命令来进行重置:
# kubeadm reset
# ifconfig cni0 down && ip link delete cni0
# ifconfig flannel.1 down && ip link delete flannel.1
# rm -rf /var/lib/cni/