kubernetes集羣

簡介

Kubernetes是Google開源的容器集羣管理系統,實現基於Docker構建容器,利用Kubernetes能很方面管理多臺Docker主機中的容器。

主要功能如下:

1)將多臺Docker主機抽象爲一個資源,以集羣方式管理容器,包括任務調度、資源管理、彈性伸縮、滾動升級等功能。

2)使用編排系統(YAML File)快速構建容器集羣,提供負載均衡,解決容器直接關聯及通信問題

3)自動管理和修復容器,簡單說,比如創建一個集羣,裏面有十個容器,如果某個容器異常關閉,那麼,會嘗試重啓或重新分配容器,始終保證會有十個容器在運行,反而殺死多餘的。

Kubernetes角色組成:

1)Pod

Pod是kubernetes的最小操作單元,一個Pod可以由一個或多個容器組成;

同一個Pod只能運行在同一個主機上,共享相同的volumes、network、namespace;

2)ReplicationController(RC)

RC用來管理Pod,一個RC可以由一個或多個Pod組成,在RC被創建後,系統會根據定義好的副本數來創建Pod數量。在運行過程中,如果Pod數量小於定義的,就會重啓停止的或重新分配Pod,反之則殺死多餘的。當然,也可以動態伸縮運行的Pods規模或熟悉。

RC通過label關聯對應的Pods,在滾動升級中,RC採用一個一個替換要更新的整個Pods中的Pod。

3)Service

Service定義了一個Pod邏輯集合的抽象資源,Pod集合中的容器提供相同的功能。集合根據定義的Label和selector完成,當創建一個Service後,會分配一個Cluster IP,這個IP與定義的端口提供這個集合一個統一的訪問接口,並且實現負載均衡。

4)Label

Label是用於區分Pod、Service、RC的key/value鍵值對; 

Pod、Service、RC可以有多個label,但是每個label的key只能對應一個;

主要是將Service的請求通過lable轉發給後端提供服務的Pod集合;

Kubernetes組件組成:

1)kubectl

客戶端命令行工具,將接受的命令格式化後發送給kube-apiserver,作爲整個系統的操作入口。

2)kube-apiserver

作爲整個系統的控制入口,以REST API服務提供接口。

3)kube-controller-manager

用來執行整個系統中的後臺任務,包括節點狀態狀況、Pod個數、Pods和Service的關聯等。

4)kube-scheduler

負責節點資源管理,接受來自kube-apiserver創建Pods任務,並分配到某個節點。

5)etcd

負責節點間的服務發現和配置共享。

6)kube-proxy

運行在每個計算節點上,負責Pod網絡代理。定時從etcd獲取到service信息來做相應的策略。

7)kubelet

運行在每個計算節點上,作爲agent,接受分配該節點的Pods任務及管理容器,週期性獲取容器狀態,反饋給kube-apiserver。

8)DNS

一個可選的DNS服務,用於爲每個Service對象創建DNS記錄,這樣所有的Pod就可以通過DNS訪問服務了。




一、準備工作

 systemctl disable firewalld 
 systemctl stop firewalld
 sed -i s'/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
 
 cat /etc/hosts
192.168.1.237 master
192.168.1.238 node1
192.168.1.239 node2


yum -y install ntpdate && ntpdate cn.pool.ntp.org
yum -y update && reboot


vi /etc/yum.repos.d/virt7-docker-common-release.repo
[virt7-docker-common-release]
name=virt7-docker-common-release
baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/
gpgcheck=0


yum install -y --enablerepo=virt7-docker-common-release etcd kubernetes ntp flannel


二、配置etcd
[root@bogon ~]# grep -v '^#' /etc/etcd/etcd.conf 
ETCD_NAME=k8s
ETCD_DATA_DIR="/data/etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"


啓動etcd
 systemctl daemon-reload
 systemctl enable etcd.service
 systemctl start etcd.service


查看服務狀態
systemctl status -l etcd


etcd服務檢查
[root@bogon ~]#  etcdctl cluster-health
[root@bogon ~]# etcdctl member list


etcd網絡配置
 etcdctl set /k8s/network/config '{"Network": "10.255.0.0/16"}'
 etcdctl get /k8s/network/config


三、Master節點部署
配置kubernetes system config
[root@bogon ~]# grep -v '^#'  /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.1.237:8080"


配置kuber-apiserver啓動參數
[root@bogon ~]#grep -v '^#'  /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_API_ARGS=""




啓動kube-api-servers服務
 systemctl daemon-reload
 systemctl enable kube-apiserver.service
 systemctl start kube-apiserver.service


驗證服務
http://192.168.1.237:8080/healthz


部署kube-controller-manager服務
[root@bogon ~]#  cat /etc/kubernetes/controller-manager 
KUBE_CONTROLLER_MANAGER_ARGS=""


啓動kube-controller-manager
 systemctl daemon-reload
 systemctl enable kube-controller-manager
 systemctl start kube-controller-manager


部署kube-scheduler服務
[root@bogon ~]# cat /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS=""


啓動kube-scheduler服務
 systemctl daemon-reload
 systemctl enable kube-scheduler
 systemctl start kube-scheduler


Node節點部署
[root@bogon ~]# grep -v '^#' /etc/sysconfig/flanneld 
FLANNEL_ETCD_ENDPOINTS="http://192.168.1.237:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens33"


啓動flannel


 systemctl daemon-reload
 systemctl enable flanneld.service
 systemctl start flanneld.service
 注意啓動flannel前要關閉docker這樣flannel纔會覆蓋docker0網橋
  flanneld服務啓動後就會根據etcd裏面配置劃分子網了,劃分子網是給docker使用的,docker想使用還得折騰一翻,其實就是想辦法把幾個重要變量傳過去,使docker啓動時能夠使用


注意啓動docker前要使某些變量生效,需要:
 source /run/flannel/docker
 source /run/flannel/subnet.env


在node1上ping node2的docker0能通就標識正常


配置node1 kube-proxy
[root@bogon ~]#  grep -v '^#' /etc/kubernetes/config 
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.1.237:8080"


[root@bogon ~]#  grep -v '^#' /etc/kubernetes/proxy     
KUBE_PROXY_ARGS=""




配置node1 kubelet
[root@bogon ~]#  grep -v '^#' /etc/kubernetes/kubelet 


KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=node1"
KUBELET_API_SERVER="--api-servers=http://192.168.1.237:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/pengg/nginx:latest"
KUBELET_ARGS=""


 systemctl daemon-reload
 systemctl enable kube-proxy.service
 systemctl start kube-proxy.service
 systemctl daemon-reload
 systemctl enable kubelet.service
 systemctl start kubelet.service


測試集羣
[root@bogon ~]#  kubectl get nodes   
NAME      STATUS    AGE
node1     Ready     1h
node2     Ready     1h









發佈了35 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章