1. 程式人生 > >容器編排之Kubernetes1.6.1安裝與配置_Kubernetes中文社群

容器編排之Kubernetes1.6.1安裝與配置_Kubernetes中文社群

在經歷了幾年混亂的職業生涯之後,初步把未來延伸領域定位在容器雲方向。區塊鏈系列我還會繼續寫下去,且可能只會關注Hyperledger。

雲端計算是最近幾年來火熱的技術領域,不同於其他,他沒有固定的行業領域限制,他只是基礎設施。任何基建於計算機上的服務,在達到一定規模後,都可應用雲端計算解決方案使硬體資源高效利用,統一開發運維,提高服務可靠性,降低企業支出等等。近兩年火熱的大資料、人工智慧等都離不開背後計算叢集的支援。擁抱雲端計算,擁抱未來。且說到雲端計算,外行人都會覺得很高大上,其實我覺得更多的是拿來主義,就是將一系列開源軟體按照公司的業務架構搭配起來,大部分的工作其實是熟悉開源軟體,解決他們的坑,順便反饋開源社群,促進其發展。

雲端計算也是有領域劃分的,從物理機–>虛擬機器–>容器技術的發展,孵化出了openstack、docker,kubernetes等這樣的開源專案,openstack使得物理機到虛擬機器的轉變變的簡單,而docker的出現,更是將這種簡單極致化,將雲端計算推向容器雲階段。而如何將docker的容器在叢集的規模上高效的管理,則是kubernetes出現的源動力。

廢話不多說,本文主要是手動安裝配置kubernetes叢集,一個master節點(10.1.2.146)和兩個node節點(10.1.2.147、10.1.2.148)。發文的時候,kubernetes的最新版本為1.6.1,我們就安裝這個版本吧。

下載地址

系統配置

Linux i-pw3kctun 4.4.0-42-generic #62-Ubuntu SMP Fri Oct 7 23:11:45 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

H/W path        Device  Class          Description
==================================================
                        system         OpenStack Nova
/0                      bus            Motherboard
/0/0                    memory         96KiB BIOS
/0/400                  processor      Intel Core Processor (Haswell)
/0/1000                 memory         1GiB System Memory
/0/1000/0               memory         1GiB DIMM RAM
/0/100                  bridge         440FX - 82441FX PMC [Natoma]
/0/100/1                bridge         82371SB PIIX3 ISA [Natoma/Triton II]
/0/100/1.1              storage        82371SB PIIX3 IDE [Natoma/Triton II]
/0/100/1.2              bus            82371SB PIIX3 USB [Natoma/Triton II]
/0/100/1.2/1    usb1    bus            UHCI Host Controller
/0/100/1.2/1/1          input          QEMU USB Tablet
/0/100/1.3              bridge         82371AB/EB/MB PIIX4 ACPI
/0/100/2                display        GD 5446
/0/100/3        eth0    network        Virtio network device
/0/100/4                communication  Virtio console
/0/100/5                storage        Virtio block device
/0/100/6                generic        Virtio memory balloon

先決條件

  1. 在node節點必須有docker,docker的安裝請參考官方文件
  2. etcd 3:因為kubernetes1.6版本切換到了etcd 3,所以不要安裝錯了,安裝文件參考官方文件
  3. flannel:此處我們採用flannel作為kubernetes的網路增強元件,現在有很多第三方開源軟體支援kubernetes的叢集pod互通,flannel只是其中的一種。安裝文件參考官方文件

自定義安裝

kubernetes官方提供了各種各樣的安裝方式,基於雲提供商的,基於juju的,基於homebrew的,基於原始碼編譯的,此處我們選擇已經編譯好的二進位制檔案安裝。

下載地址

注:下載下來的並不是kubernetes的可執行檔案,而是一系列的指令碼,可以理解為kubernetes 的下載器

下載下來後,解壓縮

tar xzvf kubernetes.tar.gz
cd kubernetes

執行get-kube-binaries.sh下載server和client的可執行檔案

$ ./cluster/get-kube-binaries.sh
Kubernetes release: v1.6.1
Server: linux/amd64  (to override, set KUBERNETES_SERVER_ARCH)
Client: linux/amd64  (autodetected)

Will download kubernetes-server-linux-amd64.tar.gz from https://storage.googleapis.com/kubernetes-release/release/v1.6.1
Will download and extract kubernetes-client-linux-amd64.tar.gz from https://storage.googleapis.com/kubernetes-release/release/v1.6.1
Is this ok? [Y]/n
y
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  1  346M    1 3598k    0     0   398k      0  0:14:52  0:00:09  0:14:43  464k

md5sum(kubernetes-server-linux-amd64.tar.gz)=c4c1e770789b5017df9f0ab0e945320a
sha1sum(kubernetes-server-linux-amd64.tar.gz)=34066d8230a276650ad65ca459ac28dd2901e1c0

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 63 29.0M   63 18.3M    0     0   367k      0  0:01:20  0:00:51  0:00:29  396k

md5sum(kubernetes-client-linux-amd64.tar.gz)=c2acf197ee6d9b56d3ee790b9aee789d
sha1sum(kubernetes-client-linux-amd64.tar.gz)=10466d24f9e11f749b2b20747b4f096c664b05f3

Extracting /root/kubernetes/client/kubernetes-client-linux-amd64.tar.gz into /root/kubernetes/platforms/linux/amd64
Add '/root/kubernetes/client/bin' to your PATH to use newly-installed binaries.

執行該shell會自動下載kube的server和client可執行檔案,其中客戶端檔案會自動安裝在kubernetes目錄下的client資料夾下,只需將bin新增到PATH下就可以了。

可以不用管這裡的bin,server的可執行包裡也包含了客戶端命令列工具

服務端可執行檔案下載到了server資料夾,沒有被自動展開

cd server
tar xzvf kubernetes-server-linux-amd64.tar.gz
ll kubernetes/server/bin
total 1.6G
-rwxr-x--- 1 root root 115M Apr  4 04:54 cloud-controller-manager
-rwxr-x--- 1 root root 182M Apr  4 04:54 hyperkube
-rwxr-x--- 1 root root  53M Apr  4 04:54 kube-aggregator
-rw-r----- 1 root root   33 Apr  4 04:54 kube-aggregator.docker_tag
-rw-r----- 1 root root  54M Apr  4 04:54 kube-aggregator.tar
-rwxr-x--- 1 root root 143M Apr  4 04:54 kube-apiserver
-rw-r----- 1 root root   33 Apr  4 04:54 kube-apiserver.docker_tag
-rw-r----- 1 root root 144M Apr  4 04:54 kube-apiserver.tar
-rwxr-x--- 1 root root 126M Apr  4 04:54 kube-controller-manager
-rw-r----- 1 root root   33 Apr  4 04:54 kube-controller-manager.docker_tag
-rw-r----- 1 root root 127M Apr  4 04:54 kube-controller-manager.tar
-rwxr-x--- 1 root root  62M Apr  4 04:54 kube-proxy
-rw-r----- 1 root root   33 Apr  4 04:54 kube-proxy.docker_tag
-rw-r----- 1 root root 106M Apr  4 04:54 kube-proxy.tar
-rwxr-x--- 1 root root  73M Apr  4 04:54 kube-scheduler
-rw-r----- 1 root root   33 Apr  4 04:54 kube-scheduler.docker_tag
-rw-r----- 1 root root  74M Apr  4 04:54 kube-scheduler.tar
-rwxr-x--- 1 root root  67M Apr  4 04:54 kubeadm
-rwxr-x--- 1 root root  68M Apr  4 04:54 kubectl
-rwxr-x--- 1 root root  65M Apr  4 04:54 kubefed
-rwxr-x--- 1 root root 133M Apr  4 04:54 kubelet

這裡就是最新版本的kubernetes可執行檔案列表。要構建kubernetes叢集,需要在master節點啟動kube-apiserver, kube-controller-manager, kube-scheduler,在每個節點啟動kubelet和kube-proxy。這裡我們不直接執行,採用systemctl管理。

注:需要根據個人伺服器檔案路徑自由定義,不可照抄

kube-apiserver.service

[Unit]
Description=Kube-apiserver Service
After=network.target

[Service]
Type=notify
ExecStart=/root/kubernetes/server/kubernetes/server/bin/kube-apiserver \
            --admission-control=NamespaceAutoProvision,LimitRanger,SecurityContextDeny \
            --apiserver-count=1 \
            --cors-allowed-origins=.* \
            --enable-garbage-collector=false \
            --etcd-servers=http://10.1.2.154:2379 \
            --insecure-bind-address=0.0.0.0 \
            --insecure-port=8080 \
            --log-dir=/root/kubernetes/kube-apiserver \
            --logtostderr=false \
            --service-cluster-ip-range=192.168.2.0/24 \
            --v=5 \

Restart=always
LimitNOFILE=65536

[Install]
WantedBy=default.target

kube-controller-manager.service

[Unit]
Description=Kube-controller-manager Service
After=network.target

[Service]
Type=simple
ExecStart=/root/kubernetes/server/kubernetes/server/bin/kube-controller-manager \
          --enable-garbage-collector=false \
          --logtostderr=false \
          --log-dir=/root/kubernetes/log/kube-controller-manager \
          --pod-eviction-timeout=5m0s \
          --master=http://0.0.0.0:8080 \
          --node-monitor-grace-period=40s \
          --terminated-pod-gc-threshold=12500 \
          --leader-elect=true \
          --v=4 \

Restart=always
LimitNOFILE=65536

[Install]
WantedBy=default.target

kube-scheduler.service

[Unit]
Description=Kube-scheduler Service
After=network.target

[Service]
Type=simple
ExecStart=/root/kubernetes/server/kubernetes/server/bin/kube-scheduler \
            --log-dir=/root/kubernetes/log/kube-scheduler \
            --logtostderr=false \
            --master=http://0.0.0.0:8080 \
            --leader-elect=true \
            --v=5 \

Restart=always
LimitNOFILE=65536

[Install]
WantedBy=default.target

接著執行命令:

systemctl --system daemon-reload
systemctl start kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl start kube-scheduler.service

如果想隨伺服器自動啟動,請參考systemctl相關命令

這樣,master上的kubernetes元件就全部跑起來了,可以使用kubectl檢查是否執行正常:

╭─[email protected] in ~/kubernetes/server/kubernetes/server/bin
╰$ ./kubectl cluster-info
Kubernetes master is running at http://localhost:8080

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

接著,搭建兩個Node節點,可以只將kube-proxy和kubelet拷貝到Node節點。

kubelet.service

[Unit]
Description=Kubelet Service
After=network.target

[Service]
Type=simple
ExecStart=/root/kubernetes/kubelet \
            --api-servers=http://10.1.2.154:8080 \
            --hostname-override=10.1.2.147 \
            --image-gc-high-threshold=80 \
            --image-gc-low-threshold=50 \
            --log-dir=/root/kubernetes/log/kubelet \
            --logtostderr=false \
            --pod-infra-container-image=docker.cloudin.com/google_containers/pause-amd64:3.0 \
            --system-reserved cpu=2000m,memory=4G \
            --v=5 \

Restart=always
LimitNOFILE=65536

[Install]
WantedBy=default.target

kube-proxy.service

[Unit]
Description=Kube-proxy Service
After=network.target

[Service]
Type=simple
ExecStart=/root/kubernetes/kube-proxy  \
            --log-dir=/root/kubernetes/log/kube-proxy \
            --logtostderr=false \
            --master=http://10.1.2.154:8080 \
            --v=5 \

Restart=always
LimitNOFILE=65536

[Install]
WantedBy=default.target
systemctl --system daemon-reload
systemctl start kubelet.service
systemctl start kube-proxy.service

檢查叢集搭建情況:

i-pyv2wj89 :: ~ » ./kubernetes/client/bin/kubectl get node
NAME         STATUS    AGE       VERSION
10.1.2.147   Ready     24m       v1.6.1
10.1.2.148   Ready     1m        v1.6.1

自此,kubernetes叢集就搭建起來了,供大家參考。當然,這是最簡單的叢集配置,用於學習夠了,但是生產環境還是要自定義更多的配置項。

下一篇文章我會寫kubernetes的認證與授權,敬請期待!

注:flannel其實跟kubernetes的叢集是沒有關聯在一起的,flannel的主要作用是配置Node節點的docker IP範圍,具體做法請另行查閱。