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
禁用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
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
[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
[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
下一集,將介紹如何安裝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
踩許多雷,看了這篇終於設定成功了,感謝分享教學
回覆刪除安裝成功,萬分感謝分享教學
回覆刪除感謝!安裝成功 .
回覆刪除我用centOS , 有個不同處 , swap -a 為swapoff -a
謝謝你的回報,很高興能幫上忙
刪除請教一下,看一些網是用yum install kubernetes來安裝,看它是沒有kubeadm, kubelet, kubectl,但有kube-proxy, kube-aipserver等等,究竟哪一種安裝才是正確?用yum install kubeadm kubelet kubectl好像是會把kube-proxy, kube-aipserver, etcd化為container……很混亂
回覆刪除不管哪一種服務或工具,如果你不清楚哪一種方法可以正確安裝,建議先參考官網文件,而kubeadm是官方文件所提供的安裝方法。
刪除以下是官方說明與教學:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
寫得真清楚,真是好文章
回覆刪除謝謝支持
刪除