kubernetes(k8s) 基礎概念

一、Node
Node做爲集羣中的工做節點,運行真正的應用程序,在Node上Kubernetes管理的最小運行單元是Pod。Node上運行着Kubernetes的Kubelet、kube-proxy服務進程,這些服務進程負責Pod的建立、啓動、監控、重啓、銷燬、以及實現軟件模式的負載均衡。
Node包含的信息:
  • Node地址:主機的IP地址,或Node ID。
  • Node的運行狀態:Pending、Running、Terminated三種狀態。
  • Node Condition:…
  • Node系統容量:描述Node可用的系統資源,包括CPU、內存、最大可調度Pod數量等。
  • 其餘:內核版本號、Kubernetes版本等。
查看Node信息:
kubectl describe node
二、Pod
Pod是Kubernetes最基本的操做單元,包含一個或多個緊密相關的容器,一個Pod能夠被一個容器化的環境看做應用層的「邏輯宿主機」;一個Pod中的多個容器應用一般是緊密耦合的,Pod在Node上被建立、啓動或者銷燬;每一個Pod裏運行着一個特殊的被稱之爲Pause的容器,其餘容器則爲業務容器,這些業務容器共享Pause容器的網絡棧和Volume掛載卷,所以他們之間通訊和數據交換更爲高效,在設計時咱們能夠充分利用這一特性將一組密切相關的服務進程放入同一個Pod中。
同一個Pod裏的容器之間僅需經過localhost就能互相通訊。
一個Pod中的應用容器共享同一組資源:
  • PID命名空間:Pod中的不一樣應用程序能夠看到其餘應用程序的進程ID;
  • 網絡命名空間:Pod中的多個容器可以訪問同一個IP和端口範圍;
  • IPC命名空間:Pod中的多個容器可以使用SystemV IPC或POSIX消息隊列進行通訊;
  • UTS命名空間:Pod中的多個容器共享一個主機名;
  • Volumes(共享存儲卷):Pod中的各個容器能夠訪問在Pod級別定義的Volumes;
Pod的生命週期經過Replication Controller來管理;經過模板進行定義,而後分配到一個Node上運行,在Pod所包含容器運行結束後,Pod結束。
Kubernetes爲Pod設計了一套獨特的網絡配置,包括:爲每一個Pod分配一個IP地址,使用Pod名做爲容器間通訊的主機名等。
三、Service
在Kubernetes的世界裏,雖然每一個Pod都會被分配一個單獨的IP地址,但這個IP地址會隨着Pod的銷燬而消失,這就引出一個問題:若是有一組Pod組成一個集羣來提供服務,那麼如何來訪問它呢?Service!
一個Service能夠看做一組提供相同服務的Pod的對外訪問接口,Service做用於哪些Pod是經過Label Selector來定義的。
  • 擁有一個指定的名字(好比my-mysql-server);
  • 擁有一個虛擬IP(Cluster IP、Service IP或VIP)和端口號,銷燬以前不會改變,只能內網訪問;
  • 可以提供某種遠程服務能力;
  • 被映射到了提供這種服務能力的一組容器應用上;
若是Service要提供外網服務,需指定公共IP和NodePort,或外部負載均衡器;
2、Kubernetes整體架構
Master和Node
Kubernetes將集羣中的機器劃分爲一個Master節點和一羣工做節點(Node)。其中,Master節點上運行着集羣管理相關的一組進程etcd、API Server、Controller Manager、Scheduler,後三個組件構成了Kubernetes的總控中心,這些進程實現了整個集羣的資源管理、Pod調度、彈性伸縮、安全控制、系統監控和糾錯等管理功能,而且全都是自動完成。在每一個Node上運行Kubelet、Proxy、 Docker  daemon三個組件,負責對本節點上的Pod的生命週期進行管理,以及實現服務代理的功能。
流程 
經過Kubectl提交一個建立RC的請求,該請求經過API Server被寫入etcd中,此時Controller Manager經過API Server的監聽資源變化的接口監聽到這個RC事件,分析以後,發現當前集羣中尚未它所對應的Pod實例,因而根據RC裏的Pod模板定義生成一個Pod對象,經過API Server寫入etcd,接下來,此事件被Scheduler發現,它當即執行一個複雜的調度流程,爲這個新Pod選定一個落戶的Node,而後經過API Server講這一結果寫入到etcd中,隨後,目標Node上運行的Kubelet進程經過API Server監測到這個「新生的」Pod,並按照它的定義,啓動該Pod並不辭辛苦地負責它的下半生,直到Pod的生命結束。
隨後,咱們經過Kubectl提交一個新的映射到該Pod的Service的建立請求,Controller Manager會經過Label標籤查詢到相關聯的Pod實例,而後生成Service的Endpoints信息,並經過API Server寫入到etcd中,接下來,全部Node上運行的Proxy進程經過API Server查詢並監聽Service對象與其對應的Endpoints信息,創建一個軟件方式的負載均衡器來實現Service訪問到後端Pod的流量轉發功能。
  • etcd 
用於持久化存儲集羣中全部的資源對象,如Node、Service、Pod、RC、Namespace等;API Server提供了操做etcd的封裝接口API,這些API基本上都是集羣中資源對象的增刪改查及監聽資源變化的接口。
etcd是一個鍵值存儲倉庫,用於配置共享和服務發現。etcd受Zookeeper與doozer啓發而催生的項目。
etcd存儲
   etcd的存儲分爲內部存儲和持久化(硬盤)存儲兩部分。內存中的存儲除了順序化地記錄全部用戶對節點數據變動的記錄外,還會對用戶數據進行索引、建堆等方便查詢的操做。而持久化則使用WAL進行記錄存儲。在k8s中,全部數據的存儲以及操做記錄都在etcd中進行存儲,因此對於k8s集羣來講,etcd是至關重要的,一旦故障,可能致使整個集羣的癱瘓或者數據丟失。
   在WAL體系中,全部的數據在提交以前都會進行日誌記錄。持久化存儲的目錄分爲兩個:snap和wal。snapshot至關於數據壓縮,默認會將10000條wal操做記錄merge成snapshot,節省存儲,又保證數據不會丟失。
   WAL:存儲全部事務的變化記錄
   Snapshot:用於存放某一時刻etcd全部目錄的數據
  • API Server 
提供了資源對象的惟一操做入口,其餘全部組件都必須經過它提供的API來操做資源數據,經過對相關的資源數據「全量查詢」+「變化監聽」,這些組件能夠很「實時」地完成相關的業務功能。
  • Controller Manager 
集羣內部的管理控制中心,其主要目的是實現Kubernetes集羣的故障檢測和恢復的自動化工做,好比根據RC的定義完成Pod的複製或移除,以確保Pod實例數符合RC副本的定義;根據Service與Pod的管理關係,完成服務的Endpoints對象的建立和更新;其餘諸如Node的發現、管理和狀態監控、死亡容器所佔磁盤空間及本地緩存的鏡像文件的清理等工做也是由Controller Manager完成的。
  • Scheduler 
集羣中的調度器,負責Pod在集羣節點中的調度分配。
  • Kubelet 
負責本Node節點上的Pod的建立、修改、監控、刪除等全生命週期管理,同時Kubelet定時「上報」本Node的狀態信息到API Server裏。
  • Proxy 
實現了Service的代理與軟件模式的負載均衡器。
客戶端經過Kubectl命令行工具或Kubectl Proxy來訪問Kubernetes系統,在Kubernetes集羣內部的客戶端能夠直接使用Kuberctl命令管理集羣。Kubectl Proxy是API Server的一個反向代理,在Kubernetes集羣外部的客戶端能夠經過Kubernetes Proxy來訪問API Server。
API Server內部有一套完備的安全機制,包括認證、受權和准入控制等相關模塊。
###################################
安裝kubernetes
master:192.168.1.50
node:192.168.1.117
Master
一、在Master上安裝kubernetes etcd flannel
yum install kubernetes etcd flannel -y
二、修改配置文件/etc/kubernetes/controller-manager
#指定key文件,key文件能夠經過命令生成:openssl genrsa -out /etc/kubernetes/service.key 2048
KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/service.key"
3 修改配置文件/etc/kubernetes/apiserver
# The address on the local server to listen to. 設爲所有監聽
KUBE_API_ADDRESS="--address=0.0.0.0"
# Comma separated list of nodes in the etcd cluster . 指定etcd節點的地址
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.1.50:2379"
# Address range to use for services. 這個是設置從此運行Service所在的ip網段
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=192.168.100.0/24"
# Add your own! 指定key文件
KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/service.key"
4 修改配置文件/etc/kubernetes/config
# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://192.168.1.50:8080"
5 修改配置文件/etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.50:2379"
6 啓動etcd和kubernetes的服務
systemctl start etcd kube-apiserver kube-controller-manager kube-scheduler
systemctl enable etcd kube-apiserver kube-controller-manager kube-scheduler
7 修改配置文件/etc/sysconfig/flanneld
# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD="http://192.168.1.50:2379"
8 設置etcd config的值
# 建立一個文件內容以下,Network指定的IP將爲之後容器運行的網段:
cat /etc/sysconfig/flannel-config.json
{
  "Network":"172.16.0.0/16",
  "SubnetLen":24,
  "Backend":{
    "Type":"vxlan",
    "VNI":1
  }
}
# 經過文件內容來設置etc的config
etcdctl set atomic.io/network/config < flannel-config.json
9 啓動flannel服務 
systemctl start flanneld
systemctl enable flanneld
到這裏Master就安裝配置完畢,查看master信息:
kubectl cluster-info
----------------------------
node
1 安裝kubernetes和flannel
yum -y install kubernetes flannel
2 修改/etc/kubernetes/config
KUBE_MASTER="--master=http://192.168.1.50:8080"
3 修改/etc/kubernetes/kubelet
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"
# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=vm7.cluster.com"
# location of the api-server
KUBELET_API_SERVER="--api-servers=http://192.168.1.50:8080"
4 修改/etc/sysconfig/flanneld
# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD="http://192.168.1.50:2379"
5 啓動flannel和kube相關服務
# 注意Node和Master上啓動的kube的服務是不同的
systemctl start flanneld kube-proxy kubelet
systemctl enable flanneld kube-proxy kubelet
# 重啓docker服務
systemctl restart docker
到此,Node節點配置完畢,能夠在Master上執行下面命令查看節點信息
kubectl get nodes
###########################################
實例
利用 Kubernetes 部署個容器
1) 建立一個 web_server 的鏡像---在任意 node 節點
# vim Dockfile
# create new
FROM centos
MAINTAINER user1 <user1@cluster.com>
# Update Yum Repostory
RUN curl -s -L http://mirrors.aliyun.com/repo/Centos-7.repo -o \
/etc/yum.repos.d/CentOS7-Base.repo && \
curl -s -L http://mirrors.aliyun.com/repo/epel-7.repo -o \
/etc/yum.repos.d/epel7.repo
RUN yum clean all && \
yum makecache fast && \
yum -y update
yum -y install httpd
RUN yum clean all
EXPOSE 80
CMD ["-D","FOREGROUND"]
ENTRYPOINT ["/usr/sbin/httpd"]
# docker build -t web_server .
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
web_server latest 875ba006f185 9 seconds ago 337 MB
docker.io/centos latest e934aafc2206 12 hours ago 199 MB
【將此鏡像導出來,在另外一節點導入,固然也能夠直接使用 docker build】
[# http: //mirrors.aliyun.com/repo/Centos-7.repo]
2)在 master 建立一個 pod
cat pod-webserver.yaml
apiVersion: v1 kind: Pod metadata: name: httpd spec: containers: - name: httpd image: web_server ports: - containerPort: 80 volumeMounts: # 定義一個掛載目錄 /var/www/html - name: httpd-storage # mount point inside Container mountPath: /var/www/html volumes: - name: httpd-storage hostPath: # 把/var/docker/disk01 目錄 掛載到窗口中的 /var/www/html path: /var/docker/disk01
建立:
# kubectl create -f pod-webserver.yaml
使用命令查看建立的狀態,狀態爲Pending[準備中],Running 狀態[已經建立成功]
# kubectl get pods
查看該容器在哪一個節點
# kubectl get pods -o wide
查看該容器的全部狀態
# kubectl get pods httpd -o yaml
測試---在node節點
# echo ${HOSTNAME} > /var/docker/disk01/index.html
# curl http://10.1.15.2
刪除 Pod
# kubectl delete pod httpd
相關文章
相關標籤/搜索