參考文章 html
https://www.kubernetes.org.cn/5462.html node
前言 linux
Kubernetes做爲容器編排工具,簡化容器管理,提高工做效率而頗受青睞。不少新手部署Kubernetes因爲"kexue上網"問題舉步維艱,本文以實戰經驗詳解kubeadm不用"kexue上網"部署Kubernetes的最簡方法。 nginx
1、Kubernetes簡介 git
Kubernetes(簡稱K8S)是開源的容器集羣管理系統,能夠實現容器集羣的自動化部署、自動擴縮容、維護等功能。它既是一款容器編排工具,也是全新的基於容器技術的分佈式架構領先方案。在Docker技術的基礎上,爲容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等功能,提升了大規模容器集羣管理的便捷性。 github
K8S集羣中有管理節點與工做節點兩種類型。管理節點主要負責K8S集羣管理,集羣中各節點間的信息交互、任務調度,還負責容器、Pod、NameSpaces、PV等生命週期的管理。工做節點主要爲容器和Pod提供計算資源,Pod及容器所有運行在工做節點上,工做節點經過kubelet服務與管理節點通訊以管理容器的生命週期,並與集羣其餘節點進行通訊。 docker
2、環境準備 centos
Kubernetes支持在物理服務器或虛擬機中運行,本次使用虛擬機準備測試環境,硬件配置信息如表所示: api
IP地址瀏覽器 |
節點角色 |
CPU |
Memory |
Hostname |
磁盤 |
10.10.10.10 |
master |
>=2c |
>=2G |
master |
sda、sdb |
10.10.10.11 |
worker |
>=2c |
>=2G |
node1 |
sda、sdb |
10.10.10.12 |
worker |
>=2c |
>=2G |
node2 |
sda、sdb |
注:在全部節點上進行以下操做
1.設置主機名hostname,管理節點設置主機名爲 master 。
hostnamectl set-hostname master
須要設置其餘主機名稱時,可將 master 替換爲正確的主機名node1、node2便可。
2.編輯 /etc/hosts 文件,添加域名解析。
cat <<EOF >>/etc/hosts
10.10.10.10 master
10.10.10.11 node1
10.10.10.12 node2
EOF
3.關閉防火牆、selinux和swap。
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
4.配置內核參數,將橋接的IPv4流量傳遞到iptables的鏈
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
5.配置國內yum源
yum install -y wget
mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
yum clean all && yum makecache
配置國內Kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
配置 docker 源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
3、軟件安裝
注:在全部節點上進行以下操做
1.安裝docker
yum install -y docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker –version
Docker version 18.06.1-ce, build e68fc7a
docker服務爲容器運行提供計算資源,是全部容器運行的基本平臺。
2.安裝kubeadm、kubelet、kubectl
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
Kubelet負責與其餘節點集羣通訊,並進行本節點Pod和容器生命週期的管理。Kubeadm是Kubernetes的自動化部署工具,下降了部署難度,提升效率。Kubectl是Kubernetes集羣管理工具。
kubeadm init --kubernetes-version=1.14.2 \
--apiserver-advertise-address=10.10.10.10 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16
定義POD的網段爲: 10.244.0.0/16, api server地址就是master本機IP地址。
記錄生成的最後部份內容,此內容須要在其它節點加入Kubernetes集羣時執行。
kubeadm join 10.10.10.10:6443 --token kekvgu.nw1n76h84f4camj6 \
cp /etc/kubernetes/admin.conf /root/.kube/config
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
5、部署node節點
注:在全部node節點上進行以下操做
執行以下命令,使全部node節點加入Kubernetes集羣
kubeadm join 10.10.10.10:6443 --token kekvgu.nw1n76h84f4camj6 \
--discovery-token-ca-cert-hash sha256:4ee74205227c78ca62f2d641635afa4d50e6634acfaa8291f28582c7e3b0e30e
此命令爲集羣初始化時(kubeadm init)返回結果中的內容。
6、集羣狀態檢測
注:在master節點上進行以下操做
1.在master節點輸入命令檢查集羣狀態,返回以下結果則集羣狀態正常。
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 26m v1.14.2
node1 Ready <none> 3m10s v1.14.2
node2 Ready <none> 3m v1.14.2
重點查看STATUS內容爲Ready時,則說明集羣狀態正常。
若是狀態爲NoReady狀態的,就要檢查相關的pods的狀態命令以下
kubectl get pods -n kube-system
若是對應的狀態不是running狀態的話,那麼就要查看對應pods運行日誌,如查看pod名稱爲kube-flannel-ds-amd64-2rnhm的日誌命令以下
kubectl --namespace=kube-system describe pod kube-flannel-ds-amd64-2rnhm
部分詳細信息截圖
pod狀態不正常的多數緣由是節點上沒有相關的鏡像可運行,解決辦法是查看建立pod使用的yml文件或者yaml文件,查找文件內的關鍵字image:後面的鏡像名稱,程序會按照yml和yaml文件內定義的image文件名和要對應節點上運行該鏡像,若是對應的節點上沒有該鏡像則程序會自動pull一個,若是pull不到,就會報錯,從而致使對應的pod狀態爲非running,繼而致使對應的nodes也爲NoReady狀態。
pull不到image的緣由爲因爲國內訪問的問題和docker自己開放的問題,致使公共源上好多非官方的image都會失效,解決辦法是配置一個能夠上網的docker環境,使用阿里雲的鏡像加速,而後搜索指定的鏡像,而後再把鏡像的名稱和版本修改成yml和yaml文件內指定的名稱和版本便可。固然,修改yml和yaml文件內的image定義的名稱爲可用的image名稱也可用。搜索鏡像,下載鏡像,和修改鏡像名稱和版本的命令以下
搜索鏡像
docker search flannel
下載鏡像
docker pull jmgao1983/flannel
修改鏡像名稱和版本
docker tag jmgao1983/flannel quay.io/coreos/flannel:v0.11.0-amd64
2.建立Pod以驗證集羣是否正常。
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
7、部署Dashboard
注:在master節點上進行以下操做
1.建立Dashboard的yaml文件
sed -i 's/k8s.gcr.io/loveone/g' kubernetes-dashboard.yaml
sed -i '/targetPort:/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' kubernetes-dashboard.yaml
2.部署Dashboard
kubectl create -f kubernetes-dashboard.yaml
3.建立完成後,檢查相關服務運行狀態
kubectl get deployment kubernetes-dashboard -n kube-system
kubectl get pods -n kube-system -o wide
kubectl get services -n kube-system
netstat -ntlp|grep 30001
4.在Firefox瀏覽器輸入Dashboard訪問地址:https://10.10.10.10:30001
5.查看訪問Dashboard的認證令牌
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
6.使用輸出的token登陸Dashboard。
認證經過後,登陸Dashboard首頁如圖
集羣初始化
kubeadm init --kubernetes-version=1.15.0 --apiserver-advertise-address=192.168.197.30 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
定義POD的網段爲: 10.244.0.0/16, api server地址就是master本機IP地址
kubeadm join 192.168.197.30:6443 --token 2c266y.tzn4mm15h4oku5dp \
--discovery-token-ca-cert-hash sha256:326c87e67335490c2f33e7b4350311cd8c90007c5e80edd9f0b2a77cede1010a
經常使用命令:
查看pod狀態
kubectl get pods -n kube-system
查看pod詳細信息
kubectl --namespace=kube-system describe pod kube-flannel-ds-amd64-2rnhm
[root@bogon ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
Name: dashboard-admin-token-k7fs6
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: dashboard-admin
kubernetes.io/service-account.uid: 81acd960-1849-407b-b1f3-4371b0308dd4
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tazdmczYiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiODFhY2Q5NjAtMTg0OS00MDdiLWIxZjMtNDM3MWIwMzA4ZGQ0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.EQFuuNrJzo48UL7u-ON9aXSwgDa1yPdGV3AROzDaxSP_fgxptH7i_tsozV8SxY3sWi2U82640Y944T9MHw0yxJzPYCeDzDisS7q3fOw4PW6jMpSZs1ZoRfc_SnjDI4YPmrZ-OtwqMVhtlJ7879nhV0KwBsm0tBQ3-0Pr7Scj-T41Q_fUFsAfM6H3oGsB7Xicjb7YGEkEHx0zfkP03a7UH6Pt_qI5-sqGDyDaehhuSTm6wwiFnyNtB0uG8KrGU6b5uN1Fy741Rm_SUrorYuJue5-DISgxrfGftkhJxln4DgcjlJv4D3cV96-eoOgYTYt1uSUMVvY0X7xYzLeVMWF-nw