1. 程式人生 > >Kubernetes | 學習教程 (一)Kubernetes 1.9.0 離線安裝教程

Kubernetes | 學習教程 (一)Kubernetes 1.9.0 離線安裝教程

為了讓產品在迎來業務量爆發式增長前完成應對措施,在瀏覽無數的資料後,決定將服務逐漸進行容器化,最終能達到容器叢集的效果。而容器叢集的解決方案中,kubernetes(簡稱k8s)看起來是個可行的方案。我目前的理解是,k8s就是docker容器叢集的一個管理系統,有很多實用功能能提高開發、運維的效率。

嘗試過使用線上部署的方式,當時記得即使配了代理有些資源仍然拉不下來,糾結了一天最後查詢到了離線部署的教程(https://segmentfault.com/a/1190000012755243),這篇教程基本可以部署出可用的k8s。

本篇的部署內容和這個教程大體相同,我只是根據我部署的過程增補了一些描述和圖片、修改了原教程中一些存在問題的內容。

節點配置資訊表
節點主機名IPOSCPU核數  記憶體大小   
Master    K8s-master       192.168.12.21       centos 7       44G
Node1 K8s-node-1192.168.12.22centos 744G
Node2 K8s-node-2192.168.12.23centos 744G

 一、基礎設定

 1.1 安裝vim

yum install -y vim

 1.2 設定主機名

 Master上執行:

hostnamectl --static set-hostname  k8s-master

 Node1上執行:

hostnamectl --static set-hostname  k8s-node-1

 Node2上執行:

hostnamectl --static set-hostname  k8s-node-2

 # 重啟

reboot

 1.3 分別修改三個節點的hosts檔案,並使內容保持一致

# 編輯hosts檔案

vim /etc/hosts

# 新增下面的內容,wq儲存。

192.168.12.21 k8s-master
192.168.12.22 k8s-node-1
192.168.12.23 k8s-node-2

 1.4 關閉防火牆

這裡為了部署方便,我跟原教程一樣直接關了防火牆。

systemctl stop firewalld
systemctl disable firewalld

 1.5 關閉selinux

為了允許容器訪問主機檔案系統,這是pod網路所需的。目前必須這樣做,直到在kubelet中改進SELinux支援。

# 編輯config檔案

vim /etc/selinux/config

將SELINUX=enforcing改為SELINUX=disabled,wq儲存。

# 當前臨時關閉selinux(不重啟臨時關閉selinux的方式)

setenforce 0

 1.6 關閉swap

試驗下來k8s需要關閉虛擬記憶體。

# 當前臨時關閉虛擬記憶體

swapoff -a

# 修改/etc/fstab檔案

vim /etc/fstab

# 加#註釋掉下面的語句遮蔽SWAP的自動掛載,wq儲存

#/dev/mapper/centos-swap swapswapdefaults0 0

# 檢視記憶體使用情況

free -m

 1.7 配置路由引數,防止kubeadm報路由警告

CentOS 7上的某些使用者報告了由於iptables被繞過而導致流量被錯誤路由的問題。你應該確保net.bridge.bridge-nf-call-iptables在你的sysctl配置中設定為1。試驗下來即使是firewalld的也要修改配置。

# 將內容寫入k8s.conf檔案

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# 立即生效

sysctl --system

 1.8 獲取離線包

密碼:6uma

(教程裡作者提供的檔案中有個檔名和其教程的命令不一致,我修改該檔名後重新打包)

將k8s_images.tar.bz2上傳到/root下。

# 安裝 bzip2

yum install -y bzip2

# 解壓k8s_images.tar.bz2

tar -xjvf k8s_images.tar.bz2

 二、部署docker

 選擇安裝docker1.2,因為官方建議的版本。1.11、1.13和17.03版本也可以。17.06+版本可能有效,但未經過Kubernetes團隊的測試。

 2.1 安裝

yum install -y docker

 2.2 啟動

systemctl start docker
systemctl enable docker

 2.3 檢視版本

docker version

 2.4 設定映象加速器

牆的緣故,訪問docker hub不夠穩定,故需要設定映象加速器來解決這個問題。
這裡我使用的是阿里雲的映象加速器。登入阿里雲後,訪問https://cr.console.aliyun.com/#/accelerator

 

 ps:registry-mirrors的值必須帶https:// (有段時間阿里雲的教程中只有域名),否則會出現docker重啟報錯的情況。

 2.5 檢視docker檔案驅動 

docker info

這裡我們主要是看cgroup driver。因為K8S要求cgroup driver與docker的保持一致。yum方式部署的應該是1.12.6,其Cgroup Driver為systemd。

 

 三、分別在三個節點上部署kubeadm、kubelet、kubectl

 3.1 匯入映象 

複製程式碼
docker load </root/k8s_images/docker_images/etcd-amd64_v3.1.10.tar
docker load </root/k8s_images/docker_images/flannel_v0.9.1-amd64.tar
docker load </root/k8s_images/docker_images/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-kube-dns-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-sidecar-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/kube-apiserver-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-controller-manager-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-scheduler-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-proxy-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/pause-amd64_3.0.tar
docker load </root/k8s_images/kubernetes-dashboard_v1.8.1.tar
複製程式碼

 3.2 安裝

cd /root/k8s_images
rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
rpm -ivh kubernetes-cni-0.6.0-0.x86_64.rpm  kubelet-1.9.9-9.x86_64.rpm
rpm -ivh kubectl-1.9.0-0.x86_64.rpm
rpm -ivh kubeadm-1.9.0-0.x86_64.rpm

 3.3 修改kubelet的配置檔案

 kubelet預設的cgroup-driver和docker的不一樣,docker有的版本可能是cgroupfs,kubelet預設為systemd,如果不修改則會引起kubelet啟動失敗。

vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# 重新載入

systemctl daemon-reload

 3.4 啟動

systemctl enable kubelet && systemctl start kubelet

ps:此時用systemctl status檢視會發現服務沒有完全起來,這是因為還缺少許多檔案在K8S初始化補齊後才能完全執行,所以我們繼續部署。

 四、部署master節點

 4.1 初始化k8s

kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

 等待1分鐘後,出現下面的內容。

如果長時間(等待的時間超過3分鐘以上)始終停留在“[init] This might take a minute or longer if the control plane images have to be pulled.”,就要檢視/var/log/message裡的內容,是什麼錯誤導致初始化失敗。
排除錯誤後,先重置,再初始化。

# 初始化過程出現錯誤時,使用下面的命令重置
kubeadm reset
# 重置後再初始化
kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

上圖中的token資訊要記得保留,等會node的加入需要使用。如果忘記了,可以在master上通過kubeadm token list得到。預設token在24小時後過期,後續的node要加入叢集需要在master節點上用下面的命令重新生成token。

kubeadm token create

 4.2 配置環境變數

此時root使用者還不能使用kubelet控制叢集,還需要配置該環境變數。

# 將資訊寫入bash_profile檔案

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

# 立即生效

source ~/.bash_profile

 4.3 檢視版本

kubectl version

 4.4 安裝flannel

離線包有yml檔案,所以直接用。

# 建立flannel

kubectl create -f kube-flannel.yml

 五、部署node節點

 # 使用4.1儲存的“kubeadm join”的命令,分別將各個node節點加入master(token資訊請根據你實際部署的修改掉,這裡只是我部署時生成的內容

kubeadm join --token 1ff84c.b7828d504656ba64 192.168.12.21:6443 --discovery-token-ca-cert-hash sha256:ceb2b93ce7543174b8fa87628fbe1f3926b5206915fee06629195ea8b4b89fe7 

根據提示,到master節點上檢查下,在master上執行下面的命令。

kubectl get nodes

# kubernetes會在每個node節點建立flannel和kube-proxy的pod

 六、部署kubernetes-dashboard

雖然經過幾天的學習常用的k8s命令已經能熟練使用了,但是有個頁面能夠顯示資訊總比自己一個個命令查詢效率來的高,還好原教程的作者也將該頁面的yaml檔案儲存在離線包裡了。

由於k8s的工作負載都放在node節點上,所以等node部署完後才進行頁面的部署。

 6.1 修改配置檔案

# 編輯kubernetes-dashboard.yaml

cd /root/k8s_images
vim kubernetes-dashboard.yaml 

# 新增type: NodePort,暴露Dashboard服務。注意這裡只新增行type: NodePort即可,其他配置不用改。

(我這裡需要補個截圖)

 6.2 建立

kubectl create -f kubernetes-dashboard.yaml

 6.3 設定埠

由於系統預設的有效埠為30000-32767,故需要修改kube-apiserver.yaml設定我們需要的埠範圍。

# 修改kube-apiserver.yaml

vim /etc/kubernetes/manifests/kube-apiserver.yaml

# 新增下面的內容,wq儲存。

    - --service-node-port-range=1-65535

ps:-與--之間的不是空格

 6.4 設定驗證方式

預設驗證方式有kubeconfig和token,這裡都不用,我們使用basicauth的方式進行apiserver的驗證。

# 建立/etc/kubernetes/pki/basic_auth_file, 用於存放使用者名稱、密碼、使用者ID。

cat <<EOF >  /etc/kubernetes/pki/basic_auth_file
admin,admin,2
EOF

# 編輯kube-apiserver.yaml,給kube-apiserver新增basic_auth驗證

cd /etc/kubernetes/manifests
vim kube-apiserver.yaml

# 新增下面的內容,wq儲存。

    - --basic_auth_file=/etc/kubernetes/pki/basic_auth_file

ps:-與--之間的不是空格

 6.5 更新apiserver

改完kube-apiserver.yaml後如果直接更新kube-apiserver容器,有時會報“The connection to the server 192.168.12.21:6443 was refused - did you specify the right host or port?”,試驗後發現在更新之前還需要重啟kubelet。

# 重啟kubelet

systemctl restart kubelet

# 更新kube-apiserver容器

cd /etc/kubernetes/manifests
kubectl apply -f kube-apiserver.yaml

 6.6 授權

k8s 1.6以後的版本都採用RBAC授權模型。

# 檢視cluster-admin

kubectl get clusterrole/cluster-admin -o yaml

# 給admin授權。預設cluster-admin是擁有全部許可權的,將admin和cluster-admin bind這樣admin就有cluster-admin的許可權。

kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=admin

# 檢視

kubectl get clusterrolebinding/login-on-dashboard-with-cluster-admin -o yaml

 6.7 登入

由於https證書的問題,暫時只能先通過火狐瀏覽器增加安全例外的方式訪問http://192.168.12.21:32666(埠是6.1中kubernetes-dashboard.yaml檔案原作者配置的32666,如果需要修改請在6.1中進行修改後再建立)

6.4中,我配置的使用者名稱/密碼為admin/admin,故使用該使用者名稱密碼登入。

這篇文章非常棒,我按照步驟來,完全沒問題。