k8s三節(jié)點部署文檔
K8s三節(jié)點部署文檔參考文檔:https://zhuanlan.zhihu.com/p/138876909https://zhuanlan.zhihu.com/p/165572107https://zhuanlan.zh
K8s三節(jié)點部署文檔
參考文檔:
https://zhuanlan.zhihu.com/p/138876909
https://zhuanlan.zhihu.com/p/165572107
https://zhuanlan.zhihu.com/p/163107995
1、更改主機名(三節(jié)點)
主節(jié)點:hostnamectl set-hostname master
副節(jié)點:hostnamectl set-hostname node1
副節(jié)點:hostnamectl set-hostname node2
2、查看Linux內(nèi)核版本(三節(jié)點)
uname -r
建議使用4.4,3.1與k8s不穩(wěn)定;
3、關(guān)閉防火墻(三節(jié)點)
systemctl disable firewalld
systemctl stop firewalld
4、關(guān)閉selinux(三節(jié)點)
vi /etc/selinux/config
將enabled改為disabled重啟生效
5、關(guān)閉swap分區(qū)(三節(jié)點)
臨時關(guān)閉:
swapoff -a
永久關(guān)閉:
vi /etc/fstab
將選中區(qū)域注釋
6、修改/etc/hosts(三節(jié)點)
192.168.100.30 master
192.168.100.31 node1
192.168.100.32 node2
7、安裝yum源
8、設(shè)置時間同步(主節(jié)點master)
(1)安裝ntpdate
yum install -y ntpdate
(2)注釋默認ntp服務(wù)器
sed -i 's/^server/#&/' /etc/chrony.conf
(3)指定上游公共 ntp 服務(wù)器,并允許其他節(jié)點同步時間
cat >> /etc/chrony.conf << EOF
server http://0.asia.pool.ntp.org iburst
server http://1.asia.pool.ntp.org iburst
server http://2.asia.pool.ntp.org iburst
server http://3.asia.pool.ntp.org iburst
allow all
EOF
(4)重啟chrony服務(wù)器并設(shè)置開機自啟動
systemctl enable chronyd && systemctl restart chronyd
(5)開啟網(wǎng)絡(luò)時間同步功能
timedatectl set-ntp true
9、安裝chrony(輔助節(jié)點nodde)
(1)安裝chrony
yum install chrony -y
(2)注釋默認服務(wù)器
sed -i 's/^server/#&/' /etc/chrony.conf
(3)指定master為上游ntp服務(wù)器
echo server 192.168.100.30 iburst >> /etc/chrony.conf
(4)重啟服務(wù)并設(shè)為開機啟動
systemctl enable chronyd && systemctl restart chronyd
(5)檢查配置
所有NODE節(jié)點執(zhí)行chronyc sources命令,查看存在以^*開頭的行,說明已經(jīng)與服務(wù)器時間同步
10、將橋接的IPv4流量傳遞到iptables的鏈(所有節(jié)點)
(1)RHEL / CentOS 7上的一些用戶報告了由于iptables被繞過而導(dǎo)致流量路由不正確的問題。創(chuàng)建/etc/sysctl.d/k8s.conf文件,添加如下內(nèi)容:
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
(2)使配置生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
11、加載ipvs相關(guān)模塊(所有節(jié)點)
(1)由于ipvs已經(jīng)加入到了內(nèi)核的主干,所以為kube-proxy開啟ipvs的前提需要加載以下的內(nèi)核模塊:
在所有的Kubernetes節(jié)點執(zhí)行以下腳本:
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
(2)增加權(quán)限
chmod +x /etc/sysconfig/modules/ipvs.modules
(3)執(zhí)行腳本
sh /etc/sysconfig/modules/ipvs.modules
(4)解釋:上面腳本創(chuàng)建了/etc/sysconfig/modules/ipvs.modules文件,保證在節(jié)點重啟后能自動加載所需模塊。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已經(jīng)正確加載所需的內(nèi)核模塊。
接下來還需要確保各個節(jié)點上已經(jīng)安裝了ipset軟件包。 為了便于查看ipvs的代理規(guī)則,最好安裝一下管理工具ipvsadm。
(5)安裝管理工具
yum install ipset ipvsadm -y
12、所有節(jié)點安裝Docker kubeadm-引導(dǎo)集群的工具 / kubelet-容器管理
注:Kubernetes默認CRI(容器運行時)為Docker,因此先安裝Docker。
Kubernetes默認的容器運行時仍然是Docker,使用的是kubelet中內(nèi)置dockershim CRI實現(xiàn)。需要注意的是,Kubernetes 1.13最低支持的Docker版本是1.11.1,最高支持是18.06,而Docker最新版本已經(jīng)是18.09了,故我們安裝時需要指定版本為18.06.1-ce。
(1)設(shè)置yum源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
(2)安裝docker
yum -y install docker-ce-18.06.1.ce-3.el7
設(shè)置開機自啟動以及啟動docker
systemctl enable docker && systemctl start docker
查看docer的版本
docker --version
(3)設(shè)置docker加速器
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
(4)將添加k8s阿里yum軟件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
(5)所有節(jié)點安裝kubeadm,kubelet和kubectl
注:由于版本更新頻繁,這里指定版本號部署:
yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
systemctl enable kubelet && systemctl start kubelet
13、部署Kubernetes(master節(jié)點)
(1)手動拉取鏡像
curl -sfL
https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/pull-kube-image.sh | bash -
(2)由于默認拉取鏡像地址http://k8s.gcr.io國內(nèi)無法訪問,這里指定阿里云鏡像倉庫地址
kubeadm init --apiserver-advertise-address=192.168.100.30 --image-repository http://registry.aliyuncs.com/google_containers --kubernetes-version v1.17.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
(注意記錄下初始化結(jié)果中的kubeadm join命令,部署worker節(jié)點時會用到)
kubeadm join 192.168.100.30:6443 --token gz68wt.0utdk93fce1rqo79
--discovery-token-ca-cert-hash sha256:3d69ea8ab91d3bc728425645aa318ba86faf1f0d21186dedb5b4600a6963a22c
k8s部署文檔.docxkube-flannel.ymkubernetes-dashboard.yaml13、使用kubectl工具
(1)配置工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(2)查看節(jié)點狀態(tài)可以看到,當(dāng)前只存在1個master節(jié)點,并且這個節(jié)點的狀態(tài)是 NotReady。
kubectl get nodes
(3)查看集群狀態(tài):確認各個組件都處于healthy狀態(tài)。
kubectl get cs
(4)查看當(dāng)前節(jié)點詳細信息
kubectl api-resources
(5)注:通過 kubectl describe 指令的輸出,我們可以看到 NodeNotReady 的原因在于,我們尚未部署任何網(wǎng)絡(luò)插件,kube-proxy等組件還處于starting狀態(tài)。 另外,我們還可以通過 kubectl 檢查這個節(jié)點上各個系統(tǒng) Pod 的狀態(tài),其中,kube-system 是 Kubernetes 項目預(yù)留的系統(tǒng) Pod 的工作空間(Namepsace,注意它并不是 Linux Namespace,它只是 Kubernetes 劃分不同工作空間的單位):
# 5.3.4檢查這個節(jié)點上各個系統(tǒng) Pod 的狀態(tài)
可以看到,CoreDNS依賴于網(wǎng)絡(luò)的 Pod 都處于 Pending 狀態(tài),即調(diào)度失敗。這當(dāng)然是符合預(yù)期的:因為這個 Master 節(jié)點的網(wǎng)絡(luò)尚未就緒。 集群初始化如果遇到問題,可以使用kubeadm reset命令進行清理然后重新執(zhí)行初始化。
14、安裝Pod網(wǎng)絡(luò)插件(CNI)
(1)直接獲取
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
(2)如果下不下來可以使用瀏覽器下載然后上傳到服務(wù)器中
kubectl apply -f kube-flannel.ym
(3)重新檢查Pod
kubectl get pod -n kube-system -o wide
可以看到,所有的系統(tǒng) Pod 都成功啟動了,而剛剛部署的flannel網(wǎng)絡(luò)插件則在 kube-system 下面新建了一個名叫kube-flannel-ds-amd64-lkf2f的 Pod,一般來說,這些 Pod 就是容器網(wǎng)絡(luò)插件在每個節(jié)點上的控制組件。 Kubernetes 支持容器網(wǎng)絡(luò)插件,使用的是一個名叫 CNI 的通用接口,它也是當(dāng)前容器網(wǎng)絡(luò)的事實標(biāo)準(zhǔn),市面上的所有容器網(wǎng)絡(luò)開源項目都可以通過 CNI 接入 Kubernetes,比如 Flannel、Calico、Canal、Romana 等等,它們的部署方式也都是類似的“一鍵部署”。
(4)重新檢查master節(jié)點狀態(tài)
kubectl get nodes
至此,Kubernetes 的 Master 節(jié)點就部署完成了。如果你只需要一個單節(jié)點的 Kubernetes,現(xiàn)在你就可以使用了。不過,在默認情況下,Kubernetes 的 Master 節(jié)點是不能運行用戶 Pod 的。
15、部署work節(jié)點
(1)加入Kubernetes Node(node節(jié)點)
向集群添加新節(jié)點,執(zhí)行在kubeadm init輸出的kubeadm join命令:
kubeadm join 192.168.100.30:6443 --token gz68wt.0utdk93fce1rqo79
--discovery-token-ca-cert-hash sha256:3d69ea8ab91d3bc728425645aa318ba86faf1f0d21186dedb5b4600a6963a22c
如果執(zhí)行kubeadm init時沒有記錄下加入集群的命令,可以通過以下命令重新創(chuàng)建
kubeadm token create --print-join-command
(2)使用 kubectl get nodes 命令檢查集群各節(jié)點狀態(tài)是否Ready
(3)等所有的節(jié)點都已經(jīng) Ready,Kubernetes Cluster 創(chuàng)建成功,一切準(zhǔn)備就緒。 如果pod狀態(tài)為Pending、ContainerCreating、ImagePullBackOff都表明 Pod 沒有就緒,Running 才是就緒狀態(tài)。 如果有pod提示Init:ImagePullBackOff,說明這個pod的鏡像在對應(yīng)節(jié)點上拉取失敗,我們可以通過 kubectl describe pod 查看 Pod 具體情況,以確認拉取失敗的鏡像:
(4)其他操作
docker images
查看節(jié)點下載了那些鏡像
16、測試kubernetes集群(master)
(1)首先驗證kube-apiserver, kube-controller-manager, kube-scheduler, pod network 是否正常:
部署一個 Nginx Deployment,包含2個Pod 參考: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
在Kubernetes集群中創(chuàng)建一個pod,驗證是否正常運行:
[root@master ~]# kubectl create deployment nginx --image=nginx:alpine
[root@master ~]# kubectl scale deployment nginx --replicas=2
# 驗證Nginx Pod是否正確運行,并且會分配10.244.開頭的集群IP
[root@master ~]# kubectl get pods -l app=nginx -o wide
# 再驗證一下kube-proxy是否正常:以 NodePort 方式對外提供服務(wù)
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
[root@master ~]# kubectl get services nginx
# 可以通過任意 NodeIP:Port 在集群外部訪問這個服務(wù),都可以訪問到nginx的初始化頁面:
(2)最后驗證一下dns, pod network是否正常: 運行Busybox并進入交互模式
kubectl run -it curl --image=radial/busyboxplus:curl
# 輸入nslookup nginx查看是否可以正確解析出集群內(nèi)的IP,以驗證DNS是否正常
nslookup nginx
# 通過服務(wù)名進行訪問,驗證kube-proxy是否正常
curl http://nginx/
17、部署Dashboard
(1)準(zhǔn)備安裝kubernetes dashboard的yaml文件
https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
(2)默認Dashboard只能集群內(nèi)部訪問,修改Service為NodePort類型,并暴露端口到外部:
(3)創(chuàng)建service account并綁定默認cluster-admin管理員集群角色:
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}')
此處的token,下文dashboard 登陸時需要使用,記得找地方記下來,實在忘了記錄,也有重新輸出的操作
(4)應(yīng)用配置文件啟動服務(wù)
拉取文件:
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
修改servcie部分
使用文件安裝:kubectl apply -f kubernetes-dashboard.yaml
驗證狀態(tài)
kubectl get pods -n kubernetes-dashboard
kubectl get svc -n kubernetes-dashboard
登陸網(wǎng)址:https://192.168.100.30:30443/
(5)解決Dashboard chrome無法訪問問題
(1)K8S Dashboard安裝好以后,通過Firefox瀏覽器是可以打開的,但通過Google Chrome瀏覽器,無法成功瀏覽頁面。如圖:
(2)解決方案
kubeadm自動生成的證書,很多瀏覽器不支持。所以我們需要自己創(chuàng)建證書。
(3)創(chuàng)建一個key的目錄,存放證書等文件
mkdir kubernetes-key
cd kubernetes-key
(4)生成證書請求的key
openssl genrsa -out dashboard.key 2048
(5)生成證書請求
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=192.168.100.30'
(6)生成自簽證書
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
(7)刪除原有證書
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard
(8)創(chuàng)建新證書的sercret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
(9)查找正在運行的Pod
kubectl get pod -n kubernetes-dashboard
(10)刪除舊有的Pod
kubectl get pod -n kubernetes-dashboard
kubectl delete po kubernetes-dashboard-5996555fd8-jn9tr -n kubernetes-dashboard
kubectl delete po dashboard-metrics-scraper-76585494d8-h6nbw -n kubernetes-dashboard
(11)檢查狀態(tài)
kubectl get pod -n kubernetes-dashboard
(12)訪問網(wǎng)址
使用之前保存的Token訪問
上一篇:k8s 重裝









