===============================================
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/