1. 程式人生 > >kubernetes入門之構建單機集群

kubernetes入門之構建單機集群

系統設計 python system error 命令 服務監控 there 除了 ons

1.kubernetes簡介

kubernetes簡稱k8s,它是一個全新的基於容器技術的分布式架構方案,它是谷歌十幾年來大規模應用容器技術的經驗累積和升華的一個重要成果。如果我們的系統設計遵循了k8s的設計思想,那麽傳統系統架構中哪些和業務沒有多大關系的底層代碼或功能模塊,都可以從我們的實現中消失。我們不必費心與負載均衡的選型,不必考慮引入或自己開發一個復雜的服務治理框架,不必再頭疼於服務監控和故障處理模塊的開發,因此系統後期運維難度和運維成本難度大大降低。

在k8s中,服務(Service)是核心,一個服務對象擁有如下關鍵特征:

  • 擁有一個唯一指定的名字
  • 擁有一個虛擬ip
  • 能夠提供某種遠程服務能力
  • 被映射到了提供這種服務能力的一組應用上

通過使用服務,我們不必擔心IP的變動性,因為服務一旦創建就不再變化,另外我們不必關心後臺有多少個服務進程,也不必擔心這些進程由於服務故障而部署到其他機器,後臺這些進程都是由相互獨立的容器(默認使用的是docker)所支持。k8s因此提供了pod對象來包裝這些容器,而pod運行在Node節點上,Node節點可以為一個物理機或者雲端機器,虛擬機等。同樣在集群管理上,k8s設計了Master節點和一群工作節點Node,而Master節點相當於k8s的首腦,我們的所有操作都先要發給master,而後通過Master來調配各個節點的工作。

k8s具備以下特征:

  • 自動包裝

根據資源需求和其他約束自動放置容器,同時不會犧牲可用性,混合關鍵和最大努力的工作負載,以提高資源利用率並節省更多資源。

  • 自我修復

重新啟動失敗的容器,在節點不可用時,替換和重新調度節點上的容器,對用戶定義的健康檢查不響應的容器會被中止,並且在容器準備好服務之前不會把其向客戶端廣播。

  • 橫向縮放

使用簡單的命令或 UI,或者根據 CPU 的使用情況自動調整應用程序副本數。

  • 服務發現和負載均衡

不需要修改您的應用程序來使用不熟悉的服務發現機制,Kubernetes 為容器提供了自己的 IP 地址和一組容器的單個 DNS 名稱,並可以在它們之間進行負載均衡。

  • 自動部署和回滾

Kubernetes 逐漸部署對應用程序或其配置的更改,同時監視應用程序運行狀況,以確保它不會同時終止所有實例。 如果出現問題,Kubernetes會為您恢復更改,利用日益增長的部署解決方案的生態系統。

  • 密鑰 和 配置管理

部署和更新密鑰和應用程序配置,不會重新編譯您的鏡像,不會在堆棧配置中暴露密鑰(secrets)。

  • 存儲編排

自動安裝您所選擇的存儲系統,無論是本地存儲,如公有雲提供商 GCP 或 AWS, 還是網絡存儲系統 NFS, iSCSI, Gluster, Ceph, Cinder, 或 Flocker。

  • 批處理

除了服務之外,Kubernetes還可以管理您的批處理和 CI 工作負載,如果需要,替換出現故障的容器。

2、安裝步驟

2.1、環境準備

阿裏雲centos7.6 64位系統,通過安全組配置開放8080,2379,2378及30000-31000端口。首先我們運行如下命令:

    $ wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
    $ rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

運行如上命令為了解決如下問題,該問題最本質的表現為pod一值為ContainerCreating狀態

FailedSynError syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)" 13m 11s 56 {kubelet 127.0.0.1} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image "registry.access.redhat.com/rhel7/pod-infrastructure:latest"

Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"

緊接著需要運行如下命令:

    $ iptables -P FORWARD ACCEPT

這樣解決了外網訪問kube-proxy無法進行有效的轉發問題

2.2、 安裝

最簡單的方式是通過yum來進行安裝,命令如下:

    $ yum install -y etcd kubernetes

安裝好軟件後,修改兩個配置文件

  • Docker配置文件目錄為/etc/sysconfig/docker,在這個文件中做如下修改
    # Modify these options if you want to change the way the docker daemon runs
    OPTIONS='--selinux-enabled=false --insecure-registry gcr.io --log-driver=journald --signature-verification=false'
  • Kubernetes apiServer配置文件位置:/etc/kubernetes/apiserver
    • —adminssion_control參數中的ServiceAccount刪除
    • 更改如下配置:
          # The address on the local server to listen to.
          KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

更改好後,我們依次啟動如下服務

    $ systemctl start docker
    $ systemctl start etcd
    $ systemctl start kube-apiserver
    $ systemctl start kube-controller-manager
    $ systemctl start kube-scheduler
    $ systemctl start kubelet
    $ systemctl start kube-proxy

至此一個單機版的集群就構建完畢

3、快速上手

3.1、創建RC

接下來我構建一個最簡單的tomcat應用為例,來帶大家體驗一下kubernetes的魔力。首先我們可以在Idea環境裏安裝一個kubernetes的插件,這個插件能夠友好的對配置文件進行提示。首先我們創建一個tomcat-rc.yaml的配置文件,代碼如下:

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: tomcat
    spec:
      replicas: 2
      selector:
        app: tomcat
      template:
        metadata:
          labels:
            app: tomcat
        spec:
          containers:
            - name: tomcat
              image: tomcat
              ports:
                - containerPort: 8080

ReplicationController(簡稱RC)是k8s的核心概念之一,簡單來說它定義了一個期望的場景,即聲明某種Pod的副本數量在任意時刻都符合某個預期的值,所以RC的定義主要包含如下幾個部分

  • Pod期待的副本數
  • 用於篩選目標的Label Selector
  • 當Pod的副本數量小於預期值的時候,用於創建新pod的模板

接著我們運行如下命令來創建RC:

    $ kubectl create -f tomcat-rc.yaml

我們可以通過如下命令來查看狀態:

    $ kubectl get rc

此時我們可以看到我們剛才創建的RC已經在運行了:

    NAME      DESIRED   CURRENT   READY     AGE
    tomcat    2         2         2         31s

我們可以運行:docker ps的命令來看看:

    CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES
    960183da4c2b        tomcat                       "catalina.sh run"        2 minutes ago       Up 2 minutes                            k8s_tomcat_tomcat-mt8b5_default_14ff9d6d-2cdd-11e9-bd6b-025000000001_0
    97c563415280        tomcat                       "catalina.sh run"        2 minutes ago       Up 2 minutes                            k8s_tomcat_tomcat-kfmdj_default_14fe9e52-2cdd-11e9-bd6b-025000000001_0

很有趣的情況我們可以看到,當我們創建RC時,k8s會創建對應副本數的docker容器,這也從側面反映了通過k8s能屏蔽docker相關容器的創建操作,我們只需要統一按照既定的排版規範就能編寫我們所需的容器

3.2、創建Service

容器創建好了,其實我們還有一位角色要粉墨登場,有了它的幫助。才叫一個合理的‘微服務’。其實k8s中service是一個非常非常核心的概念,它類似於代理門戶,同時它屏蔽了pod與外界訪問。我們來看一下模板示例:

    apiVersion: v1
    kind: Service
    metadata:
      name: tomcat
    spec:
      type: NodePort
      ports:
        - port: 8080
          protocol: tcp
          nodePort: 30001
      selector:
        app: tomcat
  • 默認情況下NodePort是外界訪問k8s集群的一種方式,nodePort的值是外界訪問的端口它會被映射到容器的8080端口上
  • selector.app的作用是將我們的Service與後臺運行的pod相關聯

然後運行如下命令創建服務:

    $ kubectl create -f tomcat-svc.yaml

創建完畢後我們可以運行如下命令來查看服務的情況

    $ kubectl get svc

運行完畢會得到如下信息:

    NAME          CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    tomcat        10.254.145.222   <nodes>       8080:30001/TCP   9d

緊接著我們可以運行curl http://localhost:30001即可獲得對應的結果

kubernetes入門之構建單機集群