kubernetes核心概念总结和手动集群部署实践 之一

基础架构

Master

Master节点上面主要由四个模块组成,APIServer,schedule,controller manager, etcd.

APIServer: APIServer负责对外提供RESTful的kubernetes API的服务,它是系统管理指令的统一接口,任何对资源的增删该查都要交给APIServer处理后再交给etcd,如图,kubectl(kubernetes提供的客户端工具,该工具内部是对kubernetes API的调用)是直接和APIServer交互的。

schedule: schedule负责调度Pod到合适的Node上,如果把scheduler看成一个黑匣子,那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定。 kubernetes目前提供了调度算法,同样也保留了接口。用户根据自己的需求定义自己的调度算法。

controller manager: 如果APIServer做的是前台的工作的话,那么controller manager就是负责后台的。每一个资源都对应一个控制器。而control manager就是负责管理这些控制器的,比如我们通过APIServer创建了一个Pod,当这个Pod创建成功后,APIServer的任务就算完成了。

etcd: etcd是一个高可用的键值存储系统,kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。

Node

每个Node节点主要由三个模板组成:kublet, kube-proxy, runtime

runtime: runtime值的是容器的运行环境,目前kubernetes支持docker和rtk两种容器。

kube-proxy: 该模块实现了kubernetes中的服务发现和反向代理功能。kube-proxy支持TCP和UDP连接转发,默认基Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响,另外,kube-proxy还支持session affinity。

kublet:kublet是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上的所有容器,但是如果容器不是通过kubernetes创建的,它并不会管理。本质上,它负责使Pod的运行状态与期望的状态一致。

kubernetes 手动部署

两台Ubuntu16.04服务器:ip分别为 Master: 192.168.186.132 和 Node:192.168.186.150。

  • Kubernetes version:1.5.5, client & server, https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md#downloads-for-v155 , 将可执行文件kubernetes目录下,server和client目中的kube-apiserver、kube-controller-manager、kubectl、kubelet、kube-proxy、kube-scheduler等都拷贝到/usr/bin/目录中。
  • etcd Version: 2.3.1, https://github.com/coreos/etcd/releases/tag/v2.2.1, 将etcd的可执行文件etcd和etcdctl拷贝到/usr/bin/目录。
  • docker version: 17.05.0

kubernetes Master 配置

etcd配置

创建数据目录:

    $ sudo mkdir -p /var/lib/etcd/

创建配置目录和文件:

    $ sudo mkdir -p /etc/etcd
    $ sudo vim /etc/etcd/etcd.conf 

    ETCD_NAME=default
    ETCD_DATA_DIR="/var/lib/etcd/"
    ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
    ETCD_ADVERTISE_CLIENT_URLS="http://192.168.186.132:2379"

创建systemd文件:

    $ sudo vim /lib/systemd/system/etcd.service

    [Uint]
    cription=Etcd Server
    Documentation=https://github.com/coreos/etcd
    After=network.target


    [Service]
    User=root
    Type=notify
    EnvironmentFile=-/etc/etcd/etcd.conf
    ExecStart=/usr/bin/etcd
    Restart=on-failure
    RestartSec=10s
    LimitNOFILE=40000

    [Install]
    WantedBy=multi-user.target

启动服务:

    $ sudo systemctl daemon-reload 
    $ sudo systemctl enable etcd
    $ sudo systemctl start etcd

测试服务端口:

    $ sudo systemctl status etcd

如果部署的是etcd集群,那么每台etcd服务器上都需要执行类似: $ etcdctl set /coreos.com/network/config ‘{ “Network”: “192.168.4.0/24” }’

创建Kubernetes配置目录

Kubernetes通用配置文件/etc/kubernetes/config文件中,存储的是Kubernetes各组件的通用配置信息。

    $ sudo mkdir /etc/kubernetes

    $ sudo vim /etc/kubernetes/config

    KUBE_LOGTOSTDERR="--logtostderr=true"
    KUBE_LOG_LEVEL="--v=0"
    KUBE_ALLOW_PRIV="--allow-privileged=false"
    KUBE_MASTER="--master=http://192.168.186.132:8080"

配置kube-apiserver服务

kube-apiserver的专用配置文件为/etc/kubernetes/apiserver。

    $ sudo vim /etc/kubernetes/apiserver


    # kubernetes system config
    #
    # The following values are used to configure the kube-apiserver
    #

    # The address on the local server to listen to.
    KUBE_API_ADDRESS="--address=0.0.0.0"
    #KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"

    # The port on the local server to listen on.
    KUBE_API_PORT="--port=8080"

    # Port minions listen on
    KUBELET_PORT="--kubelet-port=10250"

    # Comma separated list of nodes in the etcd cluster
    KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.186.132:2379"

    # Address range to use for services
    KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=192.168.4.0/24"

    # default admission control policies
    KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"

    # Add your own!
    KUBE_API_ARGS=""

一些启动参数如下:

  • –etcd_servers: 指定etcd服务的URL
  • –insecure-bind-address: apiserver绑定主机的非安全端口,设置0.0.0.0表示绑定所有IP地址
  • –insecure-port: apiserver绑定主机的非安全端口号,默认为8080
  • –service-cluster-ip-range: Kubernetes集群中service的虚拟IP地址范围,以CIDR表示,该IP范围不能与物理机的真实IP段有重合。
  • –service-node-port-range: kubernetes集群中Service可映射的物理机端口号范围,默认为30000–32767.
  • –admission_control: kubernetes集群的准入控制设置,各控制模块以插件的形式依次生效
  • –logtostderr: 设置为false表示将日志写入文件,不写入stderr
  • –log-dir: 日志目录
  • –v: 日志级别

创建systemd文件

    $ sudo vim /lib/systemd/system/kube-apiserver.service

    [Unit]
    Description=Kubernetes API Server
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    After=network.target
    After=etcd.service
    Wants=etcd.service

    [Service]
    User=root
    EnvironmentFile=-/etc/kubernetes/config
    EnvironmentFile=-/etc/kubernetes/apiserver
    ExecStart=/usr/bin/kube-apiserver \
            $KUBE_LOGTOSTDERR \
            $KUBE_LOG_LEVEL \
            $KUBE_ETCD_SERVERS \
            $KUBE_API_ADDRESS \
            $KUBE_API_PORT \
            $KUBELET_PORT \
            $KUBE_ALLOW_PRIV \
            $KUBE_SERVICE_ADDRESSES \
            $KUBE_ADMISSION_CONTROL \
            $KUBE_API_ARGS
    Restart=on-failure
    Type=notify
    LimitNOFILE=65536  

    [Install]
    WantedBy=multi-user.target

配置kube-controller-manager服务

创建kube-controller-manager配置文件,kube-controller-manager的专用配置文件为/etc/kubernetes/controller-manag

    $ sudo vim /etc/kubernetes/controller-manager

    KUBE_CONTROLLER_MANAGER_ARGS=""

创建systemd文件

    [Unit]
    Description=Kubernetes Controller Manager
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    After=etcd.service
    After=kube-apiserver.service
    Requires=etcd.service
    Requires=kube-apiserver.service

    [Service]
    User=root
    EnvironmentFile=-/etc/kubernetes/config
    EnvironmentFile=-/etc/kubernetes/controller-manager
    ExecStart=/usr/bin/kube-controller-manager \
            $KUBE_LOGTOSTDERR \
            $KUBE_LOG_LEVEL \
            $KUBE_MASTER \
            $KUBE_CONTROLLER_MANAGER_ARGS
    Restart=on-failure
    LimitNOFILE=65536

    [Install]
    WantedBy=multi-user.target

配置kube-scheduler服务

kube-scheduler的专用配置文件为/etc/kubernetes/schedule

    $ sudo vim /etc/kubernetes/scheduler

    KUBE_SCHEDULER_ARGS=""      

创建systemd文件

    $ sudo vim /lib/systemd/system/kube-scheduler.service

    [Unit]
    Description=Kubernetes Scheduler
    Documentation=https://github.com/kubernetes/kubernetes

    [Service]
    User=root
    EnvironmentFile=-/etc/kubernetes/config
    EnvironmentFile=-/etc/kubernetes/scheduler
    ExecStart=/usr/bin/kube-scheduler \
            $KUBE_LOGTOSTDERR \
            $KUBE_MASTER
    Restart=on-failure
    LimitNOFILE=65536

    [Install]
    WantedBy=multi-user.target

配置完成后,按顺序启动Kubernetes master节点的服务:

    $ sudo systemctl daemon-reload
    $ sudo systemctl enable kube-apiserver kube-controller-manager kube-scheduler
    $ sudo systemctl start kube-apiserver kube-controller-manager kube-scheduler

通过systemctl status来验证服务的启动状态,”running”表示启动成功。

Kubernetes node配置

配置kubelet服务

kublet服务依赖docker服务。创建kubelet的数据目录

    $ sudo mkdir /var/lib/kubelet

创建kubelete配置文件,kubelet的专用配置文件为/etc/kubernetes/kubelet

    KUBELET_ADDRESS="--address=127.0.0.1"
    KUBELET_HOSTNAME="--hostname-override=192.168.186.150"
    KUBELET_API_SERVER="--api-servers=http://192.168.186.132:8080"

    # pod infrastructure container
    KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
    KUBELET_ARGS="--enable-server=true --enable-debugging-handlers=true"

一些的启动参数如下:
* –api-servers: 指定apiserver的URL地址,可以指定多个
* –hostname-override: 设置本Node的名称
* –logtostderr: 设置为false表示将日志写入文件,不写入stderr
* –log-dir: 日志目录
* –v: 日志级别

创建systemd文件

    $ sudo vim /lib/systemd/system/kubelet.service

    [Unit]
    Description=Kubernetes Kubelet
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    After=docker.service
    Requires=docker.service

    [Service]
    WorkingDirectory=/var/lib/kubelet
    EnvironmentFile=-/etc/kubernetes/config
    EnvironmentFile=-/etc/kubernetes/kubelet
    ExecStart=/usr/bin/kubelet \
            $KUBE_LOGTOSTDERR \
            $KUBE_LOG_LEVEL \
            $KUBELET_API_SERVER \
            $KUBELET_ADDRESS \
            $KUBELET_PORT \
            $KUBELET_HOSTNAME \
            $KUBE_ALLOW_PRIV \
            $KUBELET_POD_INFRA_CONTAINER \
            $KUBELET_ARGS
    Restart=on-failure
    KillMode=process

    [Install]
    WantedBy=multi-user.target

启动kubelet服务

    $ sudo systemctl daemon-reload
    $ sudo systemctl enable kubelet
    $ sudo systemctl start kubelet

创建kube-proxy配置文件

kube-proxy的专用配置文件为/etc/kubernetes/proxy

    $ sudo vim /etc/kubernetes/proxy

    # kubernetes proxy config
    # default config should be adequate
    # Add your own!
    KUBE_PROXY_ARGS=""

创建systemd文件

    $ sudo vim /lib/systemd/system/kube-proxy.service

    [Unit]
    Description=Kubernetes Proxy
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    After=network.target

    [Service]
    EnvironmentFile=-/etc/kubernetes/config
    EnvironmentFile=-/etc/kubernetes/proxy
    ExecStart=/usr/bin/kube-proxy \
            $KUBE_LOGTOSTDERR \
            $KUBE_LOG_LEVEL \
            $KUBE_MASTER \
            $KUBE_PROXY_ARGS
    Restart=on-failure
    LimitNOFILE=65536

    [Install]
    WantedBy=multi-user.target

启动kube-proxy服务

    $ sudo systemctl daemon-reload
    $ sudo systemctl enable kube-proxy
    $ sudo systemctl start kube-proxy  

kublet默认采用向Master自动注册本Node的机制,在Master上查看个Node的状态,状态为Ready标识Node已经成功注册并且状态可用。

$ kubectl get nodes

NAME              STATUS    AGE       VERSION
192.168.186.150   Ready     6h        v1.5.5

你可能感兴趣的:(kubernetes核心概念总结和手动集群部署实践 之一)