使用離線包部署kubernetes 1.9.0、kubernetes-dashboard 1.8


===============================================

 2018/3/22_第2次修改                       ccb_warlock

 

更新說明:

2018/3/22:修改了6.7中k8s-dashboard中url錯誤的問題;

===============================================

為了讓產品在迎來業務量爆發式增長前完成應對措施,在瀏覽無數的資料后,決定將服務逐漸進行容器化,最終能達到容器集群的效果。而容器集群的解決方案中,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 獲取離線包

離線包鏈接:https://pan.baidu.com/s/1eTWTXSI 

密碼: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證書的問題,暫時只能先通過火狐瀏覽器增加安全例外的方式訪問https://192.168.12.21:32666(端口是6.1中kubernetes-dashboard.yaml文件原作者配置的32666,如果需要修改請在6.1中進行修改后再創建)

6.4中,我配置的用戶名/密碼為admin/admin,故使用該用戶名密碼登錄。

 

 

 


 參考資料:

1.https://segmentfault.com/a/1190000012755243

2.《kubernetes權威指南》

3.https://kubernetes.io/docs/setup/independent/install-kubeadm/

4.https://www.cnblogs.com/liuxuzzz/p/5324749.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM