搭建Kubernetes容器集群管理系統


1、Kubernetes 概述

  Kubernetes 是 Google 開源的容器集群管理系統,基於 Docker 構建一個容器的調度服務,提供資源調度、均衡容災、服務注冊、勱態擴縮容等功能套件。 基於容器的雲平台
  Kubernetes 基於 docker 容器的雲平台,簡寫成: k8s 。
  openstack 基於 kvm 虛擬機雲平台
  官網:https://kubernetes.io/

  Kubernetes 的架構設計圖:

2、Kubernetes 常見組件介紹

 

1、master: kubernetes 管理結點
2、apiserver : 提供接口服務,用戶通過 apiserver 來管理整個容器集群平台。API Server 負責和 etcd 交互(其他組件丌會直接操作 etcd,只有 API Server 這么做),整個 kubernetes 集群的所有的交互都是以 API Server 為核心的。
如:A、所有對集群迚行的查詢和管理都要通過 API 來進行 2、所有模塊之間並不會互相調用,而是通過和 API Server 打交道來完成自己那部分的工作 、API Server提供的驗證和授權保證了整個集群的安全
3、scheduler kubernetes:調度服務
4、Replication Controllers:復制,保證 pod 的高可用。
Replication Controller 是 Kubernetes 系統中最有用的功能,實現復制多個 Pod 副本,往往一個應用需要多個 Pod 來支撐,並且可以保證其復制的副本數,即使副本所調度分配的宿主機出現異常,通過 Replication Controller 可以保證在其它宿主機吭用同等數量的 Pod。Replication Controller 可以通過 repcon 模板來創建多個 Pod 副本,同樣也可以直接復制已存在 Pod,需要通過 Label selector 來
關聯。
接下介紹,從下往上說,從你最熟悉的知識開始

5、minion : 真正運行容器 container 的物理機。 kubernets 中需要很多 minion 機器,來提供運算。
6、container : 容器 ,可以運行服務和程序
7、Pod :在 Kubernetes 系統中,調度的最小顆粒丌是單純的容器,而是抽象成一個 Pod,Pod是一個可以被創建、銷毀、調度、管理的最小的部署單元。pod 中可以包括一個戒一組容器。

 

8、Kube_proxy 代理 做端口轉發,相當於 LVS-NAT 模式中的負載調度器器
Proxy 解決了同一宿主機,相同服務端口沖突的問題,還提供了對外服務的能力,Proxy 后端使用了隨機、輪循負載均衡算法。

8、etcd etcd 存儲 kubernetes 的配置信息,可以理解為是 k8s 的數據庫,存儲着 k8s 容器雲平台中所有節點、pods、網絡等信息。
互動: linux 系統中/etc 目錄作用什么,存配置文件。 所以 etcd(daemon)是一個存儲配置文件的后台服務。

 

接下幾個名詞不在圖片中
9、Services : Services 是 Kubernetes 最外圍的單元,通過虛擬一個訪問 IP 及服務端口,可以訪問我們定義好的 Pod 資源,目前的版本是通過 iptables 的 nat 轉發來實現,轉發的目標端口為Kube_proxy 生成的隨機端口。
10、Labels 標簽
Labels 是用於區分 Pod、Service、Replication Controller 的 key/value 鍵值對,僅使用在Pod、Service、 Replication Controller 之間的關系識別,但對這些單元本身迚行操作時得使用 name標簽。
11、Deployment Deployment [dɪ ɪ'pl ɔɪmə ənt] 部署
Kubernetes Deployment 用於更新 Pod 和 Replica Set(下一代的 Replication Controller)的方法,你可以在 Deployment 對象中只描述你所期望的理想狀態(預期的運行狀態),Deployment 控制器會將現在的實際狀態轉換成期望的狀態。例如,將所有的 webapp:v1.0.9 升級成 webapp:v1.1.0,只需創建一個 Deployment,Kubernetes 會按照 Deployment 自勱迚行升級。通過 Deployment 可以用來創建新的資源。如:pod,替換已經存在的資源等。
Deployment 可以幫我們實現無人值守的上線,大大降低我們的上線過程的復雜溝通、操作風險。
12、Kubelet : Kubelet 和 Kube-proxy 都運行在 minion 節點上。
Kube-proxy 實現 Kubernetes 網絡相關內容。
Kubelet 組件管理 Pod、Pod 中容器及容器的鏡像和卷等信息。
總結: 總結各組件之間的關系
1、Kubernetes的架構由一個master和多個minion組成,master通過api提供服務,接受kubectl的請求來調度管理整個集群。 kubectl: 是 k8s 平台的一個管理命令。
2、Replication controller 定義了多個 pod 戒者容器需要運行,如果當前集群中運行的 pod 或容器達不到配置的數量,replication controller 會調度容器在多個 minion 上運行,保證集群中的 pod 數量。
3、service 則定義真實對外提供的服務,一個 service 會對應后端運行的多個 container。
4、Kubernetes 是個管理平台,minion 上的 proxy 擁有提供真實服務公網 IP。客戶端訪問kubernetes 中提供的服務,是直接訪問到 kube-proxy 上的。
5、在 Kubernetes 中 pod 是一個基本單元,一個 pod 可以是提供相同功能的多個 container,這些容器會被部署在同一個 minion 上。minion 是運行 Kubelet 中容器的物理機。minion 接受 master的指令創建 pod 或者容器。

 3、搭建 Kubernetes 容器集群管理系統

 1.平台版本說明:

節點角色       IP 地址      CPU   內存
master           192.168.10.71    4 核    1GB
node1(minion1)     192.168.10.72    4 核    1GB
node2(minion2)     192.168.10.73    4 核    1GB
etcd            192.168.10.74    4 核    1GB
注: 正常需要 4 台機器,如果你內存不夠,master 和 etcd 可以運行在同一台機器上。

 2.系統的配置(所有機器)

關閉selinux

# 臨時關閉
$ setenforce 0  
# 永久關閉
$ vim /etc/selinux/config 
SELINUX=disabled

關閉且禁用防火牆

$ systemctl stop firewalld 
$ systemctl disable firewalld

修改hostname

vi /ect/hostname

# 四台機器分別修改為 
master
node1
node2
etcd

修改hosts文件

$ vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.71   master
192.168.10.72   node1
192.168.10.73   node2
192.168.10.74   etcd

更新yum

$ yum update -y

 

安裝相關組件

$ yum install -y etcd kubernetes ntp flannel

3.etcd服務器

# 修改配置文件
$ vim /etc/etcd/etcd.conf 
ETCD_NAME=default
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.10.74:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.74:2379"

# 啟動服務
$ systemctl start etcd   
$ systemctl enable etcd

#檢查etcd cluster狀態 
$ etcdctl cluster-health  
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.10.74:2379
cluster is healthy

# 設置一個key,下面會用到
etcdctl set /k8s/network/config '{"Network": "10.255.0.0/16"}'

4.master服務器

#  配置kube-apiserver配置文件

$  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.10.71:8080"

$ vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.10.74:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=AlwaysAdmit"
KUBE_API_ARGS=""

#配置kube-scheduler配置文件,此處可以不需要配置
vim /etc/kubernetes/scheduler 
KUBE_SCHEDULER_ARGS="--address=0.0.0.0"

# 啟動服務
systemctl start kube-apiserver kube-controller-manager kube-scheduler
systemctl enable kube-apiserver kube-controller-manager kube-scheduler
systemctl status kube-apiserver kube-controller-manager kube-scheduler

5.node1節點  

# 配置node1網絡
$ vim /etc/sysconfig/flanneld 
FLANNEL_ETCD_ENDPOINTS="http://192.168.10.74:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens33"   # ens是當前可用上網的網卡名稱,此處是多個網卡時需要指定,不然不需要指定

# 配置node1 kube-proxy
$ 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.10.71:8080"

# 配置node1 kubelet
$ vim /etc/kubernetes/kubelet 
KUBELET_ADDRESS="--address=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=node1"
KUBELET_API_SERVER="--api-servers=http://192.168.10.71:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

# 啟動node1服務
systemctl start flanneld kube-proxy kubelet
systemctl enable flanneld kube-proxy kubelet
systemctl status flanneld kube-proxy kubelet

6.node2節點

# 配置node2網絡
$ vim /etc/sysconfig/flanneld 
FLANNEL_ETCD_ENDPOINTS="http://192.168.10.74:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens33"     # ens是當前可用上網的網卡名稱,此處是多個網卡時需要指定,不然不需要指定   

# 配置node2 kube-proxy
$ 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.10.71:8080"

# 配置node2 kubelet
$ vim /etc/kubernetes/kubelet 
KUBELET_ADDRESS="--address=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=node1"
KUBELET_API_SERVER="--api-servers=http://192.168.10.71:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

# 啟動node1服務
systemctl start flanneld kube-proxy kubelet
systemctl enable flanneld kube-proxy kubelet
systemctl status flanneld kube-proxy kubelet

7.測試

[root@xuegod71 ~]# kubectl get nodes
NAME      STATUS    AGE
node1     Ready     19s
node2     Ready     18s

詳細可以參考:https://www.cnblogs.com/byron0918/p/8728876.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM