Kubernetes基础知识与k8s多节点案例配置

本文详细介绍了Kubernetes的基础知识,包括其核心概念、集群架构和组件。重点讲解了Kubernetes的自我修复、弹性伸缩和自动部署等特性。通过一个具体的多节点配置案例,展示了如何部署和管理Kubernetes集群,包括etcd、Master和Node组件的配置,以及Flannel网络的设置。此外,还涵盖了负载均衡的实现,确保了服务的高可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Kubernetes

1. Kubernetes概述

  Kubernetes是Google在2014年开源的一个容器集群管理系统,简称k8s。k8s用于容器化应用程序的部署、拓展和管理。k8s提供容器编排、资源调度、弹性伸缩、部署管理、服务发现等一系列功能。使部署容器化应用更加简单高效。

  • 容器编排:类似compose,可批量创建镜像与容器。
  • 资源调度:可由系统自动分配或是由自己指定。
  • 弹性伸缩:在和虚拟机的对比中,谈到过容器的启动时间是ms级别的,所以适合在短时间内创建大量容器部署相应服务。
  • 部署管理:对资源状态的指定,有五种状态,其中的无状态和有状态为重点。
  • 服务发现:ETCD类似数据库,具有服务发现功能,在其中会记录着对容器的相关操作及大量数据,由apiserver控制;在生产环境中需要至少三台的备份。

2. Kubernetes特性

  • 自我修复

    在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在为准备好之前不会处理客户端的请求,确保线上服务不中断。

  • 弹性伸缩

    使用指令、UI或基于CPU等资源的使用情况,自动快速扩容和缩容应用实例,应对业务高峰时的高并发和业务低峰时的回收资源,节约资源成本。

  • 自动部署和回滚

    k8s采用滚动更新机制更新应用,一次更新一个pod(一般对应一个docker),而不是同时删除所有pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响。

  • 服务发现和负载均衡

    k8s为多个容器提供一个统一访问的入口(内部IP地址和一个DNS名称),并且负载均衡关联到所以容器,使用户无需考虑容器IP的问题。

  • 机密和配置管理

    管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,增强数据的安全性。并可以将一些常用的配置存储在k8s中,方便应用程序使用。

  • 存储编排

    挂载外部存储系统,无论是来自本地存储、公有云(如AWS)、还是网络存储(NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高了存储使用的灵活性。

  • 批处理

    提供一次性任务,定时任务;满足批量数据处理和分析的场景。

    说明:

    滚动更新:用新容器逐个替换旧容器 因为逐个替换是一个过程, 所以会出现访问到新旧容器的情况

    蓝绿部署:两大可用区,轮流 不停歇,就像海豚的的左右脑,一边休眠一边工作

    灰度部署:就是上面所说的可用区滚动更新,由新容器逐个替换旧容器,从头到尾再从头到尾,不停歇

3. Kubernetes核心概念

  • Pod

    pod是k8s最小部署单元,是一组容器的集合,一个pod中的容器共享网络命名空间,pod是短暂的。

  • Controllers

    ReplicaSet:确保预期的Pod副本数量

    Deployment:无状态应用部署

    StatefulSet:有状态应用部署

    DaemonSet:确保所有Node运行在同一个Pod

    Job:一次性任务

    Cronjob:定时任务

    更高级层次对象,部署和管理Pod

  • Service

    防止Pod失联

    定义一组Pod的访问策略,若容器服务部署完成,没有service,用户无法访问,就像端口映射,需要提供访问的端口一样

  • Label:标签,附加到某个资源上,用于关联对象、查询和筛选

  • Namespaces:命名空间,将对象逻辑上隔离

  • Annotations:注释

二、Kubernetes集群架构和组件

1. Master组件

  • kube-apiserver

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

  • kube-controller-manager

    处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的

  • kube-scheduler

    根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。

    需要说明的是:不是所有的服务分配都需要经过scheduler,当指定过服务部署在特定的节点上的时候就可以不用经过scheduler分配

  • etcd

    分布式键值存储系统。用于保存集群状态数据,比如Pod、service等对象信息。

2. Node组件

  • kubelet

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

  • kube-proxy

    在Node节点上实现Pod网络代理,维护网络规则和四次负载均衡工作,客户端的入口。

  • docker或rocket

    容器引擎,运行容器。
    在这里插入图片描述

三、Flannel

1. Flannel概述

  flannel是针对Kubernetes设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用kubernetes的主机拥有一个完整的子网。flannel通过给每台宿主机分配一个子网的方式为容器提供虚拟网络,它基于Linux TUN/TAP,使用UDP封装IP包来创建overlay网络,使不同节点上的docker可以相互通信,并借助etcd维护网络的分配情况。

  fannel会在寄主机上创建一个flannel.1或类似的网卡设备和创建一系列路由表规则。

2. Flannel核心概念

  • Overlay Network

    覆盖网络,在基础网络的基础上叠加的一种虚拟网络技术,该网络中的主机可以通过虚拟链路连接起来。

  • VXLAN

  flannel中实现数据转发的方式之一,将源数据包封装在UDP网络中,并使用基础网络的IP/MAC作为外层报文头进行封装,然后在以太网上传输,到达目的地后由隧道端点解封装并将数据发给目标地址。

  • Flannel

    是Overlay网络的一种,也是将源数据包封装在另一种网络包中进行路由转发和通信,目前已经支持UDP、VXLAN、AWS VPC和GCE等数据转发方式。

  • flannel0设备

    负责在操作系统内核和用户应用程序之间传递IP包

    • 内核态向用户态流动

      当操作系统将一个IP包发送给flannel0设备后,flannel0设备就会把这个IP包交给创建这个设备的应用程序,也就是flannel进程

    • 用户态向内核流动

      flannel进程向flannel0设备发送一个IP包,这个IP包就会出现在宿主机的网络栈中,然后根据宿主机上的路由表规则处理.

  • Flannel子网

    每台宿主机都会被flannel分配一个单独的子网段,每台宿主机上的所有容器地址都是这个子网段中的IP地址,子网信息和宿主机的对应关系都保存在etcd中,必须建立docker0和flannel的关系,这样docker0网桥的地址范围将会变成flannel的子网范围。

3. VXLAN模式

在这里插入图片描述
在这里插入图片描述

四、kubernetes部署示例

1.案例环境

负载均衡

  • Nginx01:20.0.0.50/24
  • Nginx02:20.0.0.60/24

Master节点

  • master01:20.0.0.10/24
  • master02:20.0.0.20/24

Node节点

  • node01:20.0.0.30/24
  • node02:20.0.0.40/24

2.配置步骤

etcd部署

etcd证书
由于此部分生成证书和相关文件较多,而且一些指令中证书文件用的是相对路径,所以要注意执行时所在的工作目录

[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su
[root@master ~]# mkdir k8s
[root@master ~]# cd k8s/
[root@master k8s]# rz -E
rz waiting to receive.

//这两个文件是写好的,etcd-cert.sh里面是ca证书制作的一些代码后面可以拿出来用的
//etcd.sh是etcd的配置文件和启动脚本,后面需要直接执行的

[root@master k8s]# ls
etcd-cert.sh  etcd.sh
[root@master k8s]# mkdir etcd-cert
[root@master k8s]# mv etcd-cert.sh etcd-cert
[root@master k8s]# cd /usr/local/bin
[root@master bin]# rz -E
rz waiting to receive.

//这几个是证书制作的工具需要下载的
//下载地址:https://pkg.cfssl.org/R1.2/cfssl_linux-amd64,https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64,https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
//cfssl是生成证书工具,cfssljson是通过传入json文件来生成证书,cfssl-certinfo查看证书信息

[root@master bin]# ls
cfssl  cfssl-certinfo  cfssljson
[root@master bin]# chmod +x *
[root@master bin]# cd 
[root@master ~]# cd k8s/
[root@master k8s]# ls
etcd-cert  etcd.sh

//ca证书定义,在etcd-cert.sh中有代码

[root@master k8s]# cat > ca-config.json <<EOF
cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "www": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]  
      } 
    }
  }
}
EOF
[root@master k8s]# ls
ca-config.json  etcd-cert  etcd.sh

//ca证书签名

[root@master k8s]# cat > ca-csr.json <<EOF
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
}
EOF

//生成ca秘钥和证书

[root@master k8s]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
2020/09/28 16:17:31 [INFO] generating a new CA key and certificate from CSR
2020/09/28 16:17:31 [INFO] generate received request
2020/09/28 16:17:31 [INFO] received CSR
2020/09/28 16:17:31 [INFO] generating key: rsa-2048
2020/09/28 16:17:31 [INFO] encoded CSR
2020/09/28 16:17:31 [INFO] signed certificate with serial number 225437059867776436062700610309289006313657657183
[root@master k8s]# ls
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem  etcd-cert  etcd.sh

//服务端证书,指定etcd群集成员

[root@master k8s]# cat > server-csr.json <<EOF
{
    "CN": "etcd",
    "hosts": [
    "20.0.0.20",
    "20.0.0.30",
    "20.0.0.40"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}
EOF

//生成ETCD证书 server-key.pem server.pem

[root@master k8s]# ls
ca-config.json  ca-csr.json  ca.pem     etcd.sh     server-csr.json  server.pem
ca.csr          ca-key.pem   etcd-cert  server.csr  server-key.pem
[root@master k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
2020/09/28 16:20:51 [INFO] generate received request
2020/09/28 16:20:51 [INFO] received CSR
2020/09/28 16:20:51 [INFO] generating key: rsa-2048
2020/09/28 16:20:51 [INFO] encoded CSR
2020/09/28 16:20:51 [INFO] signed certificate with serial number 692180165096155002840320772719909924938206748479
2020/09/28 16:20:51 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
[root@master k8s]# ls
ca-config.json  ca-csr.json  ca.pem     etcd.sh     server-csr.json  server.pem
ca.csr          ca-key.pem   etcd-cert  server.csr  server-key.pem

[root@master k8s]# mv ca* etcd-cert/
[root@master k8s]# ls
etcd-cert  etcd.sh  server.csr  server-csr.json  server-key.pem  server.pem
[root@master k8s]# mv server* etcd-cert/
[root@master k8s]# ls
etcd-cert  etcd.sh

安装etcd

[root@master k8s]# rz -E
rz waiting to receive.
[root@master k8s]# tar zxvf etcd-v3.3.10-linux-amd64.tar.gz 
[root@master k8s]# cd etcd-v3.3.10-linux-amd64/
[root@master etcd-v3.3.10-linux-amd64]# ls
Documentation  etcd  etcdctl  README-etcdctl.md  README.md  READMEv2-etcdctl.md

//创建三个目录来同一存放我们刚刚生成或即将生成的文件,cfg中存放配置文件,bin下放指令,ssl放证书

[root@master etcd-v3.3.10-linux-amd64]# mkdir /opt/etcd/{cfg,bin,ssl} -p
[root@master etcd-v3.3.10-linux-amd64]# cp etcd /opt/etcd/bin/
[root@master etcd-v3.3.10-linux-amd64]# cp etcdctl /opt/etcd/bin/
[root@master etcd-v3.3.10-linux-amd64]# cd ../etcd-cert/
[root@master etcd-cert]# ls
ca-config.json  ca-csr.json  ca.pem        server.csr       server-key.pem
ca.csr          ca-key.pem   etcd-cert.sh  server-csr.json  server.pem
[root@master etcd-cert]# cp *.pem /opt/etcd/ssl/
[root@master etcd-cert]# cd ..

//因为还没有配置Node所以会进入卡着的状态,可以另开一个终端看看etcd的进程,要是Node节点的防火墙没关的话,或者规则没配的话,也会报错
//执行etcd.sh这个脚本,会生成etcd配置文件etcd,存放位置为/opt/etcd/cfg/;还会生成启动脚本etcd.service存放位置/usr/lib/systemed/system/

[root@master k8s]# bash etcd.sh etcd01 20.0.0.20 etcd02=https://20.0.0.30:2380,etcd03=https
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值