kube

本贴最后更新于 2432 天前,其中的信息可能已经时移世改

前言

随着 docker 的火热,kubernetes 也跟随着火爆起来。kubernetes 是 google 基于 go 语言开发的容器编排工具。可用于容器集群的管理工作,kubernetes 集成了 google 十几年的容器使用经验,所有其在各方面都远超其他容器编排工具。通过 kubernetes 可以实现多个容器节点的管理,比如健康状态检测,批量创建容器等操作。

kubernetes 介绍


kubernetes 由如下组件组成:

  • master 节点
    apiserver:用于接收管理员发送的指令,可以通过 cli,ui 和 api 调用的方式来使用;
    scheduler:用于 pod 的编排调度,根据 api 收到的指令进行相关调度。在 kubernetes 中 pod 的数量是管理指定的,比如管理员指定 nginx pod 的数量为 2,则 scheduler 会在多个 minion 上进行 pod 的调度,当 pod 的数量小于 2 的时候,不如某一 minion 宕机导致 pod 数量不够,则 scheduler 会自动在其他 minion 节点上创建 pod;
    replication controller:根据 scheduler 的指令,比如在哪个 minion 节点创建 pod 等进行工作,是 pod 的实际操作组件;

  • minion 节点
    kubelet:用于和 master 节点进行交互;
    proxy:用于对外提供服务,用户通过 proxy 访问到提供服务的容器;
    pod:在 kubernetes 中的最小单位为 pod,一个 pod 是由多个容器组成的,一个 pod 内的所有容器共享同一组 ip,端口和卷等信息,同一组 pod 内的容器通过 IPC 进行通信;
    cadvisor:用于收集 pod 运行时候的资源数据等信息;
    labels:pod 的标签,方便 pod 的引用;
    container:容器,可以是 docker,rkt,cri-o,frakti 等各种容器服务提供组件;

    在 kubernetes 中还有一个很重要的概念叫做 service,一个 service 是多个 pod 的组合,用于对外提供实际服务。如通过 kubernetes 部署一个 lnmp 的集群,那么其对外提供的服务就是网站的访问,不过提供这个服务还需要 nginx,mysql 和 php,其中 ningx 和 mysql,php 都是一组 pod,所以说一个 service 是由多个 pod 组成的。

kubernetes 集群的部署

本文采用三台虚拟机进行部署,一台为 master 节点,另外两台为 minion 节点:
master 节点部署软件:

  • etcd:一个分布式 k/v 键值存储,kubernetes 集群的信息需要存储到 etcd 中,建议采用分布式集群的方式部署,防止单点故障。etcd 是无中心节点的分布式 k/v 存储,任何一台宕机都不会影响其他 etcd 的正常运行;

  • kubernetes master:用于进行 minion 的管理;

  • flannel:分布在不同 minion 上的 pod 需要通过 overlay 的方式进行通信,否则就需要暴露端口,这样非常不安全,flannel 提供了 overlay 的方式;
    minion 节点部署软件:

  • docker:用于运行容器;

  • kubernetes-node:用于接收 master 的管理,运行 pod 等;

  • flannel

    注意:
    所有的 kubernetes 集群节点都需要管理 iptables 和 firewalld 服务,因为 kubernetes 会自动进行 iptables 的管理工作;
    主机之间建议通过主机名来进行通信,可以搭建 DNS 或者修改 hosts 文件;

实验步骤

master 节点部署:

  1. 安装程序:

    yum install -y kubernetes-master etcd flannel
    
  2. 修改配置文件:

    #kubernetes配置文件修改,配置文件都为于/etc/kubernetes目录下#
    #修改apiserver#
    KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"    #指定API监听的地址,因为需要和minion节点通信,所以监听到本机所有地址或者外网地址#
    KUBE_API_PORT="--port=8080"    #监听端口,默认为8080#
    KUBE_ETCD_SERVERS="--etcd-servers=http://etcd1:2379"    #etcd的地址和端口,因为kubernetes需要往etcd中写入数据#
    KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
    KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
    #修改config全局配置文件#
    KUBE_MASTER="--master=http://node1:8080"    #只需要修改此项,指定master的地址#
    #修改etcd配置文件,位于/etc/etcd/#
    #修改etcd.conf文件#
    # [member]
    ETCD_NAME=etcd1    #指定etcd的名字,此处需要和kubernetes的apiserver中的名字一致#
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    #ETCD_WAL_DIR=""
    #ETCD_SNAPSHOT_COUNT="10000"
    #ETCD_HEARTBEAT_INTERVAL="100"
    #ETCD_ELECTION_TIMEOUT="1000"
    #ETCD_LISTEN_PEER_URLS="http://192.168.11.200:2380"    
    ETCD_LISTEN_CLIENT_URLS="http://master:2379"    #用于和etcd通信的客户端列表,多个之间用逗号隔开#
    #ETCD_MAX_SNAPSHOTS="5"
    #ETCD_MAX_WALS="5"
    #ETCD_CORS=""
    #[cluster]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="http://master:2380"       #集群内各成员用于通信的url#
    # if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
    ETCD_INITIAL_CLUSTER="etcd1=http://etcd1:2380"    #etcd启动时的初始化集群配置,构建过节点的etcd集群需要让各节点的端口监听在一个外网地址#
    #ETCD_INITIAL_CLUSTER_STATE="new"
    #ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_ADVERTISE_CLIENT_URLS="http://master:2379"    #etcd节点用于对外通信的地址和端口#
    #ETCD_DISCOVERY=""
    #ETCD_DISCOVERY_SRV=""
    #ETCD_DISCOVERY_FALLBACK="proxy"
    #ETCD_DISCOVERY_PROXY=""
    #ETCD_STRICT_RECONFIG_CHECK="false"
    #ETCD_AUTO_COMPACTION_RETENTION="0"
    
  3. 配置完成之后启动各项服务

    #启动etcd服务#
    systemctl start etcd    
    etcdctl -C http://master:2379 member list    #查看集群内各节点信息#
    etcdctl -C http://master:2379 cluster-healty    #查看集群的健康状态信息#
    #启动kubernetes master服务#
    systemctl start kube-apiserver kube-scheduler kube-controller-manager
    

minion 节点部署

  1. 安装各软件包

    yum install docker flannel kubernetes-node
    
  2. 修改配置文件

    #修改各配置文件,位于/etc/kubernetes#
    #修改全局配置文件config#
    KUBE_MASTER="--master=http://node1:8080"    #修改此项即可,指定master的地址和端口#
    #修改kubelet的配置#
    KUBELET_ADDRESS="--address=0.0.0.0"    
    KUBELET_HOSTNAME="--hostname-override=node2"    #指定本机的hostname#
    KUBELET_API_SERVER="--api-servers=http://192.168.11.200:8080"    #指定master-apiserver的地址和端口#
    KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
    
  3. 启动服务

    systemctl start docker kube-proxy kubelet
    

测试

  1. 在 master 节点通过 kubectl 命令可以进行 pod 的创建,删除等各种操作

    kubectl get nodes    #获取kubernetes的所有节点信息#
    kubectl cluster-info    #获取集群信息#
    
  2. 创建 pod 进行测试

    kubectl run centos7 --image=centos --replicas=2 -it    #用于通过docker hub中的centos:latest镜像创建一个名为centos7的pod,--replicas表示2副本,-it表示直接连接到pod中去#
    kubectl get pods    #获取集群中所有的pods信息#
    kubectl get deployment    #获取集群中所有的部署资源#
    
  3. 此时在 minion 节点通过 docker ps -a 命令就可以看到已经有 pod 运行了

    注意:
    kubernetes 创建 pod 的时候默认会从 docker hub 中去获取 image,如果没有指定 tag 则会获取 latest 版本;
    执行 run 操作之后会随机在某一个 minion 上运行 pod,当 pod 数量达不到--replicas 指定数量的时候,比如某一 minion 节点宕机则会自动在其他 minion 节点通过 image 自动生成一个新的 pod;

  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    370 引用 • 1215 回帖 • 582 关注

相关帖子

4 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    :smile:

  • someone

    :yum: 解释的很详细

  • someone

    我又看不懂

  • someone

    完全不懂在讲什么:sob: :cold_sweat: