基于Kubeadm搭建Kubernetes v1.11.2全記錄
所需鏡像
k8s.gcr.io/pause:3.1
k8s.gcr.io/coreDNS
quay.io/coreos/flannel:v0.10.0-amd64
k8s.gcr.io/etcd-amd64:3.2.18
k8s.gcr.io/kube-proxy-amd64:v1.11.2
k8s.gcr.io/kube-apiserver-amd64:v1.11.2
k8s.gcr.io/kube-controller-manager-amd64:v1.11.2
k8s.gcr.io/kube-scheduler-amd64:v1.11.2
監(jiān)控
gcr.io/google_containers/heapster-grafana-amd64:v4.4.3
gcr.io/google_containers/heapster-influxdb-amd64:v1.3.3
gcr.io/google_containers/heapster-amd64:v1.5.3
quay.io/calico/cni:v2.0.5
quay.io/calico/kube-controllers:v2.0.4
專注于為中小企業(yè)提供網(wǎng)站制作、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)句容免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了近1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
本文主要目的在于記錄個(gè)人在配置K8S集群的步驟,以及遇到的問題和相應(yīng)的解決方案,內(nèi)容從集群搭建到Kubernetes-Dashboard安裝,角色權(quán)限配置為止。
先簡(jiǎn)單介紹下環(huán)境,4個(gè)節(jié)點(diǎn)的情況如下:
節(jié)點(diǎn)名 IP OS 安裝軟件
Master 10.211.55.6 Centos7 kubeadm,kubelet,kubectl,docker
Node1 10.211.55.7 Centos7 kubeadm,kubelet,kubectl,docker
Node2 10.211.55.8 Centos7 kubeadm,kubelet,kubectl,docker
Node3 10.211.55.9 Centos7 kubeadm,kubelet,kubectl,docker
其中kubeadm,kubectl,kubelet的版本為v1.10.0,docker的版本為1.13.1。
一.各節(jié)點(diǎn)前期的準(zhǔn)備工作:
1.關(guān)閉并停用防火墻
systemctl stop firewalld.service
systemctl disable firewalld.service
2.永久關(guān)閉SELinux
vim /etc/selinux/config
SELINUX=disabled
3.同步集群系統(tǒng)時(shí)間
yum -y install ntp
ntpdate 0.asia.pool.ntp.org
4優(yōu)化
設(shè)置ipv4轉(zhuǎn)發(fā):
vim /etc/sysctl.d/k8s.conf:增加一行 net.ipv4.ip_forward = 1
sysctl -p /etc/sysctl.d/k8s.conf
centos7下net-bridge設(shè)置:
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
5.重啟機(jī)器
reboot
二.軟件安裝與配置:
注意??:軟件源按需配置,下面給出3個(gè)源,其中kubernetes yum源必須配置,docker源如果需要安裝docker-ce版本則需要安裝,否則最高支持1.13.1版本。
#阿里云yum源: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecache
#docker yum源 cat >> /etc/yum.repos.d/docker.repo <
yum -y install docker kubeadm kubelet kubectl ebtables
關(guān)閉SWAP
swapoff -a
啟動(dòng)docker并設(shè)為開機(jī)啟動(dòng):
systemctl start docker
systemctl enable docker
參數(shù)配置:
kubelet的cgroup驅(qū)動(dòng)參數(shù)需要和docker使用的一致,先查詢下docker的cgroup驅(qū)動(dòng)參數(shù):
docker info |grep cgroup
在docker v1.13.1下,該參數(shù)默認(rèn)為systemd,所以更改kubelet的配置參數(shù):
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
載入配置,啟動(dòng)kubelet:
systemctl daemon-reload
systemctl start kubelet
注意??:在啟動(dòng)kubeadm之前,一定要先啟動(dòng)kubelet,否則會(huì)顯示連接不上。
下面開始,分別操作Master節(jié)點(diǎn)和Node節(jié)點(diǎn):
啟動(dòng)Master節(jié)點(diǎn):
kubeadm init --kubernetes-version=1.10.0 --token-ttl 0 --pod-network-cidr=10.244.0.0/16
以上報(bào)錯(cuò)的話執(zhí)行下面的
kubeadm init --kubernetes-version=1.9.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.20.31 --node-name=node主機(jī)名
該命令表示kubenetes集群版本號(hào)為v1.10.0,token的有效時(shí)間為0表示永久有效,容器的網(wǎng)絡(luò)段為10.244.0.0/16,由于kubeadm安裝方式只能用于建立最小可用集群,所以很多addon是沒有集成的,包括網(wǎng)絡(luò)插件,需要之后安裝,但網(wǎng)段參數(shù)需要先行配置。
注意??:kubenetes目前的版本較之老版本,最大區(qū)別在于核心組件都已經(jīng)容器化,所以安裝的過程是會(huì)自動(dòng)pull鏡像的,但是由于鏡像基本都存放于谷歌的服務(wù)器,墻內(nèi)用戶是無(wú)法下載,導(dǎo)致安裝進(jìn)程卡在[init] This often takes around a minute; or longer if the control plane images have to be pulled ,這里我提供兩個(gè)思路:
1.有個(gè)墻外的代理服務(wù)器,對(duì)docker配置代理,需修改/etc/sysconfig/docker文件,添加:
HTTP_PROXY=http://proxy_ip:port
http_proxy=$HTTP_PROXY
重啟docker:systemctl restart docker
2.事先下載好所有鏡像,下面我給出v1.10.0版本基本安裝下所需要的所有鏡像(其他版本所需的鏡像版本可能不同,以官方文檔為準(zhǔn)):
Master節(jié)點(diǎn)所需鏡像:
k8s.gcr.io/kube-apiserver-amd64:v1.10.0k8s.gcr.io/kube-scheduler-amd64:v1.10.0k8s.gcr.io/kube-controller-manager-amd64:v1.10.0k8s.gcr.io/kube-proxy-amd64:v1.10.0k8s.gcr.io/etcd-amd64:3.1.12k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.8k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.8k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.8k8s.gcr.io/pause-amd64:3.1quay.io/coreos/flannel:v0.9.1-amd64 (為網(wǎng)絡(luò)插件的鏡像,這里選擇flannel為網(wǎng)絡(luò)插件)
Node節(jié)點(diǎn)所需鏡像:
k8s.gcr.io/kube-proxy-amd64:v1.10.0k8s.gcr.io/pause-amd64:3.1quay.io/coreos/flannel:v0.9.1-amd64(為網(wǎng)絡(luò)插件的鏡像,這里選擇flannel為網(wǎng)絡(luò)插件)
Master節(jié)點(diǎn)安裝成功會(huì)輸出如下內(nèi)容:
[init] Using Kubernetes version: v1.10.0
...
[init] This often takes around a minute; or longer if the control plane images have to be pulled.
[apiclient] All control plane components are healthy after 39.511972 seconds
[uploadconfig] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[markmaster] Will mark node master as master by adding a label and a taint
[markmaster] Master master tainted and labelled with key/value:node-role.kubernetes.io/master=""
[bootstraptoken] Using token:
[bootstraptoken] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstraptoken] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstraptoken] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: kube-dns
[addons] Applied essential addon: kube-proxy
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run (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:
http://kubernetes.io/docs/admin/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 10.211.55.6:6443 --token 63nuhu.quu72c0hl95hc82m --discovery-token-ca-cert-hash sha256:3971ae49e7e5884bf191851096e39d8e28c0b77718bb2a413638057da66ed30a
其中
kubeadm join 10.211.55.6:6443 --token 63nuhu.quu72c0hl95hc82m --discovery-token-ca-cert-hash sha256:3971ae49e7e5884bf191851096e39d8e28c0b77718bb2a413638057da66ed30a
是后續(xù)節(jié)點(diǎn)加入集群的啟動(dòng)命令,由于設(shè)置了--token-ttl 0,所以該命令永久有效,需保存好,kubeadm token list命令可以輸出token,但不能輸出完整命令,需要做hash轉(zhuǎn)換。
注意??:集群?jiǎn)?dòng)后要獲取集群的使用權(quán)限,否則在master節(jié)點(diǎn)執(zhí)行kubectl get nodes命令,會(huì)反饋localhost:8080 connection refused,獲取權(quán)限方法如下:
Root用戶: export KUBECONFIG=/etc/kubernetes/admin.conf
非Root用戶: mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
三.安裝網(wǎng)絡(luò)插件Pod:
在成功啟動(dòng)Master節(jié)點(diǎn)后,在添加node節(jié)點(diǎn)之前,需要先安裝網(wǎng)絡(luò)管理插件,kubernetes可供選擇的網(wǎng)絡(luò)插件有很多,
如Calico,Canal,flannel,Kube-router,Romana,Weave Net
各種安裝教程可以參考官方文檔,點(diǎn)擊這里
本文選擇flannel作為網(wǎng)絡(luò)插件:
vim /etc/sysctl.conf,添加以下內(nèi)容
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
修改后,及時(shí)生效
sysctl -p
執(zhí)行安裝:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
安裝完成后,執(zhí)行:
kubectl get pods --all-namespaces
查看Pod的啟動(dòng)狀態(tài),一旦kube-dns Pod的啟動(dòng)狀態(tài)為UP或者Running,集群就可以開始添加節(jié)點(diǎn)了。
四.添加Node節(jié)點(diǎn):
啟動(dòng)Node節(jié)點(diǎn)加入集群只需啟動(dòng)kubelet,然后執(zhí)行之前保存的命令:
systemctl start kubelet
kubeadm join 10.211.55.6:6443 --token 63nuhu.quu72c0hl95hc82m --discovery-token-ca-cert-hash sha256:3971ae49e7e5884bf191851096e39d8e28c0b77718bb2a413638057da66ed30a
節(jié)點(diǎn)成功加入集群。
注意??:集群?jiǎn)?dòng)后要獲取集群的使用權(quán)限,否則在master節(jié)點(diǎn)執(zhí)行kubectl get nodes命令,會(huì)反饋localhost:8080 connection refused,獲取權(quán)限方法如下:
Root用戶:export KUBECONFIG=/etc/kubernetes/admin.conf
非Root用戶:mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
執(zhí)行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
然后執(zhí)行
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
在主節(jié)點(diǎn)執(zhí)行kubectl get nodes,驗(yàn)證集群狀態(tài),顯示如下:
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 7h v1.10.0
node1 Ready
node2 Ready
node3 Ready
Kubenetes v1.10.0 集群構(gòu)建完成!
五.Kubernetes-Dashboard(WebUI)的安裝:
和網(wǎng)絡(luò)插件的用法一樣,dashboard也是一個(gè)容器應(yīng)用,同樣執(zhí)行安裝yaml:
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
可以參考官方文檔,點(diǎn)擊這里。
安裝完成后,執(zhí)行:
kubectl get pods --all-namespaces
查看Pod的啟動(dòng)狀態(tài),kubernetes-dashboard啟動(dòng)完成后,執(zhí)行:
kubectl proxy --address=10.211.55.6 --accept-hosts='^*$'
基本參數(shù)是address為master節(jié)點(diǎn)的IP,access-host如果不填,打開web頁(yè)面會(huì)返回:
這是需要用一個(gè)可用的ClusterRole進(jìn)行登錄,該賬戶需要有相關(guān)的集群操作權(quán)限,如果跳過,則是用默認(rèn)的系統(tǒng)角色kubernetes-dashboard(該角色在創(chuàng)建該容器時(shí)生成),初始狀態(tài)下該角色沒有任何權(quán)限,需要在系統(tǒng)中進(jìn)行配置,角色綁定:
在主節(jié)點(diǎn)上任意位置創(chuàng)建一個(gè)文件xxx.yaml,名字隨意:
vim ClusterRoleBinding.yaml
編輯文件:
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: kubernetes-dashboard
subjects:
保存,退出,執(zhí)行該文件:
kubectl create -f ClusterRoleBinding.yaml
再次打開WebUI,成功顯示集群信息:
注意??:給kubernetes-dashboard角色賦予cluster-admin權(quán)限僅供測(cè)試使用,本身這種方式并不安全,建議新建一個(gè)系統(tǒng)角色,分配有限的集群操作權(quán)限,方法如下:
新建一個(gè)yaml文件,寫入:
kind: ClusterRole #創(chuàng)建集群角色
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: dashboard #角色名稱
rules:
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: dashboard-extended
subjects:
-kind: ServiceAccount
name: dashboard
namespace: kube-system
roleRef:
kind: ClusterRole
name:dashboard #填寫cluster-admin代表開放全部權(quán)限
apiGroup: rbac.authorization.k8s.io
執(zhí)行該文件,查看角色是否生成:
kubectl get serviceaccount --all-namespaces
查詢?cè)撡~戶的密鑰名:
kubectl get secret -n kube-system
根據(jù)密鑰名找到token:
kubectl discribe secret dashboard-token-wd9rz -n kube-system
輸出一段信息:
將此token用于登陸WebUI即可。
以上便是Kubeadm安裝K8S v1.10.0版本的全記錄,本文用于總結(jié)與梳理,參考于官方文檔,如有錯(cuò)漏,望予指正。