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/目錄中。
- 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