概述:html
這篇文章是爲了介紹使用kubeadm安裝Kubernetes集羣(能夠用於生產級別)。使用了Centos 7系統。node
PS:linux
篇幅有點長,可是比較詳細、比較全面git
CentOS Linux 7 默認開起來防火牆服務(firewalld),而Kubernetes的Master與工做Node之間會有大量的網絡通訊,安全的作法是在防火牆上配置Kbernetes各組件(api-server、kubelet等等)須要相互通訊的端口號。在安全的內部網絡環境中能夠關閉防火牆服務。github
關閉防火牆的命令:docker
1 # firewall-cmd --state #查看防火牆狀態 2 # systemctl stop firewalld.service #中止firewall 3 # systemctl disable firewalld.service #禁止firewall開機啓動
建議禁用SELinux,讓容器能夠讀取主機文件系統json
執行命令:centos
1 # getenforce #查看selinux狀態 2 # setenforce 0 #臨時關閉selinux 3 # sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #永久關閉(需重啓系統) 4 # shutdown -r now #重啓系統
軟硬件api |
最低配置瀏覽器 |
推薦配置 |
CPU和內存 |
Master: 至少2 Core和4G內存 Node:至少4 Core和16G內存 |
Master:4 core和16G內存 Node:應根據須要運行的容器數量進行配置 |
Linux操做系統 |
基於x86_64架構的各類Linux發行版本,Kernel版本要求在3.10及以上 |
Red Hat Linux 7 CentOS 7 |
說明:
以上爲建議配置,實際安裝過程當中,Master必須2 core 及以上(不然安裝失敗,切記),Node能夠採用1 core。
主機列表:
主機名 |
Centos版本 |
ip |
docker version |
flannel version |
Keepalived version |
主機配置 |
備註 |
master01 |
7.6.1810 |
192.168.0.6 |
18.09.9 |
v0.11.0 |
v1.3.5 |
2C1G |
control plane |
work01 |
7.6.1810 |
192.168.0.10 |
18.09.9 |
/ |
/ |
1C1G |
worker nodes |
work02 |
7.6.1810 |
192.168.0.12 |
18.09.9 |
/ |
/ |
1C1G |
worker nodes |
VIP |
7.6.1810 |
192.168.0.130 |
18.09.9 |
v0.11.0 |
v1.3.5 |
4C4G |
在control plane上浮動 |
client |
7.6.1810 |
192.168.0.234 |
/ |
/ |
/ |
4C4G |
client(可不須要) |
共有7臺服務器,3臺control plane,3臺work,1臺client。
k8s 版本(可根據須要進行更改):
主機名 |
kubelet version |
kubeadm version |
kubectl version |
備註 |
master01 |
v1.16.4 |
v1.16.4 |
v1.16.4 |
kubectl選裝 |
work01 |
v1.16.4 |
v1.16.4 |
v1.16.4 |
kubectl選裝 |
work02 |
v1.16.4 |
v1.16.4 |
v1.16.4 |
kubectl選裝 |
client |
/ |
/ |
v1.16.4 |
client |
Master主機改成master01,執行如下命令:
1 # hostnamectl set-hostname master01 #修改主機名稱爲master01 2 # more /etc/hostname #查看修改結果
一樣的修改node01和node02(注意主機名爲node01和node02)
說明:
退出從新登錄便可顯示新設置的主機名master01,從新登陸以後
執行如下命令:
cat >> /etc/hosts << EOF
192.168.0.6 master01 192.168.0.10 node01 192.168.0.12 node02 EOF
Kubeadm建議關閉交換空間的使用,簡單來講,執行swapoff -a命令,而後在/etc/fstab中刪除對swap的加載,並從新啓動服務器便可。
臨時禁用,執行如下命令:
# swapoff -a
永久禁用,須要在swapoff -a以後,執行如下命令:
# sed -i.bak '/swap/s/^/#/' /etc/fstab
執行如下命令:
# 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
# yum clean all
# yum -y makecache
注意:
安裝docker以前,最好確認一下,kubernetes支持哪些版本的docker(kubernetes和docker的版本要對應,不然可能會形成從新安裝)。
# 卸載docker
#1. 列出安裝過的包
# yum list installed | grep docker
#2. 根據安裝過的包進行卸載
# yum -y remove docker-ce-cli.x86_64 # yum -y remove docker-ce.x86_64 # yum -y remove containerd.io
# 更新docker
# yum -y update docker
如已安裝過docker,則不須要進行此步驟
# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y
說明:
執行以上命令以前,能夠看看docker版本,執行如下命令查看
# yum list docker-ce --showduplicates | sort -r
# systemctl start docker && systemctl enable docker
安裝bash-completion
# yum -y install bash-completion
加載bash-completion
# source /etc/profile.d/bash_completion.sh
# mkdir -p /etc/docker # tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://usydjf4t.mirror.aliyuncs.com", "https://registry.docker-cn.com"] , "exec-opts": ["native.cgroupdriver=systemd"] } EOF # systemctl daemon-reload # systemctl restart docker
說明:
修改cgroupdriver是爲了消除告警:
[WARNING IsDockerSystemdCheck]: detected 「cgroupfs」 as the Docker cgroup driver. The recommended driver is 「systemd」. Please follow the guide at https://kubernetes.io/docs/setup/cri/
# yum -y install keepalived
保留默認配置
# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived_default.conf
寫入新的配置
# cat <<EOF > /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id master01 } vrrp_instance VI_1 { state MASTER interface enp0s3 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.130 } } EOF
說明:
特別注意紅色字體文本,master01是主機名稱(若是有其餘主機則使用對應的主機名稱進行替換),enp0s3是網卡名稱(每一個linux系統可能不一致),192.168.0.130是虛擬IP
# service keepalived start && systemctl enable keepalived
在master機器上執行
# ip a
能夠看到VIP在master01(目前只有一臺master,之後可能會有多個master)上
# yum list kubelet --showduplicates | sort -r
說明:
本文安裝的kubelet版本是1.16.4,該版本支持的docker版本爲1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09。
# yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4
說明:
# systemctl enable kubelet && systemctl start kubelet
# echo "source <(kubectl completion bash)" >> ~/.bash_profile # source .bash_profile
Kubernetes幾乎全部的安裝組件和Docker鏡像都放在goolge本身的網站上,直接訪問可能會有網絡問題,這裏的解決辦法是從阿里雲鏡像倉庫下載鏡像,拉取到本地之後改回默認的鏡像tag。本文經過運行image.sh腳本方式拉取鏡像。
直接執行如下命令(灰色背景部分):
# more image.sh #如下爲image.sh文件的內容 #!/bin/bash url=registry.cn-hangzhou.aliyuncs.com/loong576 #阿里雲鏡像倉庫地址,能夠按需修改 version=v1.16.4 #安裝的kubernetes的版本(能夠按需修改) images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`) for imagename in ${images[@]} ; do docker pull $url/$imagename docker tag $url/$imagename k8s.gcr.io/$imagename docker rmi -f $url/$imagename done
注意:
若是須要下載其餘的kubernetes版本,須要修改對應的版本號(紅色字體部分)
# docker images
本文的k8s網絡使用flannel,該網絡須要設置內核參數bridge-nf-call-iptables=1,修改這個參數須要系統有br_netfilter模塊。
說明:
K8s網絡插件有不少,使用網絡插件以前,要進行判斷是否和系統適配。
查看br_netfilter模塊:
# lsmod |grep br_netfilter
若是系統沒有br_netfilter模塊則執行下面的新增命令,若有則忽略。
永久新增br_netfilter模塊:
# cat > /etc/rc.sysinit << EOF #!/bin/bash for file in /etc/sysconfig/modules/*.modules ; do [ -x $file ] && $file done EOF # cat > /etc/sysconfig/modules/br_netfilter.modules << EOF modprobe br_netfilter EOF # chmod 755 /etc/sysconfig/modules/br_netfilter.modules
# cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # sysctl -p /etc/sysctl.d/k8s.conf
說明:
如安裝網絡插件以後,長時間狀態沒有變動,則能夠試試重啓機器(或者是虛擬機,這裏是指Centos 7系統)。
說明:
Master的kubernetes以前,須先肯定要肯定的網絡插件(由於可能會影響到初始化的參數),不一樣的系統可能須要使用不一樣的網絡插件(Centos 不支持 Calico)。
建議先閱讀網絡插件資料。(Kubernetes全部網絡插件說明:這裏)
# kubeadm config print init-defaults > init.default.yaml
# cat init.default.yaml
建立kubeadm.conf.yaml文件,輸入如下內容(灰色背景部分):
apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v1.16.4 apiServer: certSANs: #填寫全部kube-apiserver節點的hostname、IP、VIP - master01 - node01 - node02 - 192.168.0.6 - 192.168.0.10 - 192.168.0.12 - 192.168.0.130 controlPlaneEndpoint: "192.168.0.130:6443" networking: podSubnet: "10.244.0.0/16" #這裏須要根據具體的網絡插件來配置(這裏使用的flannel網絡插件配置)
說明:
注意紅色字體部份內容,須要根據init.default.yaml文件和本身的須要進行更改
# kubeadm init --config=kubeadm.conf.yaml
說明:
若是初始化失敗,可執行kubeadm reset後從新初始化(執行如下兩條命令)
# kubeadm reset
# rm -rf $HOME/.kube/config
初始化成功,以下圖:
按照提示執行下面的命令,複製配置文件到普通用戶的home目錄下:
# mkdir -p $HOME/.kube # cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # chown $(id -u):$(id -g) $HOME/.kube/config
在其餘位置(或者主機),保存以下信息(其餘node節點加入集羣時使用):
You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root:
kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \ --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562 \ --control-plane Then you can join any number of worker nodes by running the following on each as root: ## node加入集羣時使用 kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \ --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562
# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile # source .bash_profile
說明:
若是master節點的防火牆已經關閉,能夠直接跳過此小節
若是node已經加入其它集羣,須要退出集羣,請執行在node上執行:
# kubeadm reset
查看防火牆狀態:
# systemctl status firewalld 或者 firewall-cmd --state
開啓6443端口
# firewall-cmd --zone=public --add-port=6443/tcp --permanent ## 出現success代表添加成功
命令含義:
--zone #做用域 --add-port=80/tcp #添加端口,格式爲:端口/通信協議 --permanent #永久生效,沒有此參數重啓後失效
重啓防火牆
# systemctl restart firewalld.service
說明:
Kubernetes集羣中的Service可以使用的物理機端口號範圍爲30000~32767
一次所有公開全部可能使用的端口:
# firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent # systemctl restart firewalld.service
Master節點在初始化完成以後,最後一行代碼,以下:
# kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \ --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562
把兩行信息複製出來,在node節點執行,以下圖:(join成功)
在master節點,執行如下命令查看已經加入的節點
# kubectl get nodes
說明:
因爲沒有安裝網絡插件,這裏STATUS爲NotReady
在master主機上執行如下命令:
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
說明:
因爲網絡緣由,可能會安裝失敗,能夠在瀏覽器直接下載kube-flannel.yml文件(也能夠在瀏覽器打開url地址,而後複製文件內容到文件),而後再執行apply
查看節點狀態,執行如下命令:
# kubectl get nodes
說明:
STATUS從NotReady變爲Ready
# 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
# yum clean all && yum -y makecache
# yum install -y kubectl-1.16.4
安裝bash- completion
# yum -y install bash-completion
加載bash-completion
# source /etc/profile.d/bash_completion.sh
# mkdir -p /etc/kubernetes
# scp 192.168.0.6:/etc/kubernetes/admin.conf /etc/kubernetes/
說明:
192.168.0.6 是master主機
# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile # source .bash_profile
# echo "source <(kubectl completion bash)" >> ~/.bash_profile # source .bash_profile
# kubectl get nodes
# kubectl get cs
# kubectl get po -o wide -n kube-system
# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
說明:
若是鏈接超時,能夠多試幾回。也能夠在這裏下載
# sed -i 's/kubernetesui/registry.cn-hangzhou.aliyuncs.com\/loong576/g' recommended.yaml
說明:
也能夠採用其餘的一些鏡像(切換鏡像,須要更改recommended.yaml文件)
更改鏡像操做:
若是須要更改鏡像的版本號,須要在阿里雲查詢一下是否有鏡像
下載鏡像命令:(注意阿里雲是沒有帶版本號的,須要本身錄入版本號)
# docker pull registry.cn-hangzhou.aliyuncs.com/kubernetesui/dashboard:v2.0.0-rc5
外網訪問
# sed -i '/targetPort: 8443/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' recommended.yaml
說明:
配置NodePort,外部經過https://NodeIp:NodePort 訪問Dashboard,此時端口爲30001
建立超級管理員的帳號用於登陸Dashboard
# cat >> recommended.yaml << EOF --- # ------------------- dashboard-admin ------------------- # apiVersion: v1 kind: ServiceAccount metadata: name: dashboard-admin namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: dashboard-admin subjects: - kind: ServiceAccount name: dashboard-admin namespace: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin EOF
# kubectl apply -f recommended.yaml
狀態查看:
# kubectl get all -n kubernetes-dashboard
令牌查看:
# kubectl describe secrets -n kubernetes-dashboard dashboard-admin
令牌爲(必定要注意可能存在換行的狀況):
eyJhbGciOiJSUzI1NiIsImtpZCI6IllkWjQxWENEYnBXYV9rUlNqWTRldjVOYXV3M0tPTklYTVZTWUZWOXp0SHMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tZzRwdzUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjNmNzllODUtNzMzMy00MDY1LTg1YTEtYzkxZTkzNjk3ZjA0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.vsizK9ZP53to5aL5d1oyFYAiR8Kt1LaQ_Lkt86yPgHp6QloMS_pLCdD7KZi76deQ4ISTFC9Ldc62zslLtY4qgxNvSUiVWj1bWUn2BfCJ-3jPxpd7ZOgr3Gbp2xAFc3xjgm-qZaOydec9i44CbkdiVDoAjL0Au78yt7aHSW8B6plc2fAYNdywtyIOAMhe7f0gjyRaWrGQje2CVduITxZ-2NCwd3EYQNs31OA-zUPFvel_xi_KzdMBuj4z7DdvIK9wPQHyuke0TIs5dHSUEtiY84erLMg5i0ZGXCd019D5Nrsd78fVe_NbO-NThVReskA-jt1FyhAUesZie4GX-2eL3Q
說明:
若是安裝Dashboard過程當中出現問題,要仔細進行排查,可能pod尚未安裝完成,等待一段時間以後,再看看,若是仍是不行,則須要考慮一下中途是否有問題,是否須要從新安裝。
若是忘記Token,能夠經過如下命令獲取:
# kubectl describe secret -n kubernetes-dashboard $(kubectl get secret -n kubernetes-dashboard |grep kubernetes-dashboard-token | awk '{print $1}') |grep token | awk '{print $2}'
https://192.168.0.6:30001
部署Dashboard以後,因爲證書問題致使沒法在瀏覽器瀏覽(暫時沒有找到解決方案,嘗試了網上的方式,不行,如下是嘗試的過程(能夠跳過))
刪除已經部署的Dashboard
1. kubectl delete ns kubernetes-dashboard
https://github.com/kubernetes/dashboard/releases
2. 閱讀參考資料(並執行命令,除了刪除命令)
http://www.javashuo.com/article/p-uwvomipq-dx.html
查看全部Pod
# kubectl get pods --all-namespaces
查看狀態異常的Pod的詳細信息
# kubectl describe pod kubernetes-dashboard-8478d57dc6-p7jt7 --namespace=kubernetes-dashboard
說明:
能夠看到在哪臺Node上建立了容器
建議關閉防火牆
# systemctl stop firewalld.service
# systemctl disable firewalld.service
說明:
若是不關閉防火牆,可能會形成容器產生錯誤,如no host to route,是由於防火牆攔截了端口。
錯誤描述信息:
The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?
須要將master節點的 /etc/kubernetes/admin.conf 文件複製到node節點下。
Kubernetes的安裝:
https://www.kubernetes.org.cn/6632.html
CentOS Linux 開放端口:
http://www.javashuo.com/article/p-pnauwzxw-mb.html
Kubernetes全部網絡插件說明:
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network