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

来源:互联网 发布:java正则表达式$ 编辑:程序博客网 时间:2024/05/20 06:24

基础架构

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 nodesNAME              STATUS    AGE       VERSION192.168.186.150   Ready     6h        v1.5.5
原创粉丝点击