2019年8月20日 星期二

CentOS 7.6上安裝 Kubernetes(一)叢集佈署


Kubernetes(又稱k8s)是一套由Google開源用以管理數量龐大的容器管理平台,如同當年OpenStack統治主宰著VirtaulMachine的運維一般,然而Google一出誰與爭鋒,連原本由Docker公司所主導的swarm容器管理平台也黯然失色,面對DevOps開發方法快速崛起的這個時代,即便無法立刻導入、也需對容器甚至是其上層的管理平台有基本的sense。

Kubernetes的cluster(叢集)架構分為master主機與worker nodes主機,其中master負責cluster裡所有容器的安排、分配與監控,並透過api server與cluster中所有worker nodes聯繫,有趣的是,因應Container微服務的理念,Kubernetes各個功能元件也是透過數個Container(容器)來運作,成為一個良好的示範。


進入Kubernetes的門檻並不低,我在網上參考的數十篇安裝教學文章都難以完美的安裝好一個Kubernetes Cluster,主要是這個項目在這兩年的進展太快,其所依賴或聯繫的套件都可能發生支援性的問題,再加上大陸方面有牆的問題,導致他們所使用的步驟方法未必適合沒有牆的地方,因此決定整理一篇step by step的安裝文件來幫助想入門的同學。




實習環境設定


Ip Address Hostname Cpu Ram GuestOS
192.168.101.28 master 2 4 CentOS 7.6 minimal
192.168.101.29 node01 2 4 CentOS 7.6 minimal
192.168.101.30 node02 2 4 CentOS 7.6 minimal

軟體規格
Docker version: 19.03
Kubernetes version: 1.15.2



所有機器安裝步驟


CentOS 7.6x64 minimal環境下加裝常用工具
[root@server ~]# yum install wget net-tools nano -y
為叢集設置主機名稱以便nodes間的相互溝通,XXXXXX分別對應自己的角色Hostname
[root@server ~]# hostnamectl set-hostname XXXXXX
[root@server ~]# nano /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.101.28 master
192.168.101.29 node01
192.168.101.30 node02
禁用Selinux與swap,kubernetes基於性能理由建議關閉swap、更改fstab檔案註解swap分區以避免重開機後再次作用
[root@server ~]# setenforce 0
[root@server ~]# sed -i 's@SELINUX=enforcing@SELINUX=disabled@' /etc/sysconfig/selinux
[root@server ~]# swapoff -a
[root@server ~]# nano /etc/fstab

/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d6c473d3-41d5-4778-847c-58a43556de4b /boot                   xfs     defaults        0 0
# /dev/mapper/centos-swap swap                    swap    defaults        0 0
iptables相關功能或模組的啟用與停用,後續kubernetes會接手管理這部分的網路功能
[root@server ~]# systemctl disable firewalld && systemctl stop firewalld
[root@server ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@server ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@server ~]# echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
[root@server ~]# modprobe br_netfilter
[root@server ~]# echo "br_netfilter" > /etc/modules-load.d/br_netfilter.conf
[root@server ~]# sysctl -p
[root@server ~]# lsmod | grep br_netfilter
br_netfilter           22256  0 
bridge                151336  1 br_netfilter
參照 Oracle container User's guide [註解1],將 br_netfilter模組特別寫入/etc/modules-load.d的目錄中,讓重開機後的作業系統能夠自動載入,不知道什麼原因在網路上絕大多數的安裝教學甚至是官方文件[註解2]都沒有提到這點。

添加docker-ce與kubernetes的yum源、並重整yum倉庫
[root@server ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@server ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@server ~]# nano /etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
[root@server ~]# yum clean all && yum repolist
安裝docker-ce與kubernetes、指定套件的安裝版本並設置為開機啟動
[root@server ~]# yum install docker-ce-18.09.8 --nogpgcheck
[root@server ~]# systemctl enable docker && systemctl start docker
[root@server ~]# yum install kubelet-1.15.2 kubectl-1.15.2 kubeadm-1.15.2 --nogpgcheck --disableexcludes=kubernetes
[root@server ~]# systemctl enable kubelet.service
關於 docker和 kubernetes的安裝版本就是一個坑,前往 github閱讀 kubernetes的 CHANGELOG[註解3]可以發現,不同的 kubernetes版本所支援的 docker版本都是不同的,以 1.15.x版本來說,目前合法支援最高只到 docker v1.18.09版本,為了日後不踩雷,還是蹲好蹲滿吧!



master機器初始化


初始化master,api-server-advertise指定為master的內部IP,pod-network-cidr與service-cidr我都採預設值,你也可以變更為其他
[root@master ~]# kubeadm init --apiserver-advertise-address=192.168.101.28 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --kubernetes-version=v1.15.2 --cri-socket="/var/run/dockershim.sock"
經歷一連串的初始安裝過程,會收穫類似以下的資訊,紅字的前三行是在說明作為master角色還需手動輸入提示的指令,才能順利運作這個叢集,而最下方的kubeadm範例則是提示worker nodes欲加入叢集所需輸入的指令
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.101.28:6443 --token gny70m.2v41qsd2t3jllxk \
    --discovery-token-ca-cert-hash sha256:f25d9d5d03fe993976daa053f23c546fa946cb6faa92c82c5c1946806aa57932
乖乖按照指示輸入指令
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~-# chown $(id -u):$(id -g) $HOME/.kube/config
安裝通用的 flannel容器網路介面CNI(Container Network Interface)元件
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml



nodes機器加入叢集


至兩台node輸入上一節worker nodes欲加入叢集所需輸入的指令,就是這麼簡單!
[root@node01 ~]# kubeadm join 192.168.101.28:6443 --token gny70m.2v41qsd2t3jllxk --discovery-token-ca-cert-hash sha256:f25d9d5d03fe993976daa053f23c546fa946cb6faa92c82c5c1946806aa57932
約莫一分鐘左右的生效時間,至master機器上查詢叢集狀況,基本確認status ready即可
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master    1h   v1.15.2
node01   Ready    <none>    1h   v1.15.2
node02   Ready    <none>    1h   v1.15.2



在kubernetes cluster中建立容器並驗證


佈署名為nginx的容器,映像檔名稱為nginx,透過參數deployment會自動幫你創建好kubernetes中的最小管理邏輯單位pod與容器
[root@master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
查閱nginx佈署的情況
[root@master ~]# kubectl describe deployment nginx
Name:                   nginx
Namespace:              default
CreationTimestamp:      Tue, 20 Aug 2019 12:16:42 +0800
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-554b9c67f9 (1/1 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  2m56s  deployment-controller  Scaled up replica set nginx-554b9c67f9 to 1
替容器建立一個port mapping的service,讓nginx服務可以被外部存取
[root@master ~]# kubectl create service nodeport nginx --tcp=80:80
service/nginx created
查詢service mapping的情況
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-554b9c67f9-f8gpt   1/1     Running   0          8m56s
[root@master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        1h
nginx        NodePort    10.99.63.55   <none>        80:32585/TCP   1h
透過任一Node外網地址確認服務是否正常啟用




下一集,將介紹如何安裝Kubernetes圖形化管理元件dashboard與資源監控元件metrics-server。

本文內容參閱以下連結:
安装 kubeadm(中文官方文件)
Kubernetes中文指南/云原生应用架构实践手册

Oracle container User's guide [註解1]
Installing kubeadm(英文官方文件) [註解2]
kubernetes/CHANGELOG-1.15.md [註解3]
How to Install Kubernetes (k8s) 1.7 on CentOS 7 / RHEL 7
How to Install, Configure, and Deploy NGINX on a Kubernetes Cluster

How to Install a Kubernetes Docker Cluster on CentOS 7
Previous Post
Next Post

9 則留言:

  1. 踩許多雷,看了這篇終於設定成功了,感謝分享教學

    回覆刪除
  2. 安裝成功,萬分感謝分享教學

    回覆刪除
  3. 感謝!安裝成功 .
    我用centOS , 有個不同處 , swap -a 為swapoff -a

    回覆刪除
    回覆
    1. 謝謝你的回報,很高興能幫上忙

      刪除
  4. 請教一下,看一些網是用yum install kubernetes來安裝,看它是沒有kubeadm, kubelet, kubectl,但有kube-proxy, kube-aipserver等等,究竟哪一種安裝才是正確?用yum install kubeadm kubelet kubectl好像是會把kube-proxy, kube-aipserver, etcd化為container……很混亂

    回覆刪除
    回覆
    1. 不管哪一種服務或工具,如果你不清楚哪一種方法可以正確安裝,建議先參考官網文件,而kubeadm是官方文件所提供的安裝方法。

      以下是官方說明與教學:
      https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

      刪除
  5. 寫得真清楚,真是好文章

    回覆刪除
  6. This means that success in manufacturing will rely less on scale and extra on the standard of concepts. Good concepts could be copied much more quickly with 3D printing, so battles over intellectual property could turn into much more intense. It will be isture wicking underwear simpler for imitators properly as|in addition to} innovators to get items to market quick.

    回覆刪除