1. 程式人生 > >kubernetes核心概念總結和手動叢集部署實踐 之一

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 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