1.引言
k8s想必大家并不陌生,它可以方便我們進(jìn)行docker容器的集中管理和編排操作,減小運(yùn)維難度,提升服務(wù)質(zhì)量,本文就讓我們來(lái)一起看一下如何從零快速搭建k8s集群吧。
2.服務(wù)器硬件要求
在部署k8s集群之前,服務(wù)器需要滿足以下條件:
1.三臺(tái)虛擬機(jī)服務(wù)器(推薦使用vmware下載鏡像安裝),操作系統(tǒng)CentOS 7.x-86_x64。
2.硬盤最低配置:內(nèi)存2GB,CPU2核,硬盤30GB。
3.機(jī)器之間網(wǎng)絡(luò)互通。
4.可以訪問(wèn)外網(wǎng),需要拉取鏡像。
5.禁止swap分區(qū)。(kubernetes的想法是將實(shí)例緊密包裝到盡可能接近100%。 所有的部署應(yīng)該與CPU /內(nèi)存限制固定在一起。 所以如果調(diào)度程序發(fā)送一個(gè)pod到一臺(tái)機(jī)器,它不應(yīng)該使用交換。 設(shè)計(jì)者不想交換,因?yàn)樗鼤?huì)減慢速度,所以關(guān)閉swap主要是為了性能考慮)
3. 部署方式以及區(qū)別
目前部署k8s集群主要有兩種方式:
3.1.kubeadmin
kubeadm是一個(gè)k8s部署工具,提供kubeadmin init初始化集群和kubeadm join加入集群,用于快速部署k8s集群。
3.2.二進(jìn)制包
從GitHub下載發(fā)行版的二進(jìn)制包,手動(dòng)部署每個(gè)組件,組成k8s集群。
目前k8s的組件都是通過(guò)systemd來(lái)維護(hù)的,所以二進(jìn)制安裝,調(diào)試bug比較方便。
普遍性來(lái)講,使用kubeadm可以帶來(lái)標(biāo)準(zhǔn)化安裝的完整步驟。并且kubeadm已經(jīng)是一個(gè)開源項(xiàng)目,團(tuán)隊(duì)投入精力,后面產(chǎn)出都融入到這個(gè)項(xiàng)目中了。而二進(jìn)制安裝屬于優(yōu)化版本,自己維護(hù),自己使用。沒(méi)有社區(qū)的協(xié)作,之后的維護(hù)成本高于回報(bào)。如果沒(méi)有特別的要求,推薦直接使用kubeadm組件來(lái)搭建自己的安裝k8s的工具鏈。
4. 搭建k8s集群
4.1 準(zhǔn)備環(huán)境
k8s-master 192.168.40.136
k8s-node1 192.168.40.139
k8s-node2 192.168.40.140
節(jié)點(diǎn)ip根據(jù)自己的實(shí)際ip而定,虛擬機(jī)設(shè)置一下固定ip,避免重啟后ip發(fā)生變化!
4.2 系統(tǒng)初始化
關(guān)閉防火墻:
systemctl stop firewalld
禁止防火墻開機(jī)自啟:
systemctl disable firewalld
關(guān)閉selinux:
# 永久關(guān)閉(需重啟)
sed -i 's/enforcing/disabled/' /etc/selinux/config
reboot
#臨時(shí)關(guān)閉
setenforce 0
關(guān)閉swap分區(qū):
# 永久關(guān)閉(需重啟)
sed -ri 's/.*swap.*/#&/' /etc/fstab
reboot
#臨時(shí)關(guān)閉
swapoff -a
設(shè)置主機(jī)名:
# 在master上執(zhí)行
hostnamectl set-hostname k8s-master
# 在node1上執(zhí)行
hostnamectl set-hostname k8s-node1
# 在node2上執(zhí)行
hostnamectl set-hostname k8s-node2
在每個(gè)節(jié)點(diǎn)添加hosts:
# 改為自己實(shí)際ip
cat >> /etc/hosts << EOF
192.168.40.136 k8s-master
192.168.40.139 k8s-node1
192.168.40.140 k8s-node2
EOF
將橋接的IPv4流量傳遞到iptables的鏈:
在每個(gè)節(jié)點(diǎn)添加如下的命令:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# 加載br_netfilter模塊
modprobe br_netfilter
# 查看是否加載
lsmod | grep br_netfilter
# 生效
sysctl --system
在每個(gè)節(jié)點(diǎn)添加時(shí)間同步:
# 安裝ntpdate時(shí)間同步插件
yum install ntpdate -y
# 開啟時(shí)間同步
ntpdate time.windows.com
在每個(gè)節(jié)點(diǎn)安裝ipset和ipvsadm:
# 安裝
yum -y install ipset ipvsadm
# 配置
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
# 授權(quán)、運(yùn)行、檢查是否加載:
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
4.3 所有節(jié)點(diǎn)安裝Docker/kubeadm/kubelet/kubectl
k8s默認(rèn)CRI(容器運(yùn)行時(shí))為Docker,因此需要先安裝Docker!
所有節(jié)點(diǎn)安裝Docker:
# 獲取鏡像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 安裝
yum -y install docker-ce-18.06.3.ce-3.el7
# 設(shè)置開機(jī)自啟動(dòng)并啟動(dòng)
systemctl enable docker && systemctl start docker
# 查看版本
docker version
# 設(shè)置鏡像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
# 重載配置
sudo systemctl daemon-reload
# 重啟docker
sudo systemctl restart docker
# 添加阿里云的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
安裝kubeadm、kubelet和kubectl:
# 指定版本號(hào)安裝
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 為了實(shí)現(xiàn)Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,需要修改"/etc/sysconfig/kubelet"文件的內(nèi)容:
vim /etc/sysconfig/kubelet
# 修改
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
# 設(shè)置開機(jī)自啟動(dòng)
systemctl enable kubelet
4.4 部署k8s的Master節(jié)點(diǎn)
# 由于默認(rèn)拉取鏡像地址k8s.gcr.io國(guó)內(nèi)無(wú)法訪問(wèn),這里需要指定阿里云鏡像倉(cāng)庫(kù)地址
# 只在master執(zhí)行
kubeadm init \
# 此處填寫實(shí)際ip,其他地方不用動(dòng)
--apiserver-advertise-address=192.168.40.136 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 配置環(huán)境變量(只在master執(zhí)行)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.5 添加k8s的Node節(jié)點(diǎn)
# 在master節(jié)點(diǎn)獲取token:
kubeadm token create --print-join-command --ttl 0
# 在node1和node2添加如下的命令向k8s集群中添加Node節(jié)點(diǎn)(為上方命令返回的內(nèi)容,復(fù)制即可):
kubeadm join 192.168.40.136:6443 --token yruyio.n4hal2qdb5iweknf --discovery-token-ca-cert-hash sha256:0ac7ed632224e1e07cef223b1159d03b2231dfc0456817db7eaf3c8651eef49c
# 獲取所有節(jié)點(diǎn)(正??梢垣@取到master,node1和node2)
kubectl get nodes
4.6 部署CNI網(wǎng)絡(luò)插件
在master節(jié)點(diǎn)部署CNI網(wǎng)絡(luò)插件:
# 此鏈接被墻了,需要科學(xué)上網(wǎng)解決,或者在文末獲取相關(guān)資源
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
# 查看部署進(jìn)度(可能會(huì)出現(xiàn)鏡像拉取失敗的情況,耐心等待一會(huì)就好了)
kubectl get pods -n kube-system
查看集群健康狀態(tài):
kubectl get cs
kubectl cluster-info
至此,k8s集群基本搭建完畢!
5.測(cè)試kubernetes集群
在Kubernetes集群中創(chuàng)建一個(gè)pod,驗(yàn)證是否正常運(yùn)行,這里以nginx為例:
# 創(chuàng)建deployment
kubectl create deployment nginx --image=nginx
# 修改端口類型為nodePort供外界訪問(wèn) 編輯方式跟vim一樣
kubectl edit svc nginx
...
spec:
clusterIP: 10.106.212.113
externalTrafficPolicy: Cluster
ports:
# 外界暴露指定端口 32627(30000-32767)
- nodePort: 32627
# 容器暴露的端口
port: 80
protocol: TCP
# 集群內(nèi)訪問(wèn)的單口
targetPort: 80
selector:
app: nginx
sessionAffinity: None
# type改為NodePort
type: NodePort
...
訪問(wèn) http://192.168.40.136:32627:

至此,我們已經(jīng)成功部署了一個(gè)nginx的deployment,deployment控制對(duì)應(yīng)的pod的生命周期,service則對(duì)外提供相應(yīng)的服務(wù)。
6.部署 Dashboard
Dashboard是k8s的一套桌面管理應(yīng)用,通過(guò)Dashboard我們可以通過(guò)可視化的方式查看k8s集群的狀態(tài),執(zhí)行相關(guān)的操作,但沒(méi)有kubectl來(lái)的簡(jiǎn)單直接,了解一下即可。
首先需要下載kubernetes-dashboard.yaml,這個(gè)文件現(xiàn)在也被墻了,大家可以通過(guò)科學(xué)上網(wǎng)或者文末獲??!
在master執(zhí)行以下命令:
kubectl apply -f kubernetes-dashboard.yaml
# 開啟代理 ip寫自己實(shí)際ip
kubectl proxy --address=192.168.40.136 --disable-filter=true &
訪問(wèn)https://192.168.40.136:30001
谷歌訪問(wèn)可能會(huì)被禁止,可以通過(guò)以下操作解決:
mkdir key && cd key
#生成證書
openssl genrsa -out dashboard.key 2048
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=192.168.246.200'
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
#刪除原有的證書secret
kubectl delete secret kubernetes-dashboard-certs -n kube-system
#創(chuàng)建新的證書secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kube-system
#查看pod復(fù)制dashboard的pod名稱
kubectl get pod -n kube-system
#重啟pod(刪除會(huì)自動(dòng)重啟)
kubectl delete pod <pod name> -n kube-system
如下,通過(guò)令牌方式訪問(wèn):

獲取token:
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/cluster-admin/{print $1}')
復(fù)制,點(diǎn)擊登錄,稍等片刻即可:

結(jié)語(yǔ)
本文到這里就結(jié)束了,主要介紹了k8s集群的部署方式以及具體步驟,感興趣的朋友可以在本地虛擬機(jī)搭建一套,至于k8s中組件的作用以及使用方式,大家可以在網(wǎng)上自行查閱,在集群中執(zhí)行相關(guān)命令自行體會(huì)學(xué)習(xí),k8s在實(shí)際的生產(chǎn)中主要用于系統(tǒng)的自動(dòng)化部署,自動(dòng)擴(kuò)縮容等,幫助我們提升運(yùn)維效率,作為程序員我們也要熟悉其常用的命令以及原理,掌握到一定程度之后可以嘗試基于k8s開發(fā)一套自動(dòng)化運(yùn)維管理平臺(tái),可以擴(kuò)充我們的知識(shí)面,提升自己的技術(shù)水平!
注:關(guān)注公眾號(hào) 螺旋編程極客 發(fā)送 k8s 獲取相關(guān)yaml資源