Kubernetes | 學習教程 (一)Kubernetes 1.9.0 離線安裝教程
為了讓產品在迎來業務量爆發式增長前完成應對措施,在瀏覽無數的資料後,決定將服務逐漸進行容器化,最終能達到容器叢集的效果。而容器叢集的解決方案中,kubernetes(簡稱k8s)看起來是個可行的方案。我目前的理解是,k8s就是docker容器叢集的一個管理系統,有很多實用功能能提高開發、運維的效率。
嘗試過使用線上部署的方式,當時記得即使配了代理有些資源仍然拉不下來,糾結了一天最後查詢到了離線部署的教程(https://segmentfault.com/a/1190000012755243),這篇教程基本可以部署出可用的k8s。
本篇的部署內容和這個教程大體相同,我只是根據我部署的過程增補了一些描述和圖片、修改了原教程中一些存在問題的內容。
節點配置資訊表 | |||||
節點 | 主機名 | IP | OS | CPU核數 | 記憶體大小 |
Master | K8s-master | 192.168.12.21 | centos 7 | 4 | 4G |
Node1 | K8s-node-1 | 192.168.12.22 | centos 7 | 4 | 4G |
Node2 | K8s-node-2 | 192.168.12.23 | centos 7 | 4 | 4G |
一、基礎設定
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,故使用該使用者名稱密碼登入。
這篇文章非常棒,我按照步驟來,完全沒問題。