美文网首页系统运维k8s
Kubernetes(K8S)入门与安装配置

Kubernetes(K8S)入门与安装配置

作者: 远古程序猿 | 来源:发表于2019-12-22 00:32 被阅读0次

    什么是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搭建的集群环境,采用三台物理机搭建(三台机器是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)的通信都是通过它来实现。
    1. 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内所有容器的公共数据卷挂载功能
    pod内部组成图
    1. Label 标签可以理解为每一个Pod的别名
    2. 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执行
    
    1. 为了便于区分,三台机器均配置以下hosts
    vim  /etc/hosts
    192.168.220.131 master
    192.168.220.132 node1
    192.168.220.133 node2
    
    1. 关闭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
    

    将文件上传至该目录
    网盘地址:https://pan.baidu.com/s/1NiAdf0Gp24qjVx2v_HqqyQ
    提取码:aew7

    1. 每个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
    
    1. 确保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\
    
    1. 安装kubeadm,kubeadm是集群部署管理工具,可用来安装K8S的一个工具,极大简化安装流程
    cd /usr/local/k8s-install/kubernetes-1.14
    tar -zxvf kube114-rpm.tar.gz
    cd kube114-rpm
    yum localinstall -y *.rpm
    
    1. 关闭交换区,Linux的交换区类似windows系统中虚拟内存,不太建议使用这个选项,关闭掉
    swapoff -a
    vi /etc/fstab 
    

    将最后一行注释

    image.png
    1. 配置网桥,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
    
    1. 加载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可以看到以下几个关键应用

    image.png

    kube-proxy 容器间通讯代理、kube-apiserver API服务端、kube-scheduler 任务调度器、kube-controller-manager 集群控制器、coredns K8S内置的 DNS 服务器、etcd 用于保存集群所有的网络配置和对象的状态信息、pause前面已经提到用于容器间的通讯以及数据卷的挂载。至此K8S安装完成

    K8S集群安装配置

    1. 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集群.

    1. 执行 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集群配置完成

    systemctl 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

    相关文章

      网友评论

        本文标题:Kubernetes(K8S)入门与安装配置

        本文链接:https://www.haomeiwen.com/subject/nwhgnctx.html