1. 安裝要求
在開始之前,部署Kubernetes集群機器需要滿足以下幾個條件:
-
一台或多台機器,操作系統 CentOS7
-
硬件配置:2GB或更多RAM,2個CPU或更多CPU,硬盤30GB或更多
-
集群中所有機器之間網絡互通
-
可以訪問外網,需要拉取鏡像
-
禁止swap分區
本次集群由三台機器搭建
-
k8s-master:192.168.147.131
-
k8s-node1:192.168.147.132
-
k8s-node2:192.168.147.133
建議升級centos7內核
-
更新yum源倉庫
yum -y update
-
安裝epel最新的倉庫
導入密鑰:rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
安裝倉庫: yum install https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
-
列出可安裝的系統內核相關包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
-
選擇版本
lt是長支持版本
yum -y --enablerepo=elrepo-kernel install kernel-lt
ml是最新穩定版本
yum -y --enablerepo=elrepo-kernel install kernel-ml
-
設置默認啟動項
vim /etc/default/grub
使GRUB_DEFAULT=0
-
重新生成grub配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
-
重啟並查看內核版本
reboot #重啟
uname -sr #查看內核版本
2. 准備環境(master、node節點都需執行)
-
關閉防火牆:(nftables后端兼容性問題,產生重復的防火牆規則) systemctl stop firewalld systemctl disable firewalld
-
關閉selinux:關閉selinux以允許容器訪問宿主機的文件系統,linux下的一個安全機制,主要是對文件系統訪問做一個權限控制,這個權限控制會影響到kubernetes中的一個組件kuberlete的安裝,因為這個組件的安裝會訪問本地的文件操作系統 setenforce 0 #臨時關閉
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久關閉
vi /etc/sysconfig/selinux
修改以下參數,設置為disable
SELINUX=disabled
-
關閉swap:Kubernetes 在啟用 Swap 時不知道如何處理內存驅逐,swap分區的作用是當物理內存不足時,利用swap分區做數據交換,但是在kubernetes中完全不支持swap分區
swapoff -a #臨時關閉 vi /etc/fstab #永久關閉,刪除swap配置哪一行
-
修改主機名 方便部署時區別節點
hostnamectl set-hostname 《hostname》
-
添加主機名與IP對應關系(記得設置主機名): cat /etc/hosts 192.168.147.131 k8s-master 192.168.147.132 k8s-node1 192.168.147.133 k8s-node2
-
將橋接的IPv4流量傳遞到iptables的鏈:有一些ipv4的流量不能走iptables鏈【linux內核的一個過濾器,每個流量都會經過他,然后再匹配是否可進入當前應用進程去處理】,導致流量丟失
cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
-
使命令生效 若提示***不存在,執行 modprobe br_netfilter
-
時間同步:啟動chronyd系統服務
yum install ntpdate -y
ntpdate time.windows.com
2.安裝DOCKER(master、node節點都需執行)
-
安裝docker
下載docker鏡像
安裝必要的系統工具
yum install -y yum-utils device-mapper-persistent-data lvm2
添加軟件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
安裝docker
yum makecache fast
yum -y install docker-ce
重啟動docker,並設置開機自啟
systemctl enable docker && systemctl start docker
查看docker版本
docker --version
-
添加阿里雲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=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
3. 安裝KUBEADM,KUBELET和KUBECTL(master、node節點都需執行)
kubelet: 運行在cluster所有節點上,負責啟動POD和容器
kubeadm: 用於初始化cluster
kubectl: :kubectl是kubenetes命令行工具,通過kubectl可以部署和管理應用,查看各種資源,創建,刪除和更新組件
-
指定版本安裝
yum install -y kubelet-1.21.2 kubeadm-1.21.2 kubectl-1.21.2 systemctl enable kubelet
-
部署k8s初始化操作 (僅master節點執行 )
kubeadm init --kubernetes-version=1.21.2 --apiserver-advertise-address=10.254.253.10 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
kubernetes-version:要安裝的版本
pod-network-cidr:負載容器的子網網段
image-repository:指定鏡像倉庫(由於從阿里雲拉鏡像,解決了k8s.gcr.io鏡像拉不下來的問題)
apiserver-advertise-address:節點綁定的服務器ip(多網卡可以用這個參數指定ip)
v=6:用法是初始化過程顯示詳細內容 -
運行kebeadm init 初始化報錯 failed to pull image registry.aliyuncs.com/google_containers/coredns:v1.8.0
-
使用docker 命令拉去鏡像
docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0
-
使用的docker拉取的鏡像不符合k8s需要的命名,需要進行更改
-
重命名
docker tag registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns:v1.8.0
-
刪除原有鏡像
docker rmi registry.aliyuncs.com/google_containers/coredns:1.8.0
-
-
再次運行初始化命令
-
-
使用kubectl工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf
HOME/.kube/config sudo chown $(id -u):
(id -g) $HOME/.kube/config
查看啟動節點
kubectl get nodes
4. 安裝POD網絡插件( CNI )(master、node節點都需執行)
-
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml(需科學性上網拉取)
或在yaml文件的image屬性值改成國內 lizhenliang/flannel:v0.11.0-amd64 鏡像
或到 http://ip.tool.chinaz.com/ 查詢 raw.githubusercontent.com/coreos 的IP 地址
把查詢到的地址添加到 /etc/hosts做主機ip映射
-
安裝POD網絡插件報 The connection to the server localhost:8080 was refused - did you specify the right host or port?
需設置環境變量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
-
安裝flannel網絡創建報The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?
原因外網不能使用
解決辦法
# 在https://www.ipaddress.com/查詢raw.githubusercontent.com的真實IP。
vim /etc/hosts
185.199.108.133 raw.githubusercontent.com -
使用查看kube-flannel是否為running狀態
kubectl get pods -n kube-system
-
讓Node節點添加到master節點中
由master節點執行kubeadm init 生成的最后生成的token 復制到node節點
添加之前,先在node節點執行
kubeadm reset
命令例:kubeadm join 192.168.147.128:6443 --token rm1llx.6cuij6c60fhdfwd1 --discovery-token-ca-cert-hash sha256:62d9066bcbd7f0aa77e49a3d0b484d1640bf01ac8c2f99b1e0bc68839b24692d
-
重新生成token (master執行)
kubeadm token create --print-join-command
-
pod的kube-flannel-ds-*** 的STATUS為init:ImagePullBackOff
到https://github.com/flannel-io/flannel/releases 下載日志中缺少的flanneld的版本
-
通過xftp導入到docker中運行
例:docker pull flanneld-v0.14.0-amd64.docker
-
通過 kubectl get pods -n kube-system 查看pods狀態是否正常
測試K8S集群 (master執行)
在k8s集群中插件一個pod驗證是否正常
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort(type=NodePort 設置為外部暴露)
kubectl get pod,svc
通過查詢出來的端口配合node節點的ip在外部瀏覽器進行訪問 出現nginx的信息即可
部署 Dashboard(master執行)
Kubernetes Dashboard 是 k8s集群的⼀個 WEB UI管理⼯具
-
使用國外GitHub拉取Dashboard版本,github上有k8s版本對應的版本信息
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
-
修改Dashboard文件名
mv recommended.yaml kubernetes-dashboard.yaml
-
進入 kubernetes-dashboard.yaml 添加通信方式和對外暴露的端口
NodePort 服務是引導外部流量到你的服務的最原始方式,在節點上開放一個特定端口,任何發送到該端口的流量都被轉發到對應服務供外部訪問。
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort #需添加訪問方式
ports:
- port: 443
targetPort: 8443
nodePort: 31002 #需添加對外暴露的端口 -
重新生成dashboard
kubectl apply -f kubernetes-dashboard.yaml
-
查看pod,svc狀態:
kubectl get pod,svc -n kubernetes-dashboard
-
因為證書問題,解決k8s自簽名SSL驗證不通過的問題,以chrome為例
chrome://flags/#allow-insecure-localhost
And enable "Allow invalid certificates for resources loaded from localhost.
-
獲取token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep dashboard-admin|awk '{print $1}')|grep token:|awk '{print $2}'
-
創建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}') -
輸入生成tokan訪問dashboard