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/
寫得真清楚,真是好文章
回覆刪除謝謝支持
刪除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.
回覆刪除