K8S初探

K8S初探——基本概念+服務啓動

核心概念

  1. Pod:Pod是在K8s集羣中運行部署應用或服務的最小單元,它是可以支持多容器的。Pod的設計理念是支持多個容器在一個Pod中共享網絡地址和文件系統,可以通過進程間通信和文件共享這種簡單高效的方式組合完成服務。(Pod是一組容器的組合,這些容器一起合作對外提供一個服務)

  2. 複製控制器(Replication Controller,RC)
    RC是K8s集羣中最早的保證Pod高可用的API對象。通過監控運行中的Pod來保證集羣中運行指定數目的Pod副本。指定的數目可以是多個也可以是1個;少於指定數目,RC就會啓動運行新的Pod副本;多於指定數目,RC就會殺死多餘的Pod副本。即使在指定數目爲1的情況下,通過RC運行Pod也比直接運行Pod更明智,因爲RC也可以發揮它高可用的能力,保證永遠有1個Pod在運行。RC是K8s較早期的技術概念,只適用於長期伺服型的業務類型,比如控制小機器人提供高可用的Web服務。(類似於分佈式系統中的副本)

  3. 副本集(Replica Set,RS)
    RS是新一代RC,提供同樣的高可用能力,區別主要在於RS後來居上,能支持更多種類的匹配模式。副本集對象一般不單獨使用,而是作爲Deployment的理想狀態參數使用。

  4. 有狀態服務集(PetSet)
    RC和RS主要是控制提供無狀態服務的,其所控制的Pod的名字是隨機設置的,一個Pod出故障了就被丟棄掉,在另一個地方重啓一個新的Pod,名字變了、名字和啓動在哪兒都不重要,重要的只是Pod總數;而PetSet是用來控制有狀態服務,PetSet中的每個Pod的名字都是事先確定的,不能更改。需要關聯與該Pod對應的狀態。適合於PetSet的業務包括數據庫服務MySQL和PostgreSQL,集羣化管理服務Zookeeper、etcd等有狀態服務。使用PetSet,Pod仍然可以通過漂移到不同節點提供高可用,而存儲也可以通過外掛的存儲來提供高可靠性,PetSet做的只是將確定的Pod與確定的存儲關聯起來保證狀態的連續性。PetSet還只在Alpha階段,後面的設計如何演變,還要繼續觀察。

二. 啓動

基於Docker啓動一個k8s單點服務:

前提

  1. 你必須擁有一臺安裝有Docker的機器。

  2. 你的內核必須支持 memory and swap accounting 。確認你的linux內核開啓瞭如下配置:

    CONFIG_RESOURCE_COUNTERS=y
    CONFIG_MEMCG=y
    CONFIG_MEMCG_SWAP=y
    CONFIG_MEMCG_SWAP_ENABLED=y
    CONFIG_MEMCG_KMEM=y
    
  3. 以命令行參數方式,在內核啓動時開啓 memory and swap accounting 選項:

    GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
    

    注意:以上只適用於GRUB2。通過查看/proc/cmdline可以確認命令行參數是否已經成功

    傳給內核:

    $cat /proc/cmdline
    BOOT_IMAGE=/boot/vmlinuz-3.18.4-aufs root=/dev/sda5 ro cgroup_enable=memory
    swapaccount=1
    

第一步. 運行Etcd

docker run --net=host -d gcr.io/google_containers/etcd:2.0.12 /usr/local/bin/etcd --addr=127.0.0.1:4001 --bind-addr=0.0.0.0:4001 --data-dir=/var/etcd/data

第二步. 啓動master

docker run \
--volume=/:/rootfs:ro \
--volume=/sys:/sys:ro \
--volume=/dev:/dev \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/var/lib/kubelet/:/var/lib/kubelet:rw \
--volume=/var/run:/var/run:rw \
--net=host \
--pid=host \
--privileged=true \
-d \
gcr.io/google_containers/hyperkube:v1.0.1 \
/hyperkube kubelet --containerized --hostname-override="127.0.0.1" --address="0.0.0.0" --api-servers=http://localhost:8080 --config=/etc/kubernetes/manifests

這一步實際上運行的是 kubelet ,並啓動了一個包含其他master組件的[pod](…/userguide/pods.md)。

第三步. 運行service proxy

docker run -d --net=host --privileged gcr.io/google_containers/hyperkube:v1.0.1 /hyperkube proxy --master=http://127.0.0.1:8080 --v=2

三. 基本命令及驗證

first,下載kubectl二進制程序。

注意: 在OS/X上你需要通過ssh設置端口轉發:
boot2docker ssh -L8080:localhost:8080

  1. 列出集羣中的節點:

    kubectl get nodes

  2. 運行一個應用

    // 如果你運行了不同的Kubernetes集羣,指定 -s http://localhost:8080 來訪問本地集羣
    kubectl -s http://localhost:8080 run nginx --image=nginx --port=80

  3. 對外暴露服務

    kubectl expose rc nginx --port=80

  4. 獲取剛纔service的IP地址。有兩個IP,第一個是內部IP(CLUSTER_IP),第二個是外部的負載均衡IP。

    kubectl get svc nginx
    // 只獲取第一個IP(CLUSTER_IP):
    kubectl get svc nginx --template={{.spec.clusterIP}}

  5. 通過第一個IP(CLUSTER_IP)訪問服務:

    curl <insert-cluster-ip-here>

  6. 關閉集羣
    上面的各種容器都是運行在 kubelet 程序的管理下,它會保證容器一直運行,甚至容器意外退出時也不例外。所以,如果想關閉集羣,你需要首先關閉 kubelet 容器,再關閉其他。
    可以使用 docker kill $(docker ps -aq) 。注意這樣會關閉Docker下運行的所有容器,請謹慎使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章