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 ~]# swap -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

1 則留言:

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

    回覆刪除